【发布时间】:2019-07-23 15:12:15
【问题描述】:
我有一个关于用户表单实例的问题。
当通过模块中的对象(例如 set frm = new Userform2)构建用户表单时,即使子程序一直运行到最后,我也可以隐藏它并通过 show 方法恢复它吗?
假设:
- sub1 创建用户表单
- 在用户窗体中输入值
- 用 sub2 隐藏用户窗体
- 使用 show 方法通过 sub3 恢复用户表单的所有值
在模块级别或用户窗体代码上使用 show 和 hide 方法测试代码时,我遇到了非常奇怪的行为,但我最终得到的工作是在标准模块中使用全局变量和以下代码:
Global frm As UserForm2
Option Explicit
Sub sub1()
Set frm = New UserForm2
With frm
.Show vbModeless
End With
End Sub
Sub sub2()
With frm
.Hide
End With
End Sub
Sub sub3()
With frm
.Show vbModeless
End With
End Sub
人们常说应该避免使用全局变量。这里甚至可能吗?我错过了什么吗?
【问题讨论】:
-
奇怪的结果是什么?除了像
Public/Private f As UserForm1那样在模块级别声明变量之外,我会对其进行类似的编码,并且可能是显示部分的子项以确保一致的“显示”如果表单还检查了@987654325的存在性可能会更好@ 在打开时,所以如果从 F5 运行,并确保 sub2 和 3 有一个对象可以操作。 -
为什么你
.Hideing 在模块级别,而不是作为用户窗体的一部分?另外,如果您只是UserForm2.Show,则可以显示现有实例,而无需在任何时候创建New UserForm2 -
这是显示/隐藏用户窗体时必须阅读的内容:rubberduckvba.wordpress.com/2017/10/25/userform1-show
-
感谢 Ricardo Diaz 发布链接。我阅读了这篇文章,但我很难完全理解他更面向 oop 的方法。我把它存起来了,会重复几次。但正如他所写的那样,有时似乎会发生意外行为,具体取决于代码的结构