"Привязать" форму к ячейке

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

sergvk
Сообщения: 129
Зарегистрирован: 21 июн 2005, 14:33
Откуда: Крым, Феодосия
Контактная информация:

Мне необходимо открывать форму и при открытии задать ее положение в окне Excel, причем так, что бы форма была "привязана" (например к ячейке "А1") :lol: Возможно ли это сделать?
Avsha
Сообщения: 665
Зарегистрирован: 08 сен 2005, 13:47
Откуда: KZ

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

Что-то это мне напоминает контекстное меню, может добавить в него свои пункты.
Или нужна обязательно форма?
.. не совсем - :( ( Мне надо открыть форму при активации листа в районе, например, Range("A1:C4")
Дело в том, что мне надо спрашивать пользователя часто, но не хочется делать это через постоянное открывание формы.
В зависимости от действий пользователя, соответственно будет изменяться содержимое элементов на форме.
В общем то форма будет открыта всегда и надо, что бы она распологалась всегда в одном месте по отношению к листу - :) )))
Аватара пользователя
Ser Artur
Сообщения: 82
Зарегистрирован: 24 май 2005, 16:32

Vstavj eto v Worksheets_Change

Код: Выделить всё

If TargetAddress ="$A$1" Then
UserForm1.Show
End if
Ser Artur
Аватара пользователя
Ser Artur
Сообщения: 82
Зарегистрирован: 24 май 2005, 16:32

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
Sokl
Сообщения: 451
Зарегистрирован: 12 сен 2005, 08:52
Откуда: ОМ

Ну, ничего себе! "Привязал" форму к ячейке!
: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) не в пикселах, а в пунктах (как шрифт)
Sokl
Сообщения: 451
Зарегистрирован: 12 сен 2005, 08:52
Откуда: ОМ

Дык это я понял ишо тогда, когда пытался "вычислить" координаты ячейки относительно экрана... безуспешно...
(пункты перевести в пикселы теоретически можно
.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
Контактная информация:

Эврика!!!
Вот привязка к координатам ячейки, где было кликнуто правой кнопкой.

Код: Выделить всё

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, или что-то в этом роде, но это уже мелочи - можно пренебречь)
Ответить