Vba 关闭任何打开的用户窗体

Vba 关闭任何打开的用户窗体,vba,excel,userform,Vba,Excel,Userform,经过仔细研究和反复思考,我得出结论,对于一个看似简单的问题,我没有答案 我有一个excel文档,其中有许多(20多个)用户表单。如果您按下一个按钮(该按钮不在userform中,而只是在excel工作表上)重新开始,它将关闭此时打开的任何userform 我尝试使用卸载我,但当没有任何打开的用户表单时,我当然会出错。 然后我尝试在错误恢复下一步添加,认为如果没有用户表单,它会跳过这一行,因此不会给出错误,只是继续我希望它做的事情。(打开一个新的用户表单) 它确实不再给我错误,但它也不会关闭任何打

经过仔细研究和反复思考,我得出结论,对于一个看似简单的问题,我没有答案

我有一个excel文档,其中有许多(20多个)用户表单。如果您按下一个按钮(该按钮不在userform中,而只是在excel工作表上)重新开始,它将关闭此时打开的任何userform

我尝试使用
卸载我
,但当没有任何打开的用户表单时,我当然会出错。 然后我尝试在错误恢复下一步添加
认为如果没有用户表单,它会跳过这一行,因此不会给出错误,只是继续我希望它做的事情。(打开一个新的用户表单)

它确实不再给我错误,但它也不会关闭任何打开的用户表单(当有一个打开时)

所以我在这里,希望这里有人能帮助我,因为我不知道该怎么办。我可以列出我想的所有用户表单,但我想应该可以更快、更自动地完成

更多信息:不可能同时打开多个userform我想创建的按钮会关闭所有的userforms(如果有),并引导用户返回主菜单

提前谢谢!
KawaRu

要卸载所有表单时,请尝试调用以下命令

Sub UnloadAllForms(Optional dummyVariable As Byte)
'Unloads all open user forms
    Dim i As Long
    For i = VBA.UserForms.Count - 1 To 0 Step -1
        Unload VBA.UserForms(i)
    Next
End Sub

如果要卸载所有表单,请尝试调用以下命令

Sub UnloadAllForms(Optional dummyVariable As Byte)
'Unloads all open user forms
    Dim i As Long
    For i = VBA.UserForms.Count - 1 To 0 Step -1
        Unload VBA.UserForms(i)
    Next
End Sub

这可能是我在过去5年中编写的最糟糕的代码,但它将关闭Excel中的任何呼吸表单(并将杀死任何变量等):

小心使用

  • End
    语句突然停止代码执行,而不调用
    Unload
    QueryUnload
    、或
    Terminate
    事件或任何其他Visual Basic代码

  • 您在窗体和类模块的卸载查询加载终止事件中放置的代码不会执行

  • 从类模块创建的对象被销毁,使用Open语句打开的文件被关闭,程序使用的内存被释放

  • 其他程序持有的对象引用无效

  • End
    语句提供了一种强制程序停止的方法。对于Visual Basic程序的正常终止,应卸载所有窗体

  • 只要没有其他程序持有对从公共类模块创建的对象的引用,并且没有代码执行,程序就会关闭


    • 这可能是我在过去5年中编写的最糟糕的代码,但它将关闭Excel中的任何呼吸表单(并将删除任何变量等):

      小心使用

      • End
        语句突然停止代码执行,而不调用
        Unload
        QueryUnload
        、或
        Terminate
        事件或任何其他Visual Basic代码

      • 您在窗体和类模块的卸载查询加载终止事件中放置的代码不会执行

      • 从类模块创建的对象被销毁,使用Open语句打开的文件被关闭,程序使用的内存被释放

      • 其他程序持有的对象引用无效

      • End
        语句提供了一种强制程序停止的方法。对于Visual Basic程序的正常终止,应卸载所有窗体

      • 只要没有其他程序持有对从公共类模块创建的对象的引用,并且没有代码执行,程序就会关闭


      问题在于它不想同时执行以下代码。所以这不是一个真正的解决方案,但无论如何,我不知道这一点,所以谢谢:)@KawaRu-你说的“不想要”是什么意思?我的意思是它真的在结尾处停止,而不继续其他代码。@KawaRu-这是
      end
      的概念。它停止并杀死任何东西。有时它很有用,就像用大锤敲碎核桃。它可以工作,但是没有可食用的胡桃。问题是它不想同时执行以下代码。所以这不是一个真正的解决方案,但无论如何,我不知道这一点,所以谢谢:)@KawaRu-你说的“不想要”是什么意思?我的意思是它真的在结尾处停止,而不继续其他代码。@KawaRu-这是
      end
      的概念。它停止并杀死任何东西。有时它很有用,就像用大锤敲碎核桃。它有效,但没有可食用的胡桃。谢谢你,它有效!这是否只计算打开的用户表单?从0开始?这就是为什么要执行
      VBA.UserForms.Count-1
      这只计算打开的用户表单,是的,第一个用户表单将是0谢谢!这是否只计算打开的用户表单?从0开始?这就是为什么要执行
      VBA.UserForms.Count-1
      这只计算打开的用户表单,是的,第一个用户表单将是0
      Unload Me
      将不起作用,因为
      Me
      仅在用户表单的代码模块的范围内。因此,工作表上的按钮无法调用
      Unload Me
      ,因为没有
      Me
      要卸载:D
      Unload Me
      将不起作用,因为
      Me
      仅在用户表单的代码模块范围内。因此,工作表上的按钮无法调用
      Unload Me
      ,因为没有
      Me
      可卸载:D