VBA- Проверьте, загружена ли конкретная пользовательская форма или нет - PullRequest
0 голосов
/ 15 октября 2018

Я хочу проверить, загружена ли пользовательская форма во время выполнения кода.Я пробовал несколько способов, никто не работает.Я помню, я делал это раньше, но я не могу вспомнить мой обходной путь.Любая идея?

Я нашел некоторые решения здесь и в других местах, они также не работали!

Проблемы в том, что…

  1. vba.userforms просто принимает номера индексов, а не строковые индексы,
  2. в цикле над пользовательскими формами, некоторые свойства, такие как name, недоступныпроверить!

Вот мои попытки:

Public Function IsFormVisible(FrmName As String) As Boolean
On Error GoTo errorH
    IsFormVisible = False
    Set Frm = UserForms(FrmName)
    If Not Frm Is Nothing Then IsFormVisible = True
    End Function
errorH:
    IsFormVisible = False
End Function

Public Function IsFormVisible(FrmName As String) As Boolean
Dim Frm As UserForm
On Error GoTo errorH
    IsFormVisible = False
    For Each Frm In VBA.UserForms
        If Frm.Name = FrmName Then
           IsFormVisible = True
           Exit Function
        End If
    Next
errorH:
    IsFormVisible = False
End Function

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Я думаю, что код для IsFormVisible просто пропускает одну строку кода, если вам действительно нужно проверить на видимость.

СОВЕТ Вопрос состоит в том, как справедливо указал Рори о том,Пользовательская форма загружена или нет.И на этот вопрос его ответ абсолютно верен.

Public Function IsFormVisibleA(FrmName As String) As Boolean
Dim Frm As Object
    On Error GoTo errorH
    IsFormVisibleA = False
    For Each Frm In VBA.UserForms
        If LCase$(Frm.Name) = LCase$(FrmName) Then
            If Frm.Visible Then
                IsFormVisibleA = True
                Exit Function
            End If
        End If
    Next
errorH:
    IsFormVisibleA = False
End Function

Вы можете проверить это так.Если вы загружаете только форму, не показывая ее, функция IsFormVisible вернет true, хотя форма не видна.

    Sub Testfrm()
    Dim Frm As frmMy

        Set Frm = New frmMy
'        Frm.Show vbModeless

        Debug.Print Frm.Name
        Debug.Print IsFormVisibleA("frmMy"), IsFormVisible("frmMy")


    End Sub
0 голосов
/ 15 октября 2018

Вот два простых варианта.Во-первых, вы можете объявить frm как Object:

Public Function IsFormVisible(FrmName As String) As Boolean
    Dim Frm As Object
On Error GoTo errorH
    IsFormVisible = False
    For Each Frm In VBA.UserForms
        If LCase$(Frm.Name) = LCase$(FrmName) Then
           IsFormVisible = True
           Exit Function
        End If
    Next
errorH:
    IsFormVisible = False
End Function

Или, во-вторых, вы можете использовать TypeName вместо .Name:

Public Function IsFormVisible(FrmName As String) As Boolean
    Dim Frm As UserForm
'On Error GoTo errorH
    IsFormVisible = False
    For Each Frm In VBA.UserForms
        If lcase$(TypeName(Frm)) = lcase$(FrmName) Then
           IsFormVisible = True
           Exit Function
        End If
    Next
errorH:
    IsFormVisible = False
End Function

Я сделалоба из них не чувствительны к регистру.

...