2017-09-15 48 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語句後退出。