2015-10-12 3 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' * до * внесения изменений (изменений)». Не забудьте вернуть его в «True», когда закончите. –

ответ

0

В вашем коде есть несколько проблем. Я подробно расскажу, что я думаю о проблемах, а затем сделаю предложение относительно правильного переписывания.

  1. Set Target = Me.Range("D10", "D17") неправ. Target передается в макрос события Worksheet_Change как ячейка или ячейки, которые получили новые значения, изменили их значения или удалили их значения. Это ваш ключ относительно того, какие ячейки изменились, и установить Target на что-то еще, что разрушает это.
  2. If Not Intersect(KeyCells, Range(Target.Address)) Is Nothing Then не имеет смысла, если вы только что установили Цель в том же диапазоне, что и KeyCells var. Конечно, они собираются пересекаться. Это одно и то же.
  3. Select Case Ans Если оператор Если содержащий Intersect method можно отремонтировать, эта Select Case statement принадлежит внутри КРП Intersect Тогда заявление.
  4. Set KeyCells = Range("D10", "D17") Как правило, я никогда не объявляю, не назначаю и не устанавливаю ничего, пока не узнаю, что мне это понадобится. Подобно Select Case, это принадлежит внутри оператора If Intersect Then.
  5. Range(Target.Address) Если мы оставим цель в одиночку (см. № 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), поэтому событие workheet_change происходит снова, и оно становится рекурсивным вызовом обработки события.

+0

Макрос события [Worksheet_Change] (https://msdn.microsoft.com/en-us/library/office/ff839775.aspx) запускается по значению в одну или несколько ячеек на листе. Вы думаете о макросе события [Worksheet_SelectionChange] (https://msdn.microsoft.com/en-us/library/office/ff194470.aspx). – Jeeped

Смежные вопросы