"Привязать" форму к ячейке
Модератор: Naeel Maqsudov
Что-то это мне напоминает контекстное меню, может добавить в него свои пункты.что бы форма была "привязана" (например к ячейке "А1")
Или нужна обязательно форма?
-
- Сообщения: 129
- Зарегистрирован: 21 июн 2005, 14:33
- Откуда: Крым, Феодосия
- Контактная информация:
.. не совсем -Что-то это мне напоминает контекстное меню, может добавить в него свои пункты.
Или нужна обязательно форма?

Дело в том, что мне надо спрашивать пользователя часто, но не хочется делать это через постоянное открывание формы.
В зависимости от действий пользователя, соответственно будет изменяться содержимое элементов на форме.
В общем то форма будет открыта всегда и надо, что бы она распологалась всегда в одном месте по отношению к листу -

Vstavj eto v Worksheets_Change
Код: Выделить всё
If TargetAddress ="$A$1" Then
UserForm1.Show
End if
Ser Artur
Prosti vot tak
Код: Выделить всё
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Address = "$A$1" Then
UserForm1.Show
End If
End Sub
Ser Artur
Ну, ничего себе! "Привязал" форму к ячейке!
:shock:
Кстати, у меня не получилось вывести форму по координатам X и Y ячейки... Челендж блин!
:shock:
Кстати, у меня не получилось вывести форму по координатам X и Y ячейки... Челендж блин!
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Не удивительно!
У UserForm при StartupPosition=0 координаты Left и Top показывают положение формы на экране (т.е. 0:0 - это верхний левый угол экрана и ось Y направлена ВНИЗ). Они естественно в пикселах.
Left и Top ячеек дают координаты:
1) внутри рабочей области документа (т.е. 0:0 это верхний левый угол A1) Т.е. эти кординаты могут оказаться далеко за экраном
2) не в пикселах, а в пунктах (как шрифт)
У UserForm при StartupPosition=0 координаты Left и Top показывают положение формы на экране (т.е. 0:0 - это верхний левый угол экрана и ось Y направлена ВНИЗ). Они естественно в пикселах.
Left и Top ячеек дают координаты:
1) внутри рабочей области документа (т.е. 0:0 это верхний левый угол A1) Т.е. эти кординаты могут оказаться далеко за экраном
2) не в пикселах, а в пунктах (как шрифт)
Дык это я понял ишо тогда, когда пытался "вычислить" координаты ячейки относительно экрана... безуспешно...
(пункты перевести в пикселы теоретически можно
.PointsToScreenPixelsY
только вот практически невозможно - возвращает "0" всегда???)
(пункты перевести в пикселы теоретически можно
.PointsToScreenPixelsY
только вот практически невозможно - возвращает "0" всегда???)
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
У меня нормальные значения возвращает, но от этого не легче
Код: Выделить всё
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Application.Caption = _
Target.Application.ActiveWindow.PointsToScreenPixelsY(Target.Top) & "-" & _
Target.Application.ActiveWindow.PointsToScreenPixelsX(Target.Left)
End Sub
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Эврика!!!
Вот привязка к координатам ячейки, где было кликнуто правой кнопкой.
Тут сначала вычисляется размер области, занимаемой тулбарами (DX,DY)
Ну а дальше дело техники:
1) минус .VisibleRange.Top\Left - убирает то что получилось в результате прокрутки листа
2) * .Zoom / 100 - учитывает масштаб листа (как оказалось это тоже надо учитывать)
3) и прибавить сдвиг самого окна, а затем размеры тулбаров
Надо конечно еще чуть-чуть добавить, так как от края окна до тулбаров есть еще толщина границы окна, но ее точное значение надо доставать функциями WinAPI (GetSystemMetrics, или что-то в этом роде, но это уже мелочи - можно пренебречь)
Вот привязка к координатам ячейки, где было кликнуто правой кнопкой.
Код: Выделить всё
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
Ну а дальше дело техники:
1) минус .VisibleRange.Top\Left - убирает то что получилось в результате прокрутки листа
2) * .Zoom / 100 - учитывает масштаб листа (как оказалось это тоже надо учитывать)
3) и прибавить сдвиг самого окна, а затем размеры тулбаров
Надо конечно еще чуть-чуть добавить, так как от края окна до тулбаров есть еще толщина границы окна, но ее точное значение надо доставать функциями WinAPI (GetSystemMetrics, или что-то в этом роде, но это уже мелочи - можно пренебречь)