Для неисправности изменения цикла в рабочем листе

#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. Немного переработал код с помощью ваших идей, и теперь он работает хорошо