Excel VBA Userform QueryClose:取消不起作用

时间:2015-12-30 05:14:56

标签: excel vba excel-vba

我已经编写了下面的代码,以便在关闭表单之前检查进程是否已完成。在卸载表单之前,此用户表单用作记分表,使range("A6")绿色表示传递,或range("B6")红色表示失败作为潜艇的最后一步。

到目前为止,我在网上查看的内容应该可行。在调试时,宏会一直到达Cancel = True的位置,读取该行,但表单仍会关闭。

为什么即使在读取线路时取消也没有注册?

Private Sub Userform_queryclose(CloseMode As Integer, Cancel As Integer)
Dim wbScoreCard As Workbook
Dim wsScoreCard As Worksheet
Dim MSG As String
Set wbScoreCard = Workbooks(NameBox.Value)
Set wsScoreCard = wbScoreCard.Worksheets(Format(Date, "MM.dd.yy") & " " & CallType.Caption)
If Err.Number = 0 Then
    If wsScoreCard.Range("A6").Interior.Color <> vbGreen Then
        If wsScoreCard.Range("B6").Interior.Color <> vbRed Then
            Beep
            MSG = MsgBox("This scorecard is not complete! If you close it now, this scorecard will not be saved. Continue?", vbYesNo, "Warning - Scorecard Incomplete")
            If MSG = vbYes Then
                wbScoreCard.Close savechanges:=False
                Exit Sub
            Else
                Cancel = True
                Exit Sub
            End If
        End If
    End If
End If
End Sub

1 个答案:

答案 0 :(得分:3)

一些事情:

  • 您没有关闭错误处理,因此Err.Number = 0检查无效;如果出现运行时错误,执行过程会直接跳出程序。

  • MSG应该是vbMsgBoxResult,而不是String。您的代码仅适用于从基础Integer值到您强制进入的String类型的隐式类型转换。

  • 除非您没有发布整个代码,否则Exit Sub在两个分支中都是多余的。

  • 可以使用更简单的代码重现问题:

    Private Sub Userform_queryclose(CloseMode As Integer, Cancel As Integer)
        Cancel = True
    End Sub
    

问题是你编写了这个签名或以某种方式从内存中输入了它。这是QueryClose处理程序的签名:

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

注意参数的排序

您可以通过将CloseMode设置为True而不是Cancel来获得预期的行为...但更好的解决方法是将参数设置为正确的顺序

事件处理程序并不关心参数名称:它涉及类型和顺序。由于这两个参数都是Integer,因此它排序为:第一个Integer参数被解释为Cancel参数,第二个参数被CloseMode - form / COM并不关心你如何调用它们,它还是会从第一个参数中读取Cancel值。

通过从代码窗格顶部的下拉列表中选择事件,您可以在将来避免此问题:

first select the UserForm interface/event provider from the left dropdown

确保左侧下拉列表显示&#34; UserForm&#34;,然后选择&#34; QueryClose&#34;从右侧下拉列表中:

then select QueryClose event in the right dropdown

如果没有处理程序,VBE将为您创建一个正确形成的