Раньше уже рассматривали подобный вопрос: http://www.planetaexcel.ru/forum.php?thread_id=9786, но то что предложил ZVI не совсем то, потому что фактически привязка идет к курсору. В итоге, если идет работа с ячейками, а курсор находится в это время в другом месте экрана, то форма выскакивает не там где нужно.
{quote}{login=EducatedFool}{date=01.12.2009 11:48}{thema=}{post}Про вывод UserForm в определенном месте экрана с привязкой к координатам ячеек можно ещё почитать здесь:
{quote}{login=Валерий}{date=01.12.2009 12:10}{thema=Re: }{post} а как сделать чтобы привязка осуществлялась к ячейке без указания на нее курсором?{/post}{/quote}А как эксель должен узнать об этой ячейке? Силой мысли? И можно ли понятнее расписать: "идет работа с ячейками, а курсор находится в это время в другом месте экрана, то форма выскакивает не там где нужно"
{quote}{login=Лузер™}{date=01.12.2009 01:58}{thema=Re: Re: }{post}{quote}{login=Валерий}{date=01.12.2009 12:10}{thema=Re: }{post} а как сделать чтобы привязка осуществлялась к ячейке без указания на нее курсором?{/post}{/quote}А как эксель должен узнать об этой ячейке? Силой мысли? И можно ли понятнее расписать: "идет работа с ячейками, а курсор находится в это время в другом месте экрана, то форма выскакивает не там где нужно"{/post}{/quote}
Действительно, нужно было уточнить. Я имел ввиду указатель мыши. К примеру, я заполняю таблицу не выделяя ячейки мышкой, а переходя от одной к другой стрелками на клавиатуре. Указатель мыши в это время находится хрен знает где. В приведенных примерах форма привязана к координатам курсора мышиного и выскакивает рядом с ним.
В этом примере форма привязана к событию Workbook_SheetBeforeDoubleClick - т.е. ПередДвойнымКликомМышки. Если "Указатель мыши в это время находится хрен знает где", то как Вы вызываете календарь? Даблкликом "хрен знает где"?
{quote}{login=Лузер™}{date=01.12.2009 02:47}{thema=}{post}В этом примере форма привязана к событию Workbook_SheetBeforeDoubleClick - т.е. ПередДвойнымКликомМышки. Если "Указатель мыши в это время находится хрен знает где", то как Вы вызываете календарь? Даблкликом "хрен знает где"?{/post}{/quote}
Видимо, я не совсем ясно выражаюсь. Мне необходимо, чтобы форма появлялась под ячейкой по событию Worksheet_Change. Неважно, появится она там по даблклику, райтклику, либо вообще без клика, но по событию и под ячейкой (что-то наподобии раскрывающегося списка по Alt+ стрелка вниз). В примерах, которые Вы могли видеть, привязка осуществлена, насколько я понимаю, к указателю мыши.
Конечно не совсем ясно: "Неважно, появится она там по даблклику, райтклику, либо вообще без клика, но по событию и под ячейкой". Это всё разные события. Если же всё же Вам нужно по событию Worksheet_Change, то кто Вам мешает код, ссылку на который Вам EducatedFool, применить к нужному событию? Private Sub Worksheet_Change(ByVal Target As Range) Cancel = True Dim b As CommandBar dx = 0: dy = 0 For Each b In Application.CommandBars If b.Visible Then Select Case b.Position Case msoBarLeft: dx = dx + b.Width Case msoBarMenuBar, msoBarTop: dy = dy + b.Height End Select End If Next With Target.Application.ActiveWindow UserForm1.Left = (Target.Left - .VisibleRange.Left) * .Zoom / 100 + .Application.Left + dx UserForm1.Top = (Target.Top - .VisibleRange.Top) * .Zoom / 100 + .Application.Top + dy UserForm1.Show End With End Sub
{quote}{login=Юрий М}{date=01.12.2009 08:59}{thema=}{post}Конечно не совсем ясно: "Неважно, появится она там по даблклику, райтклику, либо вообще без клика, но по событию и под ячейкой". Это всё разные события. Если же всё же Вам нужно по событию Worksheet_Change, то кто Вам мешает код, ссылку на который Вам EducatedFool, применить к нужному событию? Private Sub Worksheet_Change(ByVal Target As Range) Cancel = True Dim b As CommandBar dx = 0: dy = 0 For Each b In Application.CommandBars If b.Visible Then Select Case b.Position Case msoBarLeft: dx = dx + b.Width Case msoBarMenuBar, msoBarTop: dy = dy + b.Height End Select End If Next With Target.Application.ActiveWindow UserForm1.Left = (Target.Left - .VisibleRange.Left) * .Zoom / 100 + .Application.Left + dx UserForm1.Top = (Target.Top - .VisibleRange.Top) * .Zoom / 100 + .Application.Top + dy UserForm1.Show End With End Sub{/post}{/quote}
Спасибо за пример. Наиболее точного позиционирования получилось достичь при помощи OLEObject. Пожалуй, остановлюсь на нем.