В этом примере мы создадим собственную функцию IF , которая может быть использована в расчетах на рабочем листе, подобно к Excel функций.
Чтобы отобразить значение (B2) если ячейка (C2) имеет значение ("YES"), мы могли бы использовать функцию IF в формуле = IF (C2 = "YES", B2,0) :
Нашей целью в этом случае является создание функции, которая могла бы делать это = IF (C2 has a green background, B2,0) , и которую мы бы записали, типа: =IF_GREEN(C2,B2):
Начнем создавать функцию:
Function IF_GREEN(paid As Range, amount) End Function
Аргументы:
В данном случае, если проверка выдает FALSE , значение всегда будет 0, поэтому нет причин прописывать аргумент для этого.
Чтобы проверить, что цвет является правильным, вы можете использовать ячейку, которая содержит необходимый вам цвет:
Function IF_GREEN(paid As Range, amount) green_color = Sheets("Sheet1").Range("K1").Interior.color End Function
Но, чтобы избежать необходимости использовать другую ячейку для этой цели мы будем использовать номер цвета, который нам нужен здесь:
Function IF_GREEN(paid As Range, amount) green_color = 5296274 'Зеленый End Function
Чтобы определить номер цвета фона ячейки, выделите ячейку и запустите макрос:
Sub test_color() MsgBox ActiveCell.Interior.color End Sub
Теперь, все что нам необходимо сделать, это проверить цвет ячейки используя IF:
Function IF_GREEN(paid As Range, amount) Application.Volatile green_color = 5296274 'Зеленый If paid.Interior.color = green_color Then 'ЕСЛИ ПРАВДА IF_GREEN = amount Else 'ЕСЛИ ЛОЖЬ IF_GREEN = 0 End If End Function
Теперь наша функция готова к использованию.
Application.Volatile говорит нам, что приложение является меняющимся (как это имеет место для функции IF ). Это означает, что она должна быть перечислена каждый раз, когда значение изменяется. Например, если вы измените любую из сумм (или, на самом деле, любую другую ячейку), эта функция будет перечислена и правильная сумма будет отражена.
Однако, изменение заливки ячейки не является событием, которое запускает перерасчет. Чтобы заставить эксель перечислить значения, вы можете выбрать пустую ячейку и нажать "Удалить" или добавить кнопку "Обновить", которая все будет обновлять, когда вы ее будете нажимать:
Sub refresh_macro() Application.Calculate End Sub
Ниже есть другой способ написания такой же функции:
Function IF_GREEN(paid As Range, amount) Application.Volatile IF_GREEN = 0 'ЕСЛИ ЛОЖЬ If paid.Interior.color = 5296274 Then IF_GREEN = amount 'ЕСЛИ ПРАВДА End Function
Вы можете скачать Excel файл, содержащий этот пример, нажав здесь.