2015-10-12 82 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