ryg*_*y72 2 excel vba excel-vba
如果有人点击右上角的红色x,我试图关闭UserForm.到目前为止,这是我的代码.
Public Sub Worksheet_BeforeDoubleClick(ByVal target As Range, Cancel As Boolean)
If target.Column = 10 Then
UserForm2.Show
etc...
Run Code Online (Sandbox Code Playgroud)
现在,表单打开,我运行此代码...
Public Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = vbFormControlMenu Then
If Not ExitAsk = vbYes Then Cancel = True
End If
End Sub
Public Function ExitAsk() As VbMsgBoxResult
Dim Smsg As String
Smsg = "Are you really want to exit? Click Yes to terminate or No to Continue."
ExitAsk = MsgBox(Smsg, vbYesNo + vbDefaultButton2 + vbQuestion, "Exit!")
End Function
Run Code Online (Sandbox Code Playgroud)
然后,焦点返回到Sub,代码继续贯穿所有内容,这会给我带来一些问题.我想单击红色x并关闭UserForm并退出Sub.看起来Sub和UserForm不通信,即使两者都被声明为Public.我必须遗漏一些简单的东西,但我不确定是什么.任何想法,任何人?
谢谢!
看起来Sub和UserForm不通信,即使两者都被声明为Public
可访问性与过程是否与表单通信无关.表单是一个对象,与a Range或a 没有太大区别Collection- 除了它有一个设计器和一个默认实例:它不会与你的程序"通信"而你没有告诉它如何做到这一点.
首先,停止使用默认实例并像处理任何其他对象一样处理表单:New它!
With New UserForm2 'object instance starts existing here...
.Show 'vbModal is implicit
End With '...and dies here
Run Code Online (Sandbox Code Playgroud)
现在如果你想调用代码知道如何的形式被关闭了,你需要公开的东西调用代码可以访问知道.
这是最好的财产.您也可以公开一个公共字段,但是调用代码将能够篡改它并且您不希望这样 - 这就是封装的作用:
Private isCancelled As Boolean
Public Property Get Cancelled() As Boolean
Cancelled = isCancelled
End Property
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = vbFormControlMenu Then
isCancelled = True
End If
Cancel = True
Me.Hide
End Sub
Run Code Online (Sandbox Code Playgroud)
注意Cancel = True和Me.Hide:在不取消关闭的情况下,对象立即被销毁并且您将失去其状态.所以你想要Hide的形式而不是卸载/销毁它.
只有表单的代码隐藏可以访问isCancelled,但调用代码可以读取Cancelled属性(但不能写入它).
With New UserForm2 'object instance starts existing here...
.Show vbModal 'execution in this procedure will resume after form is closed
If .Cancelled Then
'form was X'd out
End If
End With '...and dies here
Run Code Online (Sandbox Code Playgroud)
所以...不确定你想要达到的目标,但是你会想要这些东西.