Я новичок в VBA, поэтому я мог делать что-то совершенно неправильно, или это также могло быть просто нелепой маленькой ошибкой / отсутствием знаний. Так что, если у вас есть более простой способ сделать то, что я хотел бы сделать (поясняется ниже), я открыт для любого решения.

Итак, я хочу подсчитать ячейки с определенным цветом фона.

Для этого у меня есть это в модуле:

Function CountCellsByColor(rData As Range, cellRefColor As Range) As Long
    Dim indRefColor As Long
    Dim cellCurrent As Range
    Dim cntRes As Long
    Application.ScreenUpdating = False

    Application.Volatile
    cntRes = 0
    indRefColor = cellRefColor.Cells(1, 1).Interior.Color
    For Each cellCurrent In rData
        If indRefColor = cellCurrent.Interior.Color Then
            cntRes = cntRes + 1
        End If
    Next cellCurrent

    CountCellsByColor = cntRes
    Application.ScreenUpdating = True
End Function

Он работает, он считает определенные ячейки с помощью =CountCellsByColor(B2:B83,H2) (B2:B83 - это диапазон, H2 - это ячейка, которую я использую в качестве примера этого цвета фона. Я считаю C2:C83 и D2:D83 также в отдельных ячейках)

Но я бы хотел, чтобы он выполнялся автоматически, когда цвет фона ячейки изменяется в заданном диапазоне.

Для этого в коде рабочего листа я поместил это:

Public Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$B$2:$D$83" Then
        Application.EnableEvents = False
        Call CountCellsByColor()
        Application.EnableEvents = True
    End If
End Sub 

Но я получаю сообщение об ошибке «ошибка компиляции: аргумент не является необязательным»

Как вы думаете, я должен заставить его работать автоматически? Как мне вызвать функцию в этой подпрограмме?

0
Alex Findley 11 Окт 2019 в 16:52
Не могли бы вы также показать пример того, как, по вашему мнению, это должно называться? Я не уверен, с чем у вас проблемы? Или, если при попытке вы получили сообщение об ошибке, что в нем говорилось?
 – 
Mistella
11 Окт 2019 в 17:09
Я считаю, что Call обесценивается, и в этом нет необходимости.
 – 
Mistella
11 Окт 2019 в 17:09
Что я пробовал: `` 'Public Sub Worksheet_Change (ByVal Target As Range) If Target.Address = "$ B $ 2: $ D $ 83" Then Application.EnableEvents = False Call CountCellsByColor () Application.EnableEvents = True End If End Sub '`` Я получил ошибку компиляции: аргумент, а не необязательное сообщение об ошибке.
 – 
Alex Findley
11 Окт 2019 в 17:13
Изменение рабочего листа не происходит при изменении цвета ячеек. Если это ваш макрос, который меняет цвета, вызовите там свою функцию
 – 
urdearboy
11 Окт 2019 в 17:13
3
@Alex, как вы понимаете, автоматически реагировать на изменение цвета ячейки сложно и не решается никакими средствами. Вам лучше пересмотреть свой дизайн. Если вы опубликуете почему вы хотите это сделать, мы сможем предложить альтернативу.
 – 
chris neilsen
11 Окт 2019 в 17:31

2 ответа

Диапазон ("I4"). Значение = CountCellsByColor (Range ("B2: D83"), Range ("H2"))

Это вызовет вашу функцию, однако, как сказал Крис Нилсен, я бы держался подальше от события Change.

0
Eric Moon 11 Окт 2019 в 18:06

Итак, есть множество мелких деталей, требующих уточнения.

Во-первых, функция Worksheet_Change не фиксирует изменения цвета. Если цвет меняется из-за написанной вами функции / подпрограммы, вы должны вызвать свою функцию там, где происходит изменение. Если изменение выполняется пользователем, лучшая ссылка, которую я нашел, - это эту ссылку.


Во-вторых, оператор if If Target.Address = "$B$2:$D$83" Then вернет истину только в том случае, если "Target" - это все эти ячейки. Если целью является только одна или несколько ячеек из этого диапазона, оператор if вернет false. Я бы порекомендовал if-statement больше вроде:

If Not Intersect(Target, Target.Worksheet.Range("B2:D83")) Is Nothing

В-третьих, вам нужно добавить параметры к вызову функции, например:

CountCellsByColor(Target.Worksheet.Range("B2:D83"),Target.Worksheet.Range("H2"))

Target.Worksheet относится к рабочему листу, на котором находится цель. .Range переходит к ячейкам на выбранном листе, а "B2:D83" - это адреса желаемых ячеек.

Однако обратите внимание, что в настоящее время это не будет назначать вывод CountCellsByColor чему-либо, поэтому результат будет потерян, если вы не назначите его переменной или ячейке рабочего листа.

0
Mistella 11 Окт 2019 в 19:19