Почему моя форма все еще в памяти - PullRequest
0 голосов
/ 28 мая 2018

У меня есть следующий код, открывающий форму и затем выполняющий некоторые действия.

Sub lag_ny_a3()
    Dim frm As ufNyA3

    Set frm = New ufNyA3
    frm.Show

    If Not frm Is Nothing Then
        MsgBox("Doing stuff")
        Unload frm
    End If
End Sub

Тогда у меня есть следующий код в моей форме

Private Sub cmdAvbryt_Click()
    Unload Me
End Sub

Однако, даже если cmdAvbrytКнопка нажимается в форме, первый фрагмент кода входит в оператор if, как будто форма не выгружена.Почему это так, и как я могу предотвратить выполнение кода в операторе if, если нажата кнопка cmdAvbryt?

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Даже если ваша переменная frm не Nothing, форма выгружается.Добавьте небольшой чек до и после frm.Show:

Debug.Print VBA.UserForms.Count
frm.Show
Debug.Print VBA.UserForms.Count

, и вы увидите, что его нет в списке загруженных форм.Если вы установите переменную объекта на Nothing, она не будет выполнять "Делать вещи"

0 голосов
/ 28 мая 2018

На самом деле, frm, объявленный как ufNyA3, не станет Nothing после выгрузки пользовательской формы.Попробуйте использовать следующую функцию IsUserFormLoaded(), чтобы проверить, загружена ли пользовательская форма:

Sub lag_ny_a3()

    Dim frm As ufNyA3

    Set frm = New ufNyA3
    frm.Show

    If IsUserFormLoaded("ufNyA3") Then
        MsgBox ("Doing stuff")
        Unload frm
    Else
        MsgBox ("Unloaded")
    End If

End Sub

Function IsUserFormLoaded(UserFormName As String) As Boolean

    Dim frm

    For Each frm In UserForms
        IsUserFormLoaded = LCase(frm.Name) = LCase(UserFormName)
        If IsUserFormLoaded Then Exit For
    Next

End Function
...