Excel VBA:如何捕获MsgBox响应

Excel VBA:如何捕获MsgBox响应,vba,excel,Vba,Excel,我想执行以下任务: 写下信息“你醒了吗?”并显示问号 在整数变量intR中捕获响应,将intR值放入单元格A2 如果回答是“是”,则在单元格A1中填写“万岁” 如果回答为“否”,则在消息框中写上“zzzzzz” 如果响应为Cancel,则退出sub Sub EX3_1_6MsgBoxFunction() Dim intR As Integer Dim TxtRng As Range Dim stra As String Dim stra2 As String 'Have the messa

我想执行以下任务:

  • 写下信息“你醒了吗?”并显示问号

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

  • 如果回答是“是”,则在单元格A1中填写“万岁”

  • 如果回答为“否”,则在消息框中写上“zzzzzz”

  • 如果响应为Cancel,则退出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
    

    • 首先欢迎来到StackOverflow。当您提出问题时,请记住指定代码中存在问题的地方

      • 写下信息“你醒了吗?”并显示问号
      如果我理解正确,您不仅希望显示问号,还希望选择以下MsgBox模式给出的3种可能性:

          intR = MsgBox("Are you awake ? ", vbQuestion + vbYesNoCancel)
      
      这会显示一个
      MsgBox
      ,它需要回答:“是”或“否”或“取消”。不可能是别的原因,这就是为什么我删除了你问题的最后一个要点
      intR
      ,这是正确的

      • 在整数变量intR中捕获响应,将intR值放入单元格A2
      正如YowE3K指出的,它应该是
      Range(“a2”)。Value=intR
      ,而不是
      intR=Range(“a2”)

      • 如果回答是“是”,则在单元格A1中填写“万岁”
      • 如果回答为“否”,则在消息框中写上“zzzzzz”
      • 如果响应为Cancel,则退出sub
      您可以在此处使用
      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
      
      选择Case intR
      
      案例6’你可以试试这样的

      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的回答之外,作为一般规则,您不应该对变量名使用匈牙利符号,
      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”
      )即可提示用户,这样您就可以消除不必要的
      stra2
      stra
      。您也不需要显式地
      Exit Sub
      ,因为代码将在
      Select Case
      If
      语句之后自然退出。

      我确实在末尾有我的end Sub,但我没有复制它:)您的第一个错误是
      intR=Range(“a2”)
      而不是
      Range(“a2”).Value=intR
      注意代码中的神奇数字,你不应该有
      案例6
      ,它应该是
      案例vbYes
      案例vbNo
      案例vbCancel
      ,更易于阅读。哦,见鬼,我写了一个指向MSDN的链接来解释这一点,但不知何故没有起作用。这是一个明显的问题,你可以在里面放任何旧的数字。如果你认为vbYes是7,那么你把它放在案例7中,有人进来查看它时会不明白为什么选择的案例在错误的点退出,他们正在单击yes,这肯定应该是7。你可以通过把
      Case vbYes
      作为正确的方法来消除这个问题。但是为什么每次你想使用它们时都要强迫自己去查找每个常量呢?这是多余的。你不应该一开始就知道它们,也不应该去查阅它们,你应该在代码中使用它们。很明显,要说服你不要使用幻数应该不难。你的答案仍然是
      案例6
      案例7
      案例2
      ,你使用的是幻数,这是糟糕的编程,与可读性无关,你做错了你不应该在变量名前面加上
      vb
      ,这是为内置君士坦丁堡保留的,这很有意义。实际上,没有称为VBAN的常量,但为了清晰起见,已对答案进行了编辑。谢谢你提出这个问题@sktneer:有趣的
      将Ans设置为VbMsgBoxResult
      。它比Integer有什么好处吗?(显示预期用途除外)@patrickhornez此变量类型很少用于获取msgbox返回的答案。我使用它是为了清晰和显示它的用途。:)这个答案提供了一个与巴勃罗的意思有点不同的解决方案,但它仍然很好。我喜欢使用
      VbMsgBoxResult