не выбираем диапазон, а определяем ячейки из Target, которые входят в нужный и указанный диапазон.
Если первый раз просто смотрим есть ли что обрабатывать или все за пределами нужного диапазона изменилось, то второй раз уже именно вибираем нужные при этом если их несколько, а если скопировать и вставит сразу несколько то их будет именно несколько, то они и будут в цикле обработаны.
Этого можно избежать, но стоит ли
Код |
---|
Set mcells = Intersect(Target, Range("B6:F8"))
If Not mcells Is Nothing Then
Application.EnableEvents = False
Application.ScreenUpdating = False
For Each mcell In mcells |
ну и
Код |
---|
Private предел_исо As Double ' Множитель предела исо
Private макс_на_пределе As Integer ' максимальное значение на пределе
Private Sub Worksheet_Change(ByVal Target As Range)
Dim mcell As Range
On Error GoTo ErrorHendler
If Not Intersect(Target, Range("B6:F8")) Is Nothing Then ' проверяем что изменения в нужном диапазоне ячеек
Application.EnableEvents = False
Application.ScreenUpdating = False
For Each mcell In Intersect(Target, Range("B6:F8")) ' перебираем диапазон ячеек что изменились в нужном диаазоне
If mcell <> "" Then ' проверка на то что стерли данные в ячейке
If IsNumeric(mcell) Then ' проверяем что число
Select Case True
Case mcell <= 0 ' проверяем что > 0
MsgBox "Ошибочный ввод. Значение должно быть больше нуля " & mcell.Address(0, 0), 64 ' если <=0 выдаем предупреждение
Case mcell > макс_на_пределе ' проверяем что не превышает максимально допустимое.
MsgBox "Ошибочный ввод. Значение выше предела диапазона измерений" & mcell.Address(0, 0), 64
Case Else
mcell = mcell * предел_исо ' умножаем на множитель для исо
End Select
End If
End If
Next
ErrorHendler:
Application.ScreenUpdating = True
Application.EnableEvents = True
End If
End Sub |