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