Excel Userform Run-Time Ошибка при попытке запустить второй раз после начального «Отмена» или закрыть красным «Х» - PullRequest
0 голосов
/ 05 февраля 2019

Проблема: я создаю пользовательскую форму с кнопками «Отправить» и «Отмена».Я хочу, чтобы вся форма очищала введенные данные и закрывала форму, если пользователь нажимает кнопку «Отмена», но я также пытаюсь встроить ту же функциональность, если пользователь нажимает красную «X» в верхнем правом углу.Мне неясно, где мне нужно выгрузить форму.В настоящее время он размещен в методе btnCancel_Click(), и я могу запустить форму, ввести некоторые данные и нажать «Отмена», после чего форма закроется.

Но когда я пытаюсь повторно запустить форму во 2-й раз, я получаю сообщение об ошибке (я приложил изображение этого сообщения), которое говорит

«Ошибка времени выполнения» -2177418105 (80010007): Ошибка автоматизации - Callee (сервер [не серверное приложение]) недоступен и пропал; все соединения недействительны. Возможно, вызов выполнен.

Если удалить Unload Meс btnCancel_Click() тогда форма может закрываться и снова открываться очень хорошо, но любые данные, которые я ввел в первый раз, все еще будут в форме и не будут очищены должным образом. Мне интересно, если это ошибка Unload Me илимне нужно сбросить все элементы управления формой при инициализации формы?

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
  ' how was the form closed?
  ' vbFormControlMenu = X in corner of title bar
  If CloseMode = vbFormControlMenu Then
    ' cancel normal X button behavior
    Cancel = True        
    ' run code for click of Cancel button
    btnCancel_Click
  End If
End Sub
'******************************************************************
Private Sub btnCancel_Click()
    mbCancel = True
    Me.Hide
    Unload Me

End Sub
'*********************************************************************
Private Sub UserForm_Initialize()
'Populate values for 2 combo boxes
lastEmp = Sheets("Form_Ref").Cells(Rows.Count, 1).End(xlUp).Row
Me.cmbBoxEmpName.List = Sheets("Form_Ref").Range("A2:A" & lastEmp).Value

lastBld = Sheets("Form_Ref").Cells(Rows.Count, 2).End(xlUp).Row
Me.cmbBoxBuildingName.List = Sheets("Form_Ref").Range("B2:B" & lastBld).Value

End Sub
'******************************************************************
Public form As New CheckOutForm
Sub testFormOptions()
'Button pressed within Excel will start program and show the userform
form.Show

End Sub

enter image description here

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Если вы выполните Unload, вы уничтожите объект формы.Другими словами, ваша (глобальная) переменная form становится недействительной, и если вы запускаете новую form.show, вы получаете ошибку времени выполнения.
Когда, с другой стороны, вы просто unhide форма, форма-объект остается действительным (в данный момент он просто не виден), и все элементы управления сохраняют свое значение.

Либо вы выполняете некоторую служебную работу, сбрасывая все элементы управления при отображении формы (используйте UserForm_Activate -event), либо вынеобходимо создавать новый объект формы каждый раз, когда вы хотите отобразить его (я настоятельно советую не использовать имя form в качестве имени переменной, чтобы избежать путаницы).

Sub testFormOptions()
    dim myForm as CheckOutForm
    myForm.Show
End Sub
0 голосов
/ 05 февраля 2019

Это самое простое и грязное решение :

Удалите Public form As New CheckOutForm из кода.Затем добавьте его в testFormOptions():

Sub testFormOptions()
    Dim form As New CheckOutForm
    form.Show
End Sub

Некоторые не очень хорошие книги / учебники по VBA даже выглядят немного так, но это жестоко:

Sub testFormOptions()
    CheckOutForm.Show
End Sub

В любом случае, теперь проблема с предопределенными значениями в форме решена.


Для чистого и не очень простого решения рассмотрите возможность написания MVC-структуры вокруг формы:

...