Пожалуйста, попробуйте этот код:
Работает только для ячеек, измененных в диапазоне "B1:B" & lastRow
. Хотели бы вы работать на любую ячейку, измененную на всех листах? Я думаю, это может раздражать ...
Private Sub Worksheet_Change(ByVal Target As Range)
Dim ws As Worksheet, rng As Range, lastRow As Long
Dim i As Long, iCount As Long, iCountC As Long
Set ws = ActiveSheet
lastRow = 5
Set rng = ws.Range("B1:C" & lastRow)
If Not Intersect(Target, rng) Is Nothing Then
For i = 1 To lastRow
With ws.Cells(i, 2)
If .Interior.ColorIndex = 4 And .Value = 0 Then
iCount = iCount + 1
End If
If .Offset(0, 1).Interior.ColorIndex = 4 And _
.Offset(0, 1).Value = 0 Then
iCountC = iCountC + 1
End If
End With
Next
ws.Range("B" & lastRow + 1).Value = iCount
ws.Range("C" & lastRow + 1).Value = iCountC
End If
End Sub
Возвращает количество зеленых клеток сразу после lastRow
. Итак, если вы измените это число (от 5 до 15), оно вернется в "B16" ...
Для вашего второго запроса я использовал .Offset(0, 1)
, что означает соседнюю ячейку справа ...