Excel VBA:如何捕获MsgBox响应

我想执行以下任务:

  • 写信息“你醒了吗? 并显示一个问号

  • 捕获整型variablesintR中的响应,将intR值置于单元格A2中

  • 如果回答是“是”,则在单元格A1“Hurray”

  • 如果回答是“否”,则写一个带有文字“ZZZZZZZZ”的消息框

  • 如果响应是取消,则退出该子

    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 

首先欢迎来到StackOverflow。 当您提出问题时,请记得指定您的代码中存在问题的位置。

  • 写信息“你醒了吗? 并显示一个问号

如果我理解正确,你不只是想要显示一个问号,而是有三种可能性的select,这是由下面的MsgBox模式给出的:

  intR = MsgBox "Are you awake ?", vbYesNoCancel 

这显示一个MsgBox ,这需要一个答案 (所以我删除了问题中的最后一个要点,因为答案是“是”,“否”或“取消”,它不能是别的。 映射到整数 intR ,这是正确的。

  • 捕获整型variablesintR中的响应,将intR值置于单元格A2中

正如YowE3K所指出的,它应该是Range("a2").Value = intR ,not intR = Range("a2")

  • 如果回答是“是”,则在单元格A1“Hurray”
  • 如果回答是“否”,则写一个带有文字“ZZZZZZZZ”的消息框
  • 如果响应是取消,则退出该子

你可以在这里使用一个Select Case :把它想象成一个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而不是整数。 正如另一位用户指出的那样,代码可能更具可读性。

你可以尝试这样的事情…..

 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 

除了Noldor的回答,作为一般规则,你不应该使用匈牙利符号作为你的variables名, intR并没有告诉你任何关于variables和它的types不同的地方。

你应该能够从上下文中推断出这个types,而variables名应该给你更有用的东西。 我build议像重写你的代码

 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分配给variables,只需使用参数(在本例中为"ZZZZZ" )来调用它即可提示用户,这样就可以消除不必要的stra2stra 。 您也不需要显式地Exit Sub因为代码自然会在Select CaseIf语句之后退出。