VBA / Word: передача имени формы в качестве аргумента работает, но приводит к ошибке - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть несколько форм, и есть несколько строк кода, используемых для вызова и размещения каждой из них. Вместо того, чтобы реплицировать эти строки кода для каждой формы, я хочу использовать подпрограмму просто для загрузки и размещения формы. Этот код работает:

Sub LoadForm_BulletBeginningEmphasis()
Load formBulletBeginningEmphasis
formBulletBeginningEmphasis.Show
formBulletBeginningEmphasis.StartUpPosition = 0
formBulletBeginningEmphasis.Left = Application.Left + (0.5 * Application.Width) - (0.5 * formBulletBeginningEmphasis.Width)
formBulletBeginningEmphasis.Top = Application.Top + (0.5 * Application.Height) - (0.5 * formBulletBeginningEmphasis.Height)
End Sub

Тем не менее, я хочу, чтобы этот код работал:

Public Sub LoadAndShowForms(ByVal formName As Object)
Load formName
formName.Show
formName.StartUpPosition = 0
formName.Left = Application.Left + (0.5 * Application.Width) - (0.5 * formName.Width)
formName.Top = Application.Top + (0.5 * Application.Height) - (0.5 * formName.Height)
End Sub

Sub LoadForm_BulletBeginningEmphasis()
Call LoadAndShowForms(formBulletBeginningEmphasis)
End Sub

Проблема в том, что когда я выполняю второй набор строк кода, они работают и форма работает, но когда форма исчезает, VBA выдает ошибку: enter image description here

Что здесь происходит? Почему вторая версия работает, но выдает ошибку?

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Поместите метод Show после команд позиционирования.

Если подумать, это имеет смысл, поскольку выполнение кода приостанавливается, когда отображается модальная UserForm. Код, который выполняется после Show логически, не должен иметь никакого эффекта.

В зависимости от того, как пользовательская форма «исчезает», будет отображаться ошибка. Если есть код «позади» пользовательской формы, которая выгружает его, то «вызываемый» (пользовательская форма) больше не доступен. Если код скрывает только пользовательскую форму, то ошибка может не возникнуть (поскольку объект все еще загружен в память).

Это также имеет значение при вызове из другой процедуры: в первом примере кода вопроса вполне вероятно, что процедура просто завершается без вывода сообщений, даже если она не выполняет позиционирование формы. Во втором примере кода выполнение должно вернуть управление вызывающей процедуре, но не может, потому что вызываемая процедура не может завершиться правильно.

0 голосов
/ 09 сентября 2018

Я считаю, что ваша проблема в том, что вы передаете форму ByVal, и она должна быть ByRef. Public Sub LoadAndShowForms(ByRef formName as Object). Я также изменил бы Object на UserForm. Подпись вашего саба станет Public Sub LoadAndShowForms(ByRef formName as UserForm)

...