Функция, которая использует другие ячейки, не может стать функцией формулы (UDF) в Excel, потому что она нарушает модель зависимостей Excel (все зависимости ячеек должны быть явными в формуле).Однако формула может использовать значения ячеек в качестве входных данных.
Вот простая функция, добавленная к модулю в VBA:
Public Function testFunction(inputValue As Integer) As Integer
testFunction = inputValue * 2
End Function
Это можно использовать в любой формуле ячейки.Например, =testFunction(4)
или =testFunction(A5)
.
РЕДАКТИРОВАТЬ
Хорошо, просмотрите комментарий, который вы сделали против ответа гитариста.Формула может отправить ответ только в ячейку, в которой она находится, - она не может отправить ответ в другую ячейку.Поэтому, если формула является вашим единственным выбором, в ячейке A1 должна быть формула, которая считывает входные данные из C1 .
Формула в A1:
=a(C1)
Функция в модуле:
Public Function a(string col)
a = iif(col = "ok", "1", "2")
End Function
Однако, если возникла проблема с вводом формулы в A1 , у вас останется процесс, управляемый вручную (кнопка листа,кнопка на панели инструментов и т. д., чтобы выдвинуть эти значения) или событие изменения ячейки рабочего листа.Недостатком события рабочего листа является то, что оно запускает каждое изменение ячейки, поэтому вам нужно держать код легким и не выполнять какую-либо тяжелую работу - или, если вы это сделаете, делать это редко.
Вы бы добавилиновая подпрограмма к рабочему листу:
Private Sub Worksheet_Change(ByVal Target As Range)
Запускается при изменении ячеек;измененные ячейки обозначены диапазоном Target
.Ваш код обновит ячейки столбца A, если в Target содержатся ячейки столбца C.Это больше работы, чем подход на основе формул, но он делает процесс полностью автоматическим.У меня нет доступа к Excel прямо сейчас, поэтому следующее только из памяти и фрагментов Googled, не проверенных:
For Each cCell In Application.Intersect(Target, Me.Range("C1:C5"))
cCell.Offset(, -2).Value = iif(cCell.Value = "ok", "1", "2")
Я бы предпочел не использовать явные диапазоны, а именованный диапазон, так как это делает ваш код менеехрупкий, чтобы измениться.Но это сделало бы поиск соответствующей ячейки столбца A более сложным для определения, и я не собираюсь пытаться использовать этот код без Excel =)