【问题标题】:Closing any open userform关闭任何打开的用户表单
【发布时间】:2018-02-02 17:39:46
【问题描述】:

经过仔细搜索和一些(过度)思考后,我得出结论,我无法回答看似简单的问题。

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

我尝试使用unload me,但是当没有任何打开的用户表单时,我当然得到了一个错误。 然后我尝试添加on error resume next,认为如果没有用户表单,它会跳过该行,因此不会给出错误,而是继续我想要它做的事情。 (打开一个新的用户表单)。

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

所以我在这里,希望有人可以帮助我,因为我不知道该怎么做。我可以列出我想的所有用户表单,但我想应该可以更快更自动地运行吗?

更多信息:不可能同时打开多个用户窗体。 // 我要创建的按钮会关闭所有用户表单(如果有)并引导用户返回主菜单。

提前致谢! 川流

【问题讨论】:

  • Unload Me 将不起作用,因为Me 仅在用户窗体的代码模块范围内中。所以工作表上的按钮不能调用Unload Me,因为没有Me 可以卸载:D

标签: vba excel userform


【解决方案1】:

当您想卸载所有表单时尝试调用以下命令

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

【讨论】:

  • 谢谢你的作品!这是否只计算打开的用户表单?从0开始?这就是你这样做的原因VBA.UserForms.Count - 1
  • 这仅计算打开的用户表单,是的,第一个用户表单将是 0
【解决方案2】:

希望这是我在过去 5 年中编写的最糟糕的代码,但它会关闭您在 Excel 中可能拥有的任何呼吸形式(并且会杀死任何变量等):

Public Sub CloseAll()
    End
End Sub

谨慎使用!

From the MSDN End Statement:

  • End 语句会突然停止代码执行,而不调用 UnloadQueryUnloadTerminate 事件或任何其他 Visual Basic 代码。

  • 您在表单和类模块的UnloadQueryUnloadTerminate 事件中放置的代码不会执行。

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

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

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

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

【讨论】:

  • 这样做的问题是它也不想执行下面的代码。所以这不是一个真正的解决方案,但无论如何,不​​知道这一点,所以谢谢你:)
  • @KawaRu - “不想要”是什么意思?
  • 我的意思是它真的在最后停止并且不会继续其他代码。
  • @KawaRu - 这是End 的想法。它停止并杀死任何东西。有时它是相当有用的。
  • 就像用大锤敲碎核桃一样。它有效,但没有可食用的核桃。
猜你喜欢
  • 1970-01-01
  • 2017-07-06
  • 2010-12-20
  • 1970-01-01
  • 2017-04-29
  • 2012-11-06
  • 2014-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多