Задача: вывод UserForm в определенном месте экрана с привязкой к координатам ячеек.
Пример: Привязка к координатам ячейки, где было кликнуто правой кнопкой.
У UserForm1 свойство StartUpPosition должно быть = 0 (Manual)
Код: Выделить всё
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
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
Тут сначала вычисляется размер области, занимаемой тулбарами (DX,DY)
Ну а дальше дело техники:
1) минус .VisibleRange.Top\Left - убирает то что получилось в результате прокрутки листа
2) * .Zoom / 100 - учитывает масштаб листа (как оказалось это тоже надо учитывать)
3) и прибавить сдвиг самого окна, а затем размеры тулбаров
Надо конечно еще чуть-чуть добавить, так как от края окна до тулбаров есть еще толщина границы окна, но ее точное значение надо доставать функциями WinAPI (GetSystemMetrics, или что-то в этом роде, но это уже мелочи - можно пренебречь)