Страницы: 1 2 След.
RSS
Позиционирование формы рядом с ячейкой
 
Все привет! Столкнулся с непонятной (мне) ситуацией: на листе закреплены 4 первые строки, пытаюсь позиционировать форму рядом с ячейкой В2 и наблюдаю странное поведение:
1. При загрузке формы из редактора, если активная ячейка находится в пределах этих закреплённых строк, то форма отображается в нужном месте.
2. При загрузке из редактора, если активная ячейка расположена ниже, то форма отображается в области ленты.
3. Если загружаю форму при помощи кнопки, то, вне зависимости от того, где находится активная ячейка, форма отображается в области ленты.
Кто знает причину и как это победить? :)
 
А если активная ячейка скрыта (под прокруткой), файл зависает - форма тоже спрятана!
 
Вить, на этом пока не заостряем внимание )
 
Вот какая связь между активной ячейкой и позицией формы?
 
Без строки с UserForm1.Top форма возле нужной ячейки
 
Точно? У меня правее В5.
 
Рядом... Это и правее в том числе. Но не на ленте и не скрывается под прокруткой
 
Юрий, а если прибавить Application.Height - Application.UsableHeight ?
По вопросам из тем форума, личку не читаю.
 
Вить, мне нужно именно В2 )
Миша, не пробовал, но если активное окно - новая книга (без закреплённой области), то ведь проблема не возникает...
 
Юрий, мне кажется смещение при закреплении шапки идет именно на размер этой шапки и как не странно прибавка её убирает. Скажем так, добавил в ваш код и все работает.
По вопросам из тем форума, личку не читаю.
 
Юрий М, из-за етого критерия.
не знаю что он делает . Сейчас гляну
Но он у вас при каждом варианте разный
Код
tmp = .PointsToScreenPixelsY(0)
 
Ну а почему тогда из редактора нормально? Правда, при "нужном" адресе активной ячейки. Какая связь?
 
Цитата
Юрий М написал:  мне нужно именно В2 )
Я лишь обратил внимание, что проблема, возможно, в этой строке.
 
Юрий М, тут

такое впечатление, что разние значение веса пикселя
активного окна
Изменено: ivanok_v2 - 08.11.2018 15:26:23
 
ivanok_v2, но ведь окно неизменно...
 
Цитата
Юрий М написал:
но ведь окно неизменно...
проверил так. проблема осталась
Код
 With Windows(ThisWorkbook.Name)
 
Цитата
БМВ написал:
добавил в ваш код и все работает
Миша, куда добавил - UserForm1.Top? У меня лишь немного ниже стало...
 
Юрий, уж больно сильно .PointsToScreenPixelsY(0)  отличается.
По вопросам из тем форума, личку не читаю.
 
Юрий М,
методом експерементов и научного тика установлено, что
Код
tmp = .PointsToScreenPixelsY(0)
изменяется при скрытии/ракрытии ленты файла  ThisWorkbook.Name

ИМХО: соотвественно, расчет идет от края ленты окна, из которого была сделана инициализация формы.
не зависимо от Windows(ThisWorkbook.Name)
ИМХО: етот параметр унаследован от редактора VBE
Изменено: ivanok_v2 - 08.11.2018 15:54:07
 
Цитата
ivanok_v2 написал:
изменяется при скрытии/ракрытии ленты
Ленты? Так ведь её никто не скрывает...
 
Юрий М, я запускал из кнопки и смотрел на значение переменной.
и при изменении ленты, значение тоже меняется, соотвественно, этот параметр зависит от ленты
Изменено: ivanok_v2 - 08.11.2018 16:04:25
 
Таракана пустили на пол. Крикнули. Бежит.
Таракану оторвали все лапы. Крикнули. Не ползет. Вывод: уши где-то в лапах :)

Размер ленты не меняем, меняем ширину поля для ввода формулы. Форма, когда находится не на фоне листа, нижним краем "приклеена" к первой "строке" с группировкой столбца.
 
Цитата
ivanok_v2 написал:
этот параметр зависит от ленты
Не спорю, но я ведь не скрываю ленту...
 
Коллеги, прошу извинить: не смогу следить за обсуждением. Нужно исчезнуть. Зайду вечером.
 
у А1 координаты 0;0
.PointsToScreenPixelsY - определет № строки пикселей монитора, в которой эта точка находится
скрытие ленты перемещает точку начала координат (визуально вверх) относительно координат монитора
- переместите окно приложения выше ниже по монитору,
- измените разрешение монитора
вызывайте .PointsToScreenPixelsY и будете получите все новые и новые кординаты на мониторе для одной и той же ячейки листа Excel
окна Windows позиционируются относительно координат монитора и окно формы в этом случае ничем не отличается от окна Excel или окна другого приложения
Изменено: Ігор Гончаренко - 08.11.2018 16:19:30
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, да но вопрос был в другом. Почему разное значение, при инициализации формы из редактора и кнопки?
 
Опять про ленту ))
 
У меня проблема ушла так. Если у кого-то осталась, прошу отписаться
Код
Private Sub UserForm_Activate()
    With ActiveWindow
        UserForm1.Top = (Range("B2").Top + Range("B2").Height) * .Zoom / 100 + .ActivePane.PointsToScreenPixelsY(0) * Application.InchesToPoints(1) * 15 / 1440 - Range("B2").Height
        UserForm1.Left = Range("B2").Left * .Zoom / 100 + .ActivePane.PointsToScreenPixelsX(0) * Application.InchesToPoints(1) * 15 / 1440 + Range("B2").Width
        If (UserForm1.Top + UserForm1.Height) > (.Application.Height + .Application.Top) Then UserForm1.Top = UserForm1.Top - UserForm1.Height - Range("B2").Height * .Zoom / 100
        If (UserForm1.Left + UserForm1.Width) > (.Application.Width + .Application.Left) Then UserForm1.Left = UserForm1.Left - UserForm1.Width
    End With
End Sub
Изменено: ivanok_v2 - 08.11.2018 19:39:52
 
За ActivePane спасибо! Сработало. Не знал, что нужно учитывать закреплённую область.
Но "непонятка" осталась: причём тут адрес активной ячейки (при запуске из редактора)?
P.S. Две последние строки с проверками в моём случае не нужны - просто брал готовую заготовку ))
 
Цитата
Юрий М написал:
активной ячейки
об ячейке речь не идет,
привязка идет окну.
оч.хорошо описал Ігор Гончаренко  в #25
Изменено: ivanok_v2 - 08.11.2018 19:07:16
Страницы: 1 2 След.
Наверх