#excel #vba
Вопрос:
Я создал макрос, который проверяет строку 3 в столбце B на наличие двух разных критериев, и если один из них удовлетворен, он помещает букву «R» в пустые ячейки в диапазоне B5:B20. Если все пусты, он сбрасывает слово «Нет» в ячейку B34. Мне это нужно, чтобы выполнить ту же операцию в столбцах C-AF, но я не могу заставить ее зациклиться. Любая помощь будет признательна. Спасибо.
Sub Column_B() Dim ws As Worksheet Dim b As Range Set ws = Worksheets("January") For Each b In Range("B5:B20") If b.Value = 0 And ws.Range("b3") = ws.Range("a34") Or b.Value = 0 And ws.Range("b3") = ws.Range("a35") Then b.Value = "R" Else ws.Range("b34") = "No" End If Next b End Sub
Комментарии:
1. Вам нужно поместить ваш текущий цикл в новый цикл for..next, в котором вы будете повторять новые столбцы.
2. Могу я спросить: Является ли рабочий лист, на котором указан диапазон(«B5:B20»), Активным листом? и являются ли рабочие листы(«Январь») отдельным листом?
3. Если сравнение всегда между B3 и A34/A35, вы, вероятно, можете просто использовать
For each b in Range("B5:AF20")
. В противном случае вам, вероятно, понадобится цикл for для строк и цикл for для столбцов.
Ответ №1:
Выполните итерацию по столбцам от B до AF в строке 3 и используйте смещения для перебора строк с 5 по 20.
Option Explicit Sub Column_BtoAF() Dim ws As Worksheet, r As Long Dim cell As Range, c As Range, bEmpty As Boolean Set ws = Worksheets("January") For Each c In Range("B3:AF3").Cells If c.Value2 = ws.Range("A34").Value2 _ Or c.Value2 = ws.Range("A35").Value2 Then bEmpty = True For r = 5 To 20 Set cell = c.Offset(r - 3) If IsEmpty(cell) Then cell.Value = "R" Else bEmpty = False End If Next If bEmpty Then c.Offset(31) = "No" ' row 34 End If Next MsgBox "Done" End Sub