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