Страница 1 из 2
"Привязать" форму к ячейке
Добавлено: 11 апр 2006, 12:44
sergvk
Мне необходимо открывать форму и при открытии задать ее положение в окне Excel, причем так, что бы форма была "привязана" (например к ячейке "А1") :lol: Возможно ли это сделать?
Добавлено: 12 апр 2006, 02:10
Avsha
что бы форма была "привязана" (например к ячейке "А1")
Что-то это мне напоминает контекстное меню, может добавить в него свои пункты.
Или нужна обязательно форма?
Добавлено: 14 апр 2006, 17:25
sergvk
Что-то это мне напоминает контекстное меню, может добавить в него свои пункты.
Или нужна обязательно форма?
.. не совсем -

( Мне надо открыть форму при активации листа в районе, например, Range("A1:C4")
Дело в том, что мне надо спрашивать пользователя часто, но не хочется делать это через постоянное открывание формы.
В зависимости от действий пользователя, соответственно будет изменяться содержимое элементов на форме.
В общем то форма будет открыта всегда и надо, что бы она распологалась всегда в одном месте по отношению к листу -

)))
Добавлено: 15 апр 2006, 19:06
Ser Artur
Vstavj eto v Worksheets_Change
Код: Выделить всё
If TargetAddress ="$A$1" Then
UserForm1.Show
End if
Добавлено: 15 апр 2006, 19:09
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
Добавлено: 17 апр 2006, 13:53
Sokl
Ну, ничего себе! "Привязал" форму к ячейке!
:shock:
Кстати, у меня не получилось вывести форму по координатам X и Y ячейки... Челендж блин!
Добавлено: 18 апр 2006, 00:42
Naeel Maqsudov
Не удивительно!
У UserForm при StartupPosition=0 координаты Left и Top показывают положение формы на экране (т.е. 0:0 - это верхний левый угол экрана и ось Y направлена ВНИЗ). Они естественно в пикселах.
Left и Top ячеек дают координаты:
1) внутри рабочей области документа (т.е. 0:0 это верхний левый угол A1) Т.е. эти кординаты могут оказаться далеко за экраном
2) не в пикселах, а в пунктах (как шрифт)
Добавлено: 18 апр 2006, 11:50
Sokl
Дык это я понял ишо тогда, когда пытался "вычислить" координаты ячейки относительно экрана... безуспешно...
(пункты перевести в пикселы теоретически можно
.PointsToScreenPixelsY
только вот практически невозможно - возвращает "0" всегда???)
Добавлено: 18 апр 2006, 22:32
Naeel Maqsudov
У меня нормальные значения возвращает, но от этого не легче
Код: Выделить всё
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Application.Caption = _
Target.Application.ActiveWindow.PointsToScreenPixelsY(Target.Top) & "-" & _
Target.Application.ActiveWindow.PointsToScreenPixelsX(Target.Left)
End Sub
Добавлено: 18 апр 2006, 23:28
Naeel Maqsudov
Эврика!!!
Вот привязка к координатам ячейки, где было кликнуто правой кнопкой.
Код: Выделить всё
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, или что-то в этом роде, но это уже мелочи - можно пренебречь)