VBA-正确销毁无模式UserForm实例

介绍:


我知道-显示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)如果使用局部变量,则进行(必要吗?)卸载?


慕婉清6462132
浏览 1015回答 3
3回答
打开App,查看更多内容
随时随地看视频慕课网APP