如何将UserForm中的布尔值传递给Sub?

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.我必须遗漏一些简单的东西,但我不确定是什么.任何想法,任何人?

谢谢!

Mat*_*don 8

看起来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 = TrueMe.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)

所以...不确定你想要达到的目标,但是你会想要这些东西.