1

Тема: VBA. Как сохранить координаты пользовательской формы при закрытии.

В проекте VBA используется форма. Она появляется в заданной позиции согласно значению свойства StartUpPosition. Я хочу ее подвинуть (перетащить мышкой) и чтобы при следующем запуске ее положение определялось не StartUpPosition, а теми координатами, которые были в момент закрытия. Т.е. я хочу, чтобы форма появлялась в том месте, где она исчезла. Подскажите как получить эти координаты.

Мой шаблон/макросы для автоматической нумерации Word 2003, 2007, 2010 и т.д. (стили, названия, перекрестные ссылки, LISTNUM). Делюсь: http://vk.com/club_alex_bir

2

Re: VBA. Как сохранить координаты пользовательской формы при закрытии.

Положение формы задают ее свойства Left и Top.

Если просто скрыть форму (Me.Hide), то позиция сохранится.

Если же форма выгружается (Unload Me / закрыли документ с формой / закрыли Word), то параметры Left и Top надо где-то сохранять.

Макросы под заказ и готовый пакет - mtdmacro.ru

3

Re: VBA. Как сохранить координаты пользовательской формы при закрытии.

Вождь пишет:

Положение формы задают ее свойства Left и Top.
Если просто скрыть форму (Me.Hide), то позиция сохранится.
Если же форма выгружается (Unload Me / закрыли документ с формой / закрыли Word), то параметры Left и Top надо где-то сохранять.

Сохранить положение формы для последующих документов можно в шаблоне Normal, используя функцию создания переменных (Variable). Но при этом в событии UserForm_Initialize нужно будет ссылаться на свойство Variable с определенным именем, которое хранит положение формы относительно полей Left и Top.

4

Re: VBA. Как сохранить координаты пользовательской формы при закрытии.

aap77 пишет:

Сохранить положение формы...

Можно и прямо в самой форме править:

With ThisDocument.VBProject.VBComponents("Имя формы")
        .Properties("Left") = L
        .Properties("Top") = T
End With
ThisDocument.Save

Только нужен программный доступ к коду (см. настроки безопасности).

Макросы под заказ и готовый пакет - mtdmacro.ru

5

Re: VBA. Как сохранить координаты пользовательской формы при закрытии.

1) Вы не совсем то отвечаете. Вы не сказали самое главное: то, что операцию присвоения надо засунуть в обработчик события QueryClose.

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    X = Me.Left
    Y = Me.Top
End Sub

Далее координаты X, Y надо сохранить в статической переменной (Static) либо переменной Word (ActiveDocument.Variables). Я выбрал Static.

2) Но возникла еще одна нелепость, это не относится к сохранению положения формы. Сохраняя другие переменные в обработчике QueryClose, я обнаружил, что они не сохраняются из формы. Тогда я решил проверить значение с помощью MsgBox, и когда я ее вставил в программу, которая вызывает форму, у меня все стало работать. Это меня просто выбешивает - почему переменные не сохраняются, если я не проверяю их значение средствами отладки? А как только проверил, все начинает работать. Хотя MsgBox не совсем средство отладки, но можно его и так назвать, поскольку оно с переменными ничего не делает, так ведь? Или, может, MsgBox делает какие-то преобразования типов... Также, оказалось, можно вместо MsgBox воткнуть DoEvents (в конце программы, вызывающей форму), и тоже все начинает работать. Все это очень странно.

Я провел несколько десятков тестов, чтобы определить почему иногда переменные сохраняются, а иногда нет. И пока что думаю, что вставка DoEvents в самом конце процедуры - решает проблему. Время покажет...

Мой шаблон/макросы для автоматической нумерации Word 2003, 2007, 2010 и т.д. (стили, названия, перекрестные ссылки, LISTNUM). Делюсь: http://vk.com/club_alex_bir

6

Re: VBA. Как сохранить координаты пользовательской формы при закрытии.

Александр Б. пишет:

...в обработчик события QueryClose...

Да, это лучший вариант, и единственный smile В Terminate уже поздно.

Александр Б. пишет:

...Я выбрал Static...

Интересно даже, как это сделано?

Макросы под заказ и готовый пакет - mtdmacro.ru

7

Re: VBA. Как сохранить координаты пользовательской формы при закрытии.

Static я использую так:

1) Переменные X и Y, используемые в QueryClose - глобальные, определены сразу после Option Explicit в модуле.

2) Далее в модуле процедура, в которой определены статические переменные Xstat и Ystat. В этой процедуре вызывается форма, и в конце этой процедуры происходит присвоение Xstat=X, Ystat=Y.

Наверно, можно сделать умнее и не использовать глобальные X, Y, но тогда надо знать, как их передать и извлечь из формы. Я этого не умею.

Мой шаблон/макросы для автоматической нумерации Word 2003, 2007, 2010 и т.д. (стили, названия, перекрестные ссылки, LISTNUM). Делюсь: http://vk.com/club_alex_bir

8

Re: VBA. Как сохранить координаты пользовательской формы при закрытии.

Мой пример на базе Statiс, чуток по-другому:

Post's attachments

Память_Формы.doc 50 Кб, 24 скачиваний с 2014-02-27 

You don't have the permssions to download the attachments of this post.
Макросы под заказ и готовый пакет - mtdmacro.ru

9

Re: VBA. Как сохранить координаты пользовательской формы при закрытии.

Кстати, насчет DoEvents и MsgBox. Оказалось, они не при чем, просто я ошибся в коде. Перепутал статические переменные, в которые записывал параметры (либо еще что-то).

Мой шаблон/макросы для автоматической нумерации Word 2003, 2007, 2010 и т.д. (стили, названия, перекрестные ссылки, LISTNUM). Делюсь: http://vk.com/club_alex_bir