Применить IF к диапазону ячеек в Excel VBA - PullRequest
0 голосов
/ 13 июля 2020

Я пытаюсь применить следующий код к ячейкам 19: 500 в столбце I. Если я удалю строку кода set Range, I19 обновится правильно, но как только я добавлю диапазон, следующий код перестанет работать? Кто-нибудь знает, где я ошибаюсь? Спасибо!

Sub Status_Load()
    Dim Cell As Range
    Dim Range As Range
    Dim Today As Date
    With Sheet1

        Set Range = .Range("I19:I500")

        For Each Cell In Range
            If Range("N19").Value = Empty Then Exit Sub

            If Range("O19").Value <> Month(Today) Then
                Range("I19").Value = "Carried"
            ElseIf Range("S19").Value <> "" Then
                Range("I19").Value = "Closed"
            Else: Range("I19").Value = "Open"
            End If
        Next Cell
    End With
End Sub

1 Ответ

1 голос
/ 13 июля 2020

Используйте обычные For...Next l oop и l oop строки:

Dim i as Long
For i = 19 to 500
    If IsEmpty(.Range("N" & i).Value) Then Exit Sub

    If .Range("O" & i).Value <> Month(Date) Then
        .Range("I" & i).Value = "Carried"
    ElseIf .Range("S" & i).Value <> "" Then
        .Range("I" & i).Value = "Closed"
    Else
        .Range("I" & i).Value = "Open"
    End If
Next

Боковые примечания (как указано в комментариях):

  • Dim Range As Range: плохая идея . Не используйте повторно элементы объектной модели в качестве имен переменных.
  • Если вы не добавляете . перед каждым вызовом Range в l oop, тогда вы не фактически ссылается на With Sheet1.
  • Dim Today As Date. Возможно, вы не включили строку в свой вопрос Today = Date? В любом случае вы можете просто удалить эту переменную и использовать Date напрямую, т.е. Month(Today) -> Month(Date).

EDIT :

Как обсуждалось в комментариях, вы можете просто использовать здесь формулу и избегать VBA:

=IF(S66<>"","Closed",IF(AND(O66<>"",OR(MONTH(O66)<>MONTH(TODAY()),YEAR(O66)<>YEAR(TODAY()))),"Carried",IF(N66<>"","Open","")))
...