Вам просто нужно проверить, пересекается ли Target
с желаемым диапазоном.В этой проверке я бы объединил два столбца вместе.
Как загадочно указано в DisplayName, поскольку Target
может содержать более одной ячейки, вам следует проверять каждую ячейку в цели по отдельности.В качестве альтернативы, если ваше намерение для Target
состояло в том, чтобы всегда иметь одну ячейку, вы можете вообще избежать оператора For...Each
и использовать эту проверку: If Target.Cells.Count > 1 Then Exit Sub
, чтобы не запускать процедуру при изменении более 1 ячейки.
Я также добавил еще одну цель пересечения, Me.Rows("2:" & rows.count)
, чтобы избежать обновления любых заголовков, которые у вас могут быть.Если ваши данные не содержат заголовков, вы можете удалить этот диапазон из Intersect()
.
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo safeExit
Dim rngIntersect As Range
Set rngIntersect = Intersect(Target, Union(Me.Columns("E"), Me.Columns("H")), _
Me.Rows("2:" & Rows.Count))
If Not rngIntersect Is Nothing Then
Application.EnableEvents = False
Dim cel As Range
For Each cel In rngIntersect
If cel.Value < 0 Or cel.Value > 1 Then
MsgBox "bla bla bla", vbCritical + vbMsgBoxRtlReading + vbMsgBoxRight, _
"error"
cel.Value = 0
End If
Next cel
End If
safeExit:
Application.EnableEvents = True
End Sub
В качестве примечания: если вы используете один и тот же точный диапазон более одного раза, это неплохая идея.идти вперед и установить этот диапазон переменной.Таким образом, мы дважды используем rngIntersect
в этом коде, поэтому нам не нужно выполнять несколько вызовов функций Intersect()
и Union()
.Кроме того, вы сталкиваетесь с меньшим количеством проблем отладки, когда вам нужно обновить диапазон только в одном месте, а не несколько раз в коде.