介绍:
我知道-显示UserForms-最佳做法是
处理QueryClose用户窗体代码内(If CloseMode = vbFormControlMenu ...)
在Unload Me其中不执行任何操作,仅执行胆小的Me.Hide指令(在通过防止[x]参与并最终自我毁灭之后Cancel = True)
在[类别]代码中设置相关的变量/ [属性](例如.IsCancelled=True)
为了能够由调用代码卸载UF 。
有用的链接
出色的概述“ UserForm1.Show?” 可以在https://rubberduckvba.wordpress.com/2017/10/25/userform1-show/上找到, 也可以在许多示例性SO答案中找到(Mathieu Guindon又名Mat's Mug和RubberDuck)。
1)模态用户窗体的工作示例
据我了解-并且我确实尝试学习-,以下代码对于模态 UF 应该没问题:
情况1a) ..具有UF实例的局部变量,通常可以看到:
Public Sub ShowFormA
Dim ufA As UserForm1
Set ufA = New UserForm1
' show userform
ufA.Show ' equivalent to: ufA.Show vbModal
' handle data after user okay
If Not ufA.IsCancelled Then
' do something ...
End If
' >> object reference destroyed expressly (as seen in some examples)
unload ufA
End Sub
情况1b) ..没有局部变量,但使用了With New代码块:
' ----------------------------------------------------------
' >> no need to destruct object reference expressly,
' as it will be destroyed whenever exiting the with block
' ----------------------------------------------------------
With New UserForm1
.Show ' equivalent to: ufA.Show vbModal
' handle data after user okay
If Not .IsCancelled Then
' do something ...
End If
End With
2)问题
使用MODELESS UserForm实例会出现问题。
好的,with块方法(参见1b)应该足以对其进行x-it处理后销毁任何对象引用:
With New UserForm1
.Show vbModeless ' << show modeless uf
End With
如果我尝试,但是
a)获取有关可能的用户取消的信息以及
b)Unload如果在Show指令后使用局部变量(例如“ ufA”)进行了洗礼,则为表格,
正是出于表单的原因,所有代码行将立即执行:
代码显示表单,下一刻..
代码没有发现用户取消,因为没有时间进行任何用户操作,下一刻..
[如果用户表单使用本地变量,代码将卸载表单]
3)问题
我如何处理a)通过MODELESS表单的调用代码正确报告的UserForm取消,以及b)如果使用局部变量,则进行(必要吗?)卸载?