#excel #vba #loops #for-loop #worksheet
Вопрос:
Пожалуйста, у меня проблема: каждый раз, когда на листе происходит изменение, оно влияет на все строки, а не на соответствующую строку (i). Смущенный. Не работают ли циклы for-loops для worksheet_change ? Пожалуйста, помогите. Спасибо.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim LR As Long
'create a variable for last row of column C, LR
LR = Cells(Rows.Count, "C").End(xlUp).Row
For i = 2 To LR
If Cells(i, 6) = "Yes" And Cells(i, 7).Value = "Full" Then
Target.Value = Cells(i, 3).Value
Cells(i, 9).ClearContents
Cells(i, 10).Value = Cells(i, 8).Value Cells(i, 9).Value
End If
If Not Intersect(Target, Range("G" amp; i amp; ":G" amp; LR)) Is Nothing And Range("F" amp; i) = "Yes"
And Target.Value = "Full" Then
Application.EnableEvents = False
Cells(i, 8).Value = Cells(i, 3).Value
Cells(i, 9).ClearContents
Cells(i, 10).Value = Cells(i, 8).Value Cells(i, 9).Value
Application.EnableEvents = True
End If
If Not Intersect(Target, Range("G" amp; i amp; ":G" amp; LR)) Is Nothing And Range("F" amp; i) = "Yes" And
Target.Value = "Portion" Then
Application.EnableEvents = False
Cells(i, 8).Value = Cells(i, 3).Value
Cells(i, 10).Value = Cells(i, 8).Value Cells(i, 9).Value
Application.EnableEvents = True
End If
Next i
End Sub
Комментарии:
1. Вы просматриваете все строки, поэтому, естественно, это повлияет на все строки. Кроме того, вам необходимо отключить события в вашем первом
If
блоке.2. Кроме того, я бы посоветовал вам использовать правильные отступы для
for
-цикла иIf
— операторов — тогда гораздо легче читать, что происходит.3. Вы запускаете свое событие, когда изменяется ячейка, и внутри этого события вы меняете ячейки. Разве вы не создаете какой-то бесконечный цикл событий, называющих себя вот так?
4. @Rory коды работают, но проблема, с которой я сталкиваюсь, заключается в том, что как только я изменяю строку с «Полной» на «Часть», это влияет на все ячейки, а не только на ту, которую я изменяю. Попробовал пару вещей, чтобы изменить это, но безрезультатно. Спасибо
5. @Dominique, пожалуйста, как вы рекомендуете мне это сделать? когда я изменяю ячейку с «Полной» на «Часть», это влияет на все предыдущие ячейки, а не только на ту, которую я изменяю
Ответ №1:
Похоже, вам нужно запустить это событие для столбцов A-E. Итак, вы можете начать свой макрос с:
IF Target.Column <= 5 THEN
...
END IF 'at the end of your macro
Вот так, когда вы запускаете код типа Cells(i, 8).Value = ...
, Cells(i, 10).Value = ...
, … этот макрос будет вызван, но он будет немедленно остановлен.
Очевидно, вы проверяете столбец максимум 10, который находится в диапазоне ячеек, которые вы изменяете в своем макросе. Давайте попробуем другой подход:
В самом начале вашего макроса поставьте эту строку:
Application.EnableEvents = False
В самом конце вашего макроса поставьте эту строку:
Application.EnableEvents = True
(и удалите другие случаи).
Это позволит убедиться, что вы не вызываете свой макрос во время его запуска.
Комментарии:
1. Используется « Если Цель. Колонка Значение = «Полный», Затем «. Все та же проблема.
2. Большое спасибо @Dominique. Немного переработал код с помощью ваших идей, и теперь он работает хорошо