【发布时间】:2020-08-25 23:39:02
【问题描述】:
在显示另一个之前尝试Unload Useforms,我遇到了一个奇怪的问题。
我的工作表是由大师UserForm组成的,叫UFMainMenu,可以调用别人。当主控调用用户窗体时,它会在主用户窗体代码中使用类似这样的内容进行隐藏:
Private Sub BtnSupprimerValeur_Click()
Me.Hide
UFSupInstanceParametre.Show
End Sub
这按预期工作,并打开UFSupInstanceParametre
在UFSupInstanceParametre 内部,如果用户关闭它,代码Unload UFSupInstanceParametre 并启动我的主人UserForm:
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = vbFormControlMenu Then
Unload Me
Call mainMenu
End If
End Sub
mainMenu 就是这个简单的子菜单:
Sub mainMenu()
Application.ScreenUpdating = True
Dim objLoop As Object
'The following loop is just for me to see if previous userform was indeed unloaded, and if not it unloads it again
For Each objLoop In VBA.UserForms
If objLoop.Name <> "UFMainMenu" Then
Unload objLoop
End If
Next objLoop
UFMainMenu.Show
End Sub
问题是:
-UFSupInstanceParametre 中的Unload Me 并没有真正卸载UFSupInstanceParametre,因为它仍然出现在屏幕上。
- 在 mainMenu 的 For 循环内,当逐步运行时,我看到 UFSupInstanceParametre 没有被卸载,我确认代码然后运行 Unload objLoop 行,无论如何都应该卸载它。它没有,UFSupInstanceParametre 仍在屏幕上。为了 100% 确定它没有被卸载,我尝试第二次运行 For 循环,它再次发现 UFSupInstanceParametre 仍然加载,并再次尝试使用 Unload objLoop 行卸载它,但没有成功。
-代码不会抛出错误,它只是不会卸载任何用户表单。
- 代码尝试在 mainMenu 中卸载其他用户表单后按预期启动主用户表单,但另一个用户表单仍然可见。
我不得不承认我对这个有点迷失了,我知道我只缺少一个关于 UserForms 的简单属性,但我找不到它。
有什么想法吗?
【问题讨论】:
-
您真的需要卸载表单吗?您是否了解后果(破坏对象,立即重新创建的默认实例的问题......)?尝试将表单设置为隐藏(
Me.Hide或objLoop.Hide)。并阅读rubberduckvba.wordpress.com/2017/10/25/userform1-show -
我需要卸载它,是的,因为它们需要使用更新的数据和条件重新初始化,所以只需隐藏它并再次显示它就会让它看起来回到以前的状态,我不能这样。我可以使用隐藏和显示,并在取消隐藏时将用户窗体重置为其原始状态,但在我的情况下,卸载它并从头开始会更有效
-
我必须补充一点,从主用户表单启动的每个用户表单并不打算一次又一次地启动,但仅在某些情况下用户可能想要重新执行操作。我对将它们保存在内存中没有太大兴趣
-
Unload Me总是一个可怕的想法——你在其代码仍在运行时销毁一个对象。你确定你总是看到同一个实例吗?我假设你每次都看到新创建的默认实例。无论如何,为什么不将填写表单的代码移动到一个 sub 并从Activate而不是Initialize.event 调用它?不是在谈论数据由控制器而不是视图控制的 MVC 系统 -
我会尝试,但是关于 Unload Me,我在看到
ForLoop 无法卸载每个 UF 后添加了这些,以检查它是否可以工作。我会选择Activate事件,即使这意味着添加的代码比我预期的要多,因为它必须让 UF 从其界面中清除一些东西。尽管如此,我还是觉得这样做有点想躲避问题,我真的不明白为什么它不会卸载它们。