Excel VBA, использующий вложенные операторы If для нескольких листов

Я пытаюсь получить вывод в столбце U для нескольких листов в книге. Возвращаемая строка будет либо "Да", либо "Нет" в зависимости от того, какой столбец не является пустым, и если разница между двумя датами> 150. Это код, который я написал, но в столбце U ничего не отображается. Может ли кто-нибудь помочь? мне понять, почему это не работает?

Sub Compliance()

Dim ws As Worksheet

For Each ws In ThisWorkbook.Worksheets
Dim i As Integer
Dim listLength
listLength = ws.Cells(Rows.Count, "M").End(xlUp).Row - 1


For i = 2 To listLength + 2
If IsEmpty(ws.Range("P" & i)) = True And IsEmpty(ws.Range("O" & i)) = True And IsEmpty(ws.Range("N" & i)) = True And DateDiff("d", ws.Range("M" & i), ws.Range("K" & i)) > 150 Then
    ws.Range("U" & i) = "Yes"
ElseIf IsEmpty(ws.Range("P" & i)) = True And IsEmpty(ws.Range("O" & i)) = True And DateDiff("d", ws.Range("N" & i), ws.Range("M" & i)) < 150 Then
    ws.Range("U" & i) = "Yes"
ElseIf IsEmpty(ws.Range("P" & i)) = True And DateDiff("d", ws.Range("O" & i), ws.Range("N" & i)) < 150 Then
    ws.Range("U" & i) = "Yes"
ElseIf DateDiff("d", ws.Range("N" & i), ws.Range("M" & i)) < 150 Then
    ws.Range("U" & i) = "Yes"
Else
    ws.Range("U" & i) = "No"
End If
Next
Next ws


End Sub

1 ответ

Решение

Когда вы начинаете свой цикл с For Each ws In ThisWorkbook.Worksheets затем Excel начинает обработку с Sheet1, и я уверен, что ваш список на другом листе.

Итак, причина, по которой ничего не меняется в вашем столбце U, заключается в том, что вы смотрите на неверный рабочий лист.

Если вы хотите просмотреть все ваши рабочие листы, начните следить за своими списками из Sheet1. Если вы хотите выполнить цикл в другом порядке, вы должны определить это в своем коде.

И ниже я отредактировал некоторую часть вашего кода, а также добавил msgbox ws.name чтобы показать вам, на каком листе Excel работает сейчас.

Зачем использовать целое число вместо длинного?

Option Explicit

Sub Compliance()

Dim ws As Worksheet

    For Each ws In ThisWorkbook.Worksheets
    Dim i As Long
    Dim listLength
    MsgBox ws.Name
    listLength = ws.Cells(ws.Rows.Count, "M").End(xlUp).Row - 1

        For i = 2 To listLength + 2
        If IsEmpty(ws.Range("P" & i)) = True And IsEmpty(ws.Range("O" & i)) = True And IsEmpty(ws.Range("N" & i)) = True And DateDiff("d", ws.Range("M" & i), ws.Range("K" & i)) > 150 Then
            ws.Range("U" & i) = "Yes"
        ElseIf IsEmpty(ws.Range("P" & i)) = True And IsEmpty(ws.Range("O" & i)) = True And DateDiff("d", ws.Range("N" & i), ws.Range("M" & i)) < 150 Then
            ws.Range("U" & i) = "Yes"
        ElseIf IsEmpty(ws.Range("P" & i)) = True And DateDiff("d", ws.Range("O" & i), ws.Range("N" & i)) < 150 Then
            ws.Range("U" & i) = "Yes"
        ElseIf DateDiff("d", ws.Range("N" & i), ws.Range("M" & i)) < 150 Then
            ws.Range("U" & i) = "Yes"
        Else
            ws.Range("U" & i) = "No"
        End If
        Next

    Next ws

End Sub
Другие вопросы по тегам