Как вызвать функцию VBA из ячеек Excel (2010)?
Я определил несколько функций в книге с помощью VBA, а затем ожидал, что смогу использовать их в Формуле ячейки, но Excel не распознает функцию. Я просто получаю #NAME?
пробовал:
- поняв, что я создал файл XSLX, я преобразовал его в файл XSLM. Не получилось.
- удалены все типы из объявления функции. Не получилось.
- переместил функцию в модуль рабочего листа VBA. Не получилось.
- добавил Public to the declaration. Не получилось.
что я упустил?
это тоже не умный код:
Function Square2(AnyNumber)
'return the square of any integer
Square2 = AnyNumber * AnyNumber
End Function
9 ответов
ответ
размещение функции в области "ThisWorkbook" может привести к #NAME?
проблема. Создать новый модуль (щелкните правой кнопкой мыши на папке VBAProject, вставить, новый модуль)
и поставьте вместо этого функцию.
шаги
- откройте редактор VBA (
Alt + F11
в Windows /Fn + Option + F11
на Mac) - щелкните правой кнопкой мыши виде vbaproject
- выберите Вставить >> Модуль
-
создать а
Я столкнулся с той же проблемой, после борьбы вокруг следующего работал для меня:
моя функция была внутри модуля в книге макросов под названием Personal.Файл xlsb. Я поставил префикс имени функции с именем файла личной книги макросов и !, поэтому, если имя функции-это функция (x, y), которую я ввел в ячейку "=PERSONAL.Файл xlsb!функция (x, y). Это сработало.
пожалуйста, обратите внимание, что личное.XLSB всегда открыт в скрытом режиме для меня.
убедитесь, что вы не находитесь в режиме проектирования.
на вкладке разработчик в excel и рядом с кнопками run/stop в Редакторе VBA есть кнопка режима проектирования. Если он выбран и не позволяет снять его, попробуйте снова открыть книгу с включенными макросами.
Если он все еще включен или не позволяет запускать макросы, убедитесь, что макросы включены.
активировать макросы.
У меня была идентичная проблема, включая рабочую функцию, которая позже перестала работать с ошибкой #NAME. Мне удалось исправить, чтобы оба, убедившись, что имя модуля не совпадает с именем функции. У меня была рабочая функция F_1 в Module1, я изменил имя модуля на F_1, и он перестал работать, теперь вернулся в Module1, и функция снова работает. Моя вторая функция также начала работать, когда я изменил имя модуля с F_2 на Module2.
XLSX-файл и XLSM-файлы не имеют к этому никакого отношения. Формат играет роль при сохранении файла. (В XLSX код VBA будет удален при сохранении файла).
приведенный ниже код из http://office.microsoft.com/en-us/excel-help/creating-custom-functions-HA001111701.aspx работает довольно хорошо внутри нового модуля в моем excel.
Function Discount(quantity, price)
If quantity >= 100 Then
Discount = quantity * price * 0.1
Else
Discount = 0
End If
Discount = Application.Round(Discount, 2)
End Function
учитывая, что я не вижу ваш код, можете ли вы попробовать, работает ли для вас функция ниже? Если это так, начните изменять функция ниже, чтобы она стала вашей функцией (например, сначала измените имя и посмотрите, работает ли она, а затем измените количество параметров и проверьте, работает ли она, а затем измените имя параметров).
Я открыл Excel, открыл редактор кода (Alt+F11), выбрал новую книгу, вставил новый модуль, набрал
Function Decrement(i As Integer) As Integer
Decrement = i - 1
End Function
затем вернулся к моей книге и в A1 набрал =Decrement (2) и нажал Enter, и это сработало. Декремент появился в раскрывающемся списке функций, когда я набрал =Decr... Было признано, и это сработало. Мне даже не пришлось спасать тетрадь.
Я знаю, что это не совсем ответ на ваш вопрос, но это рецепт мне повезло с.
Я думаю, что может возникнуть проблема, если ваш модуль имеет то же имя, что и ваша функция. Попробуйте переименовать модуль или функцию.
Если вы используете последние версии Excel, чтобы увидеть функции VBA в другой книге, вам нужно:
- сохранить книги как .файл xlsm
- включить макросы, как предложено выше
-
установить ссылку. В VBA (Alt-F11) выберите инструменты/ссылки, затем перейдите к книге, которая содержит макрос, который вы хотите использовать. Проверьте эту ссылку в списке.
Если вы получаете сообщение об ошибке о столкновении имен модулей, просто переименуйте его сначала в обозревателе проектов.