2017-09-15 51 views
2

我想执行以下任务:Excel的VBA:如何捕获MSGBOX响应

  • 写的留言“你醒了?”和显示问号

  • 捕获在整数响应变量INTR,放INTR值在单元格A2

  • 如果响应为是,则在单元格A1“乌拉”写

  • 如果响应为否,则写有文字“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 
    
+0

我有我的end end在最后,但我没有复制它:) –

+0

你的第一个错误是'intR = Range(“a2”)'而不是Range(“a2”)Value = intR' – YowE3K

回答

2

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

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

如果我理解正确的话,你不只是要显示一个问号,但3种可能性,这是由以下MSGBOX的方式给出一个选择:

intR = MsgBox "Are you awake ?", vbYesNoCancel 

这并显示MsgBox,这需要答案(所以我在这个问题上取下最后一颗子弹点,因为无论答案是“是”或“否”或“取消”,而不能是其他任何东西。The answer code is then mapped on an integerintR,这是正确的。

  • 捕获在整数响应变量INTR,放INTR值在单元格A2

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

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

您可以使用Select Case这里:想想作为If超过2种可能性:

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而不是整数。正如其他用户指出的那样,代码可能更具可读性。

+0

在你的代码中注意神奇的数字,你不应该有'Case 6',它应该是'Case vbYes','Case vbNo'和'Case vbCancel',更具可读性 –

+0

Lol到底什么,我写了链接到MSDN解释,但不知何故没有工作。 – Noldor130884

+0

你的编辑没有解决这个问题,它应该是'案例vbYes'不是'案例6'vbYes' –

1

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

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 
+0

你不应该前缀一个带有'vb'的变量名,它是为内置常量保留​​的 –

+0

这很有道理。实际上并没有一个叫做vbAns的常量,但为了清晰起见编辑了答案。感谢提出这个问题。 :) – sktneer

+0

完全没问题!它不会覆盖一个常量,但如果您有一个巨大的项目,并且您使用'vb'前缀命名了一堆变量,那么您可能会欺骗某人尝试为它们查找Microsoft文档,或者只是混淆了一些。 –

0

继诺多精灵的回答,作为一般规则,你不应该使用匈牙利命名法为您的变量名,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语句后退出。