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 

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

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

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

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

Зачем использовать Integer вместо Long?

 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 
Давайте будем гением компьютера.