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。当您提出问题时,请记住指定代码中存在问题的地方
intR = MsgBox("Are you awake ? ", vbQuestion + vbYesNoCancel)
这会显示一个MsgBox
,它需要回答:“是”或“否”或“取消”。不可能是别的原因,这就是为什么我删除了你问题的最后一个要点intR
,这是正确的
- 在整数变量intR中捕获响应,将intR值放入单元格A2
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