Excel VBA:如何捕获MsgBox的响应

3
我可以帮您完成以下任务:
  • write the message "Are you awake?" and display a question mark

  • capture the response in the integer variable intR, put intR value in cell A2

  • If the response is Yes, then write in cell A1 "Hurray"

  • If the response is No, then write a message box with the text "ZZZZZZZZ"

  • If the response is Cancel, then exit the sub

    Sub EX3_1_6MsgBoxFunction()
    
    Dim intR As Integer
    Dim TxtRng As Range
    Dim stra As String
    Dim stra2 As String
    
    'Have the message box display the buttons Yes, No and Cancel
    
    
    intR = MsgBox("Are you awake ? ", vbQuestion + vbYesNoCancel)
    intR = Range("a2")
    
    If intR = vbYes Then
    Range("a1") = "Hurray"
    
    'that means yes
    
    ElseIf intR = vbNo Then
    stra2 = MsgBox("ZZZZZZZZZZ")
    
    Else
    
    Range("a2") = intR
    
    
    End If
    
    End Sub
    

我在结尾处有我的结束子程序,但我没有复制它 :) - Pablo lerdo de tejada
你的第一个错误是将 intR = Range("a2") 写成了 Range("a2").Value = intR - YowE3K
3个回答

3

您可以尝试这样做......

Sub EX3_1_6MsgBoxFunction()
Dim Ans As VbMsgBoxResult

'Have the message box display the buttons Yes, No and Cancel
Ans = MsgBox("Are you awake ? ", vbQuestion + vbYesNoCancel)

Select Case Ans
    Case vbYes
        Range("A1").Value = "Hurray"
        Range("A2").Value = "Yes"
    Case vbNo
        Range("A1").Value = "ZZZZZZZZZZ"
        Range("A2").Value = "No"
    Case Else
        Range("A1").Value = ""
        Range("A2").Value = "Calcel"
End Select

End Sub

不应该在变量名前加上 vb,这是保留给内置常量的。 - B Slater
有道理。实际上,没有叫做vbAns的常量,但为了更清晰地回答问题已经进行了编辑。感谢您提出这个问题。 :) - Subodh Tiwari sktneer
完全没有问题!它不会覆盖一个常量,但如果你有一个庞大的项目,并且已经使用“vb”前缀为一堆变量命名,那么你可能会误导其他人试图为它们寻找Microsoft文档,或者产生一些混乱。 - B Slater
1
@sktneer:有趣的 Dim Ans As VbMsgBoxResult。除了显示预期的用途之外,它是否带来了任何优点,超过了 Integer - iDevlop
2
@PatrickHonorez 这种变量类型很少使用,但它可以得到 msgbox 返回的答案。我使用它是为了清晰明了,并展示它的用法。 :) - Subodh Tiwari sktneer
1
这个答案提供了一个解决方案,与Pablo的意思有点不同,但仍然很好。我喜欢使用 VbMsgBoxResult - Noldor130884

2
首先欢迎来到StackOverflow。当您提出问题时,请记得指明您在代码中遇到的问题。
  • 编写消息“你醒了吗?”并显示一个问号
如果我理解正确,您不仅仅想要显示一个问号,而是需要选择3种可能性,这可以通过以下MsgBox的模式给出:
    intR = MsgBox("Are you awake ? ", vbQuestion + vbYesNoCancel)

这将显示一个MsgBox,需要回答"Yes"、"No"或"Cancel"。这就是为什么我删除了您问题中的最后一个小圆点的原因。 然后将答案代码映射到整数intR,这是正确的。

  • 在整数变量intR中捕获响应,将intR值放入单元格A2中

正如YowE3K指出的那样,应该是Range("a2").Value = intR而不是intR = Range("a2")

  • 如果响应为Yes,则在单元格A1中编写"Hurray"
  • 如果响应为No,则显示文本为"ZZZZZZZZ"的消息框
  • 如果响应为Cancel,则退出子程序

您可以在此处使用Select Case:将其视为具有多于2个可能性的If

Select Case intR
    Case 6 '<- According to the link I provided vbYes = 6
        Range("a1") = "Hurray"
    Case 7 '<- According to the link I provided vbNo = 7
        MsgBox "ZZZZZZZZ"
    Case 2 '<- According to the link I provided vbCancel = 2
        Exit Sub
End Select

您可以使用vbYes、vbNo和vbCancel代替整数。正如另一位用户指出的那样,这样的代码可能更易读。


1
在你的代码中要注意魔数,你不应该使用 Case 6,而应该使用 Case vbYesCase vbNoCase vbCancel,这样更易读。 - B Slater
那是一个“问题”吗?也许代码不太易读,但我认为没有问题。 - Noldor130884
2
这是一个明显的问题,你可以随意输入任何数字。如果你认为vbYes是7,所以你输入了Case 7 ' vbYes,那么其他人看到这段代码时就不会理解为什么选择语句在错误的位置退出,他们点击“是”应该肯定是7。你可以通过只输入Case vbYes来消除这个问题,这才是正确的做法。 - B Slater
1
但是为什么你要强迫自己每次想使用这些常量时都去查找它们呢?这是多余的。你不应该需要脑海中记住它们或查找它们,你只需要在代码中使用它们即可。说服你不要使用魔法数字不应该很难,这是显而易见的。 - B Slater
2
你的答案还是写着“Case 6”,“Case 7”和“Case 2”,这是使用魔数,这是不好的编程习惯,这与可读性无关,你做错了。 - B Slater
显示剩余8条评论

1

针对Noldor的回答,一般来说,变量名不应该使用匈牙利命名法,intR除了类型之外并不能告诉你有关变量的任何信息。

你应该能够从上下文中推断出类型,并且变量名应该提供更有用的信息。我建议重写代码如下:

Sub EX3_1_6MsgBoxFunction()
    Dim retVal As Integer

    'Ask the user whether they're awake
    retVal = MsgBox("Are you awake ? ", vbQuestion + vbYesNoCancel)

    'Switch on their answer
    Select Case retVal
        Case vbYes
            Range("A2") = "Hurray"
        Case vbNo
            MsgBox "ZZZZZZZ"
    End Select
End Sub

请注意,您不需要将 MsgBox 分配给变量,您可以只使用参数(在本例中为 "ZZZZZ")调用它以提示用户,这样可以消除您不必要的 stra2stra。您也不需要明确使用 Exit Sub,因为代码将自然退出在 Select CaseIf 语句之后。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接