【问题标题】:Check if userform open检查用户窗体是否打开
【发布时间】:2018-11-06 21:22:55
【问题描述】:

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

由于程序每 8 秒调用一次,我想在最后检查用户窗体是否仍然加载/打开。

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

【问题讨论】:

    标签: vba excel userform


    【解决方案1】:

    你可以使用这样的函数:

    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”,它可以工作,但循环仍在继续。除了在我的代码中复制粘贴之外,我还需要在函数中进行哪些更改? (对不起,我的经验不足);最好的问候
    • @Lutscha 答案已编辑,最后一个代码块应该适合您
    • 到目前为止,我可以看到它通过了该函数,但即使没有打开任何内容,您的函数仍将 IsLoaded 函数设置为 true。这就是确切的一点,我想离开潜艇并结束我的循环。
    • @Lutscha 代码对我来说很好用。当用户窗体关闭时,它停止调用 NextPicture1() Sub。
    • @Lutscha,我遇到了同样的问题。但我意识到,我没有将表单名称作为字符串传递,即 IsLoaded("Onboarding_Projekt") ,而是像这样传递表单名称:IsLoaded(Onboarding_Projekt.name)。这里的问题是它必须初始化表单才能获取名称,这违背了目的!。改用字符串解决了这个问题。
    【解决方案2】:

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

    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
    

    【讨论】:

      【解决方案3】:

      我找到了一个有助于轻松识别它的字段:

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

      【讨论】:

      • 此代码将导致表单加载。这就是我们需要解决方法的原因。
      猜你喜欢
      • 1970-01-01
      • 2012-08-18
      • 2013-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 2017-12-29
      • 1970-01-01
      相关资源
      最近更新 更多