检查用户窗体是否打开

12

我运行一个重复执行的程序。当用户关闭用户窗体时,它应该停止。但是它一直在不停地运行。

由于程序每8秒钟调用一次自己,因此我想在结束时检查用户窗体是否仍然加载 / 打开。

Public Sub NextPicture1()
   PictureChange = Now + TimeValue("00:00:08")
   If Onboarding_Projekt.Visible = True Then
      Application.OnTime PictureChange, "NextPicture1"
   End If
End Sub
3个回答

21
您可以使用这样的函数:

您可以使用这样的函数:

Public Function IsLoaded(formName As String) As Boolean
Dim frm As Object
For Each frm In VBA.UserForms
    If frm.Name = formName Then
        IsLoaded = True
        Exit Function
    End If
Next frm
IsLoaded = False
End Function

使用方法:

If IsLoaded("Form_Test") Then
    'Do Something
End If

你的代码应该看起来像这样:

Public Sub NextPicture1()
   PictureChange = Now + TimeValue("00:00:08")
   If IsLoaded("Onboarding_Projekt") Then
      Application.OnTime PictureChange, "NextPicture1"
   End If
End Sub

Public Function IsLoaded(formName As String) As Boolean
    Dim frm As Object
    For Each frm In VBA.UserForms
        If frm.Name = formName Then
            IsLoaded = True
            Exit Function
        End If
    Next frm
    IsLoaded = False
End Function

我还在继续努力。我的问题是,我不太擅长函数,也不确定如何实现它。- 如果我使用您的第二部分,并将“Form_Test”更改为“Onboarding_Projekt”,它可以工作,但循环仍然继续。除了将其复制粘贴到我的代码中,我需要在函数中做哪些更改?(对于我的经验不足感到抱歉);最好的问候 - Mentos
@Lutscha 回答已编辑,最后的代码块应该对你有用。 - gizlmo
到目前为止,我可以看到它通过了该函数,但即使没有打开任何内容,您的函数仍会将IsLoaded函数设置为true。 这正是我想离开子程序并结束循环的确切点。 - Mentos
1
@Lutscha,这段代码对我来说运行良好。当用户窗体关闭时,它停止调用NextPicture1()子程序。 - gizlmo
2
@Lutscha,我也遇到了同样的问题。但是我意识到,与其将表单名称作为字符串传递,例如 IsLoaded("Onboarding_Projekt"),不如像这样传递表单名称:IsLoaded(Onboarding_Projekt.name)。这里的问题在于它必须初始化表单以获取名称,这就打败了初衷!使用字符串解决了这个问题。 - Joe

3
以下是一个版本,它显示它是否已加载和是否可见:

这里有一个版本,可以显示它是否已经被加载和是否可见:

Function Userform_Check( _
    form_name As String) _
        As Integer

    ' Returns:
    '   0 - Userform is not loaded
    '   1 - Loaded but not visible
    '   2 - Loaded and visible

    ' mUtilities.Userform_Check()

    Dim frm As Object

    Userform_Check = 0

    For Each frm In VBA.UserForms
        If frm.name = form_name Then
            Userform_Check = 1

            If frm.Visible Then Userform_Check = 2

            Exit For
        End If
    Next frm

' Function Userform_Check( _
    form_name As String) _
        As Integer
End Function

2
我找到了一个可以帮助轻松识别它的字段:

我发现了一个应该有所帮助的字段:

  If userform.Visible = True Then
      'do something
  End If

2
这段代码会导致表单加载。这就是为什么我们需要解决方法的原因。 - HackSlash
这对我非常有效,使用if userform.visible = false then userform.show。这样可以防止每次加载表单时都将其居中显示。 - Justin Doward

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接