【问题标题】:Understanding what response codes come back from MsgBox了解从 MsgBox 返回的响应代码
【发布时间】:2009-11-18 14:47:43
【问题描述】:

我对编程很陌生,我刚开始用 excel 学习 VBA。我在这个网站上遇到并在这里做了示例,但我对这段代码有疑问:

我知道变量是使用“Dim”语句声明的“消息”这里是数据类型为整数的变量。我不清楚的是;这里的“6”和“7”是什么意思。我相信他们来自某个地方。但是当我刚开始学习这个程序时,我不知道。你能告诉我它是怎么变成“6”和“7”的吗?我相信这里有一定的依据

Private Sub CommandButton1_Click()
Dim message As Integer
message = MsgBox("Click Yes to Proceed, No to stop", vbYesNoCancel, "Login")
If message = 6 Then
Range("A1").Value = "You may proceed"
ActiveWorkbook.Activate 
ElseIf message = 7 Then
ActiveWorkbook.Close
End If

End Sub

感谢您的帮助:-)

=======

谢谢大家的回答,他们很有帮助。是的,这个帖子已经发布在超级用户网站上。我被告知这个问题应该属于这里,所以我在阅读他们将自动从超级用户到 stackoverflow 后将其发布在这里。

再次感谢

【问题讨论】:

  • 来自常见问题解答 (superuser.com/faq):“如果您的问题是关于编程的,请在 stackoverflow.com 上提问”。您的问题很可能会被迁移到该网站,您应该在那里创建一个帐户并将其与该网站相关联,这样您就可以保留该问题的所有权。
  • @Gnoupi:好的,我会将这个问题发布到 Stackoverflow,虽然我已经知道答案,但不确定是否有帮助。
  • 不要在那里发布您的问题,站点之间有一个迁移系统,您的问题将被迁移到那里(只要有足够多的人投票,或者有版主这样做)。如果你把它贴在那里,它很可能是重复的,当这个会被移动时(我知道,一开始不太清楚,但你习惯了;))
  • @Gnoupi:对不起,我已经把它贴在那里了。我很晚才读到cmets。我希望我不会受到任何处罚:-(
  • 不过,如果您在这里有答案,请不要犹豫,点击正确答案旁边的“打勾”。

标签: vba msgbox


【解决方案1】:

MsgBox 确实返回了一个名为MsgBoxResultEnum(eration),它基本上只是带有“标签”的数值。在这种情况下,6 和 7 是该枚举的成员,它们被映射到答案 YesNo

应尽可能避免使用所谓的“幻数”而不是常量或枚举。

基本上,您可以将代码重写为:

Dim message As Integer
message = MsgBox("Click Yes to Proceed, No to stop", vbYesNoCancel, "Login")
If message = MsgBoxResult.Yes Then
    Range("A1").Value = "You may proceed"
    ActiveWorkbook.Activate
ElseIf message = MsgBoxResult.No Then
    ActiveWorkbook.Close
End If

可能是 Enum 被称为 vbMsgBoxResult 之类的......我没有 Office 来验证这一点,只有 Visual Studio。

虽然我们正在讨论...这可能更容易理解:

Select Case MsgBox("Click Yes to Proceed, No to stop", vbYesNoCancel, "Login")
    Case MsgBoxResult.Yes
        Range("A1").Value = "You may proceed"
        ActiveWorkbook.Activate

    Case MsgBoxResult.No
        ActiveWorkbook.Close

    Case MsgBoxResult.Cancel
        ' he clicked cancel '

End Select

【讨论】:

  • 好答案,我喜欢建议引用枚举值名称而不是数字。另外 +1 可能更适合 StackOverflow。
  • @appakz,谢谢。我认为使用名称而不是数字是枚举的全部意义所在,我只是喜欢枚举。 ;)
  • 非常感谢 Bobby 提供的非常好的答案,特别是如果这个问题属于 Stackoverflow:-) 我不确定我是否必须将它打开到 Stackoverflow 或者像这样把它留在这里。 +1 :-)
  • @Bobby:第一个代码不起作用。我收到一个错误“需要运行时错误“424”对象”...不太清楚为什么?
  • @Bobby:也是最后一个带有选择案例的代码,它不起作用。我得到了和上面一样的错误。
【解决方案2】:

当我第一次使用MsgBox 答案时,我几乎总是将答案声明为Integer。但是,我了解到最好的办法是将您的message 变量声明为VbMsgBoxResult,这是一个始终显示可用答案的枚举。在下图中,IDE(例如 Visual Basic for Application 编辑器)将向您展示VbMsgBoxResult 中可用的可能选项。

可以将您的answer 变量存储为Integer,因为枚举中的所有变量(例如vbAbortvbYesvbOK 等)都在事实解析为整数。但是,每次要引用这些变量时,您都必须弄清楚这些变量的整数值是多少。在我看来,将您的答案存储为VbMsgBoxResult 是一种更好的做法,这样您就可以实际看到可用的答案。

【讨论】:

    【解决方案3】:

    这是写得很糟糕的代码,“6”和“7”是常量“vbYes”和“vbNo”的值,当用户在对话框中单击“是”或“否”时返回。

    参考:http://www.techonthenet.com/access/constants/msgbox_ret.php

    代码应该说

    If message = Constants.vbYes 
    

    而不是

    If message = 6
    

    以便清楚发生了什么。

    【讨论】:

    • 感谢您的评论。我不是做这个代码的人,我正在努力理解它,这是我第一次学习这个 vba 东西
    【解决方案4】:

    此链接适用于 VBScript,但我认为返回码应该相同: MsgBox Function Reference

    返回码告诉你点击了哪个按钮:

    1   OK
    2   Cancel
    3   Abort
    4   Retry
    5   Ignore
    6   Yes
    7   No
    

    【讨论】:

      【解决方案5】:

      这些是 MsgBox() 的返回值。作者应该使用它们的符号值来使程序更具可读性:

      vbYes   6
      vbNo    7
      

      查看MSDN article了解更多信息

      【讨论】:

        【解决方案6】:

        6 和 7 是 MsgBox 方法的返回码。基本上,当调用 MsgBox 时,它会向用户显示一个消息框,用户单击“是”、“否”或“取消”。 MsgBox 方法以数字形式返回用户的选择,其中 6 表示是,7 表示否。

        最好不要在代码中直接使用这些数字,而是使用 Microsoft 提供的代表它们的常量。您的代码可以重写为:

        Private Sub CommandButton1_Click()
            Dim message As Integer
            message = MsgBox("Click Yes to Proceed, No to stop", vbYesNoCancel, "Login")
            If message = vbYes Then
                Range("A1").Value = "You may proceed"
                ActiveWorkbook.Activate 
            ElseIf message = vbNo Then
                ActiveWorkbook.Close
            ElseIf message = vbCancel Then
                'Do nothing.
            End If
        End Sub
        

        【讨论】:

        • @RB:你说得对,最好不要使用这些值,尤其是像我这样的初学者。第一次看到代码的时候,我真的很想知道这个 6 和 7 的 h*** 是从哪里来的。作为一名工程师,我通常会做出一些假设,这些假设可能是什么,这些东西可能来自哪里。我敢打赌,它们必须是 VBA 中的常量值。现在我不明白如果使用它们不是一个好习惯,他们为什么还要开发这些常量值,因为最后这可能会使初学者感到困惑?这是否意味着这些常量值仅供专家使用?
        • 应始终使用常量(vbNo、vbYes 等)而不是等效整数(6、7 等)。直接使用整数的代码很糟糕,因为它非常难以阅读。开发人员不应直接使用整数,而应使用等价的常量。希望能回答你的问题。
        • @RB:没错,我同意你的看法。开发人员不应直接使用整数,而应使用等价的常量。为什么他们仍然将这个整数开发为等效常量。有时它会使程序更加复杂。
        【解决方案7】:

        6 和 7 是具有特殊含义的硬编码值。 'MsgBox("Click Yes...")' 调用将返回一个数字,让您的代码确定用户对消息框做了什么,然后您可以使用条件(您的 IF 语句)来决定下一步做什么。

        可以在此处的 MSDN 文档中找到这些特殊值的完整列表:

        http://msdn.microsoft.com/en-us/library/139z2azd(VS.80).aspx

        【讨论】:

        • 感谢您提供有用的链接。所以“6”和“7”已经是固定值。我不知道 Visual Basics 中有枚举值。非常有帮助,再次感谢
        【解决方案8】:

        只需重写为等价物:

        Private Sub CommandButton1_Click()
          Dim optionSelected As VbMsgBoxResult
          optionSelected = MsgBox("Click Yes to Proceed, No to stop", vbYesNoCancel, "Login")
          If optionSelected = vbYes Then
            Range("A1").Value = "You may proceed"
            ActiveWorkbook.Activate 
          ElseIf optionSelected = vbNo Then
            ActiveWorkbook.Close
          End If
        End Sub
        

        继续前进

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-03-15
          • 2018-09-11
          • 1970-01-01
          • 1970-01-01
          • 2016-02-20
          • 2017-05-27
          • 1970-01-01
          • 2017-01-29
          相关资源
          最近更新 更多