2015-10-12 79 views
0

我的代碼:消息框出現多次

Private Sub Worksheet_Change(ByVal Target As Range) 
Set Target = Me.Range("D10", "D17") 
Dim KeyCells As Range 
Set KeyCells = Range("D10", "D17") 

If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then 
    If Range("D10").Value < 31.35 Then 
    Ans = msgbox("The accumulated Rain fall for this week is insuficient." & vbNewLine & "Click Yes if it was irrigated" & vbNewLine & "Click No if not", vbYesNo + vbCritical, "Rainfall Insufficient") 


    End If 
End If 

Select Case Ans 
      Case vbYes 
       Range("E10").Value = "Yes" 
       Exit Sub 
      Case vbNo 
       Range("E10").Value = "No" 
       Exit Sub 
      End Select 



End Sub 

消息框出現多次,但是當我發表意見Select Case消失。

爲什麼?

+1

請你重新上傳代碼並解釋你想做什麼。 – Linga

+1

每當您更改跟蹤更改的工作表上的單元格時,通常會在進行更改之前調用Application.EnableEvents = False。當你完成後,不要忘記將它重新設置爲「真」。 –

回答

0

您的代碼有幾個問題。我會詳細說明我認爲的問題,然後就正確的重寫提出建議。

  1. Set Target = Me.Range("D10", "D17")是錯的。 目標被傳遞到Worksheet_Change事件宏中,作爲已接收新值的單元格或單元格,其值已被修改或已刪除其值。關鍵是什麼樣的細胞已經改變,將Target設置爲別的東西會破壞它。
  2. If Not Intersect(KeyCells, Range(Target.Address)) Is Nothing Then是沒有意義的,如果你只是設置目標在相同的範圍KeyCells變種。當然,他們會相交。他們是一樣的東西。
  3. Select Case Ans如果包含Intersect method的If語句可以修復,則此Select Case statement所屬的內部爲的If Intersect Then語句。
  4. Set KeyCells = Range("D10", "D17")通常,我從不聲明,分配或設置任何東西,直到我知道我將需要它。與Select Case一樣,它屬於If Intersect Then語句中。
  5. Range(Target.Address)如果我們單獨離開Target(參見上面的#1),那麼這與Target的說法相同。
  6. 正如在幾個地方提到的那樣,如果您打算更改工作表上的值,則需要使用Application.EnableEvents = False關閉事件,否則您將觸發另一個事件,並且宏將嘗試在其自身上運行。

這是我最好的猜測,你正在嘗試。

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Not Application.Intersect(Range("D10", "D17"), Target) Is Nothing Then 
     On Error GoTo bm_Safe_Exit 
     Application.EnableEvents = False 
     Dim ans As Long, KeyCells As Range 

     Set KeyCells = Range("D10", "D17") '<~~ this is completely unnecessary now. 

     If Not Application.Intersect(Range("D10"), Target) Is Nothing Then 
      If Range("D10").Value < 31.35 Then 
       ans = MsgBox("The accumulated Rain fall for this week is insuficient." & vbNewLine & _ 
          "Click Yes if it was irrigated" & vbNewLine & _ 
          "Click No if not", _ 
          vbYesNo + vbCritical, "Rainfall Insufficient") 
       Select Case ans 
        Case vbYes 
         Range("E10").Value = "Yes" 
        Case vbNo 
         Range("E10").Value = "No" 
       End Select 
      End If 
     End If 

     If Not Application.Intersect(Range("D17"), Target) Is Nothing Then 

      'do something for when it was D17 that changed here 

     End If 
    End If 

bm_Safe_Exit: 
    Application.EnableEvents = True 
End Sub 

您可能會想要對我在D17收到更改時留下的區域進行操作。如果不重新打開Application.EnableEvents property或者所有事件宏都將停止「觸發」,請不要退出子版本。

-1

Worksheet_Change事件發生在單元格選擇的更改上。

您選擇的範圍編輯值爲範圍(E10),因此worksheet_change事件再次發生,並且它成爲事件處理的遞歸調用。

+0

[Worksheet_Change](https://msdn.microsoft.com/en-us/library/office/ff839775.aspx)事件宏由工作表上的一個或多個單元格的chane值觸發。您正在考慮[Worksheet_SelectionChange](https://msdn.microsoft.com/en-us/library/office/ff194470.aspx)事件宏。 – Jeeped