Excel не видит пользовательские функции

Обновлено: 07.07.2024

Когда я добавляю общедоступную функцию в стандартный модуль кода в Excel, она отображается в мастере вставки функции в универсальной категории «Определено пользователем».

  1. Сохранить функцию общедоступной (чтобы ее можно было вызывать из других модулей), но скрыть ее от мастера функций Excel?
  2. Сделать так, чтобы функция отображалась во встроенной категории (например, «Финансы», «Статистические данные», «Логические»)?
  3. Создать мою собственную категорию (например, «Бессмысленный») и отображать ли там мою функцию?

Мне нужно только уметь заставить работать один из приведенных выше случаев, но мне было бы любопытно узнать, возможен ли каждый из них.

Примечание. Я с удовольствием разделю этот вопрос на три отдельных вопроса, если сообщество сочтет это более подходящим. Я думаю, что среди трех вопросов может быть один ответ с небольшими вариациями.

4 ответа

Application.MacroOptions - это команда, которая вам нужна

В этом примере пользовательский макрос с именем TestMacro добавляется в настраиваемую категорию с именем Моя настраиваемая категория .

Общедоступные функции видны только в строке формул Excel, если они находятся в «обычном» модуле * .bas. Открытые функции, принадлежащие классам, не отображаются в строке формул. Если вы добавите это вместе с тем фактом, что мы можем моделировать статический класс, вы можете эффективно скрыть функции.

Если вы создадите модуль класса, а затем экспортируете его, вы найдете Attribute VB_PredeclaredId = False в заголовке. Установка этого значения в true создает глобальный экземпляр класса по умолчанию, который можно использовать так же, как статический класс на более современном языке.

Например, создайте новый модуль класса с именем Math и добавьте к нему эту функцию.

Экспортируйте и удалите файл, затем откройте его в блокноте. Измените предварительно объявленный идентификатор на true.

Сохраните и импортируйте файл обратно в свой проект.

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

Я ответил на это в foonote на вопрос о функциях даты VBA: вот прямая копия того, что я там написал, об использовании операторов VB 'Attribute' для создания описаний функций и идентификатора категории мастера функций :

Совет для людей, все еще использующих Excel 2003:

Если вы (или ваши пользователи) собираетесь вызвать IsDateEx () из рабочего листа, поместите эти две строки сразу под заголовком функции, используя текстовый редактор в экспортированном файле .bas и повторно импортируя файл, потому что атрибуты VB полезны , но они недоступны для редактора кода в Excel VBA IDE:

Атрибут IsDateEx.VB_Description = "Возвращает ИСТИНА, если TestDate. является датой и находится в пределах ± 20 лет от системной даты. \ r \ nИзмените установить по умолчанию границы ± 20 лет, установив значения для LimitPastDays и LimitFutureDays \ r \ nЕсли вы проверяете массив дат, будут проверены ВСЕ значения: установите FirstColumnOnly TRUE в проверьте только крайний левый столбец ".

Это все одна строка: следите за переносом строки, вставленным браузером! . И эта строка, которая помещает isDateEX в мастер функций в категорию 'Информация', рядом с ISNUMBER (), ISERR (), ISTEXT () и так далее:

Attribute IsDateEx.VB_ProcData.VB_Invoke_Func = "w\n9"

Используйте "w \ n2", если вы предпочитаете видеть его в функциях даты и времени: это лучше, чем потерять его в болоте функций "Используемые определения" из вашего собственного кода и всех этих сторонних надстроек, разработанных людьми. которые делают недостаточно, чтобы помочь случайным пользователям.

Я понятия не имею, работает ли это по-прежнему в Office 2010.

. И это все, что я могу предложить. Категории мастера функций и связанные с ними дескрипторы функций (и параметров!) На самом деле недоступны для разработчиков VBA. Некоторые из них доступны программистам VB старой школы, у которых в своей среде IDE есть доступ к операторам VB.Attribute; и вы можете как бы вставить его в свой код, немного манипулируя текстовым файлом.

Есть ли способ [. ] сохранить функцию общедоступной (чтобы ее можно было вызывать из других модулей), но скрыть ее от мастера функций Excel?

Я проверяю по шагам, как идет выполнение процедуры. И все получается отлично, в окне Immediate значение правильное, в ячейку выводится то же правильное значение. А напрямую в листе функция не работает.

В чем может быть причина?

__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь

Не могу вызвать пользовательскую функцию в ячейке на листе
Добрый день. Есть код расчета эксп. взв. скользящей средней, но что-то он не работает. Кто-нить.

Не могу вызвать пользовательскую функцию
Всем привет. Народ, написал я вот такую функцию - она возвращает количество дней месяца даты.

Вызвать пользовательскую функцию в меню
Если добавить следующий код в def initUI(self), то появится два меню: первая с именем Exit, а.


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

а как саму функцию пошагово прогнать не через создание процедуры? в vba в коде функции на поле слева кликните ЛКМ, должна появится красная точка (это точка останова)
на листе становитесь в формулу и жмете ввод.

функция отработает до точки останова и дальше можно идти стандартно F8.

Добавлено через 1 минуту
Hugo121, в той теме писали про станд. модуль. Вот и подумал раз в той теме вопрос закрыт то ТС перенс код в модуль. Файла нет, негде проверить.

Я перенес код в стандартный модуль.
При нажатии F8 в каком-то бы ни было месте в функции, пошаговый режим не запускается, именно поэтому я вызываю её для пошаговой проверки через процедуру.

Файл я могу выслать, если Вам будет не лень в нем копаться

Ставите в коде функции точку останова, ну или просто пишите где-то в начале строку
далее вызываете функцию на листе, попадаете в код, гоните дальше пошагово.

Решение

; - это правильный разделитель аргументов?

Добавлено через 46 секунд
Ну и вижу что пошаговый нормально отрабатывает

Сработало!
Действительно, в коде была одна строчка, которая записывала промежуточное значение в ячейку на другом листе и почему-то код просто на ней прерывался! Я её закомментил и все начало работать!

Спасибо огромное, Vlad999 и Hugo121!

UDF с листа ничего не могут писать в другие ячейки листов!
Ну есть одно кривое исключение. но оно подверждает правило


Создать пользовательскую функцию MS Excel и воспользоваться ей в формулах, размещаемых на рабочем листе
создать пользовательскую функцию MS Excel и воспользоваться ей в формулах, размещаемых на рабочем.

Создать пользовательскую функцию в vba
Помогите пожалуйста решить! Создать пользовательскую функцию решения. Исходные данные для решения.

В VBA создать пользовательскую функцию
Дело в общем вот в чем, девушка, которая мне очень нравиться, учится в университете на гуманитарной.

Данные должны отображаться на другом листе в одной ячейке (без использования VBA)
Доброго времени суток. :) У меня такой вопрос возник. Есть таблица, например, (А1:Е100), и из.

С помощью математических функций VBA составить пользовательскую функцию для вычисления выражения
С помощью математических функций VBA составить пользовательскую функцию для вычисления выражения.

Вариант 1
Отключить в Excel защищенный просмотр для файлов из Интернета
Файл (File) -Параметры (Options) -Центр управления безопасностью (Trust Centr) -Параметры центра управления безопасностью (Trust Centr Settings) -Защищенный просмотр(Protected View) -снять флажок с Включить защищенный просмотр для для файлов из Интернета (Enable Protected View for files originating from the Internet)
Надо понимать, что сработает только если надстройки были скачаны с интернета. Хотя обновление безопасности итак только для таких файлов запрет ставит.

Надежные расположения

Вариант 2
Добавить папку с нужной надстройкой/надстройками в Надежные расположения
Файл (File) -Параметры (Options) -Центр управления безопасностью (Trust Centr) -Параметры центра управления безопасностью (Trust Centr Settings) -Надежные расположения (Trusted Locations) -Добавить новое расположение (Add new location) . В диалоговом окне выбрать папку, в которой хранится файл надстройки. Можно поставить галочку Так же доверять всем вложенным папкам (Subfolders of this location are also trusted) , если это необходимо(например, если у вас одна папка с надстройками, но надстройки поделены на категории и каждая в своей подпапке).

Убедиться, что галочка Отключить все надежные расположения отключена (Disable All Trusted Locations) .
Эти два варианта не рекомендуется самим Microsoft, т.к. потенциально снижают безопасность. Хотя для второго пункта очевидно, что надо просто не кидать в надежные расположения все файлы подряд.

Вариант 3
Разблокировать файл

Разблокировать

  1. полностью закрыть Excel(все файлы и приложение целиком)
  2. перейти в папку с нужной надстройкой и найти там файл надстройки
  3. правая кнопка мыши по файлу -Свойства. На вкладке Общие нажать кнопку Разблокировать(так же это может быть флажок блокировки - тогда его надо снять)
  4. нажать кнопку Применить -OK

Проделать действие со всеми нужными файлами надстроек.

Вариант 4
Небольшой финт , за который отдельное спасибо Захарову Владимиру, известному на форумах под ником ZVI

  1. полностью закрыть Excel(все файлы и приложение целиком)
  2. перейти в папку с нужной надстройкой и найти там файл надстройки
  3. запаковать в ZIP или RAR архив файл надстройки, удалить саму надстройку и затем извлечь из архива файл надстройки обратно в ту же папку

Вариант 5
Еще один финт , за который опять же спасибо Захарову Владимиру(ZVI)

Если вы забыли пароль на лист, то можете воспользоваться командой моей надстройки MulTEx - Снять защиту с листа(без пароля). Надстройка платная, но есть ДЕМО период на один месяц, которого должно хватить, чтобы снять защиту с одного листа.

Строка формул

Причина третья - Запрещен ввод напрямую в ячейках
И самая экзотическая причина - редактирование напрямую в ячейках запрещено. Это значит, что редактировать значение ячеек напрямую на листе нельзя, однако через строку формул это действие допускается без проблем и ограничений(при условии, что озвученные выше причины отсутствуют).
Где расположена строка формул:

В таком случае надо проверить следующие настройки:

  • для Excel 2003: Сервис -Параметры -вкладка Правка -установить флажок Правка прямо в ячейке
  • для Excel 2007: Кнопка Офис -Параметры Excel (Excel Options) -Дополнительно (Advanced) -установить флажок Разрешить редактирование в ячейках (Allow Editing Directly in the Cells)
  • для Excel 2010 и выше: Файл (File) -Параметры (Options) -Дополнительно (Advanced) -установить флажок Разрешить редактирование в ячейках (Allow Editing Directly in the Cells)
  • Excel 2003:
    Сервис-Безопасность-Уровень макросов "Высокий"
  • Excel 2007:
    Кнопка Офис-Параметры Excel (Excel Options) -Центр управления безопасностью (Trust Centr) -Параметры центра управления безопасностью (Trust Centr Settings) -Параметры макросов (Macro Settings) -Отключить все макросы без уведомления (Disable All Macros without notification)
  • Excel 2010 и выше:
    Файл (File) -Параметры (Options) -Центр управления безопасностью (Trust Centr) -Параметры центра управления безопасностью (Trust Centr Settings) -Параметры макросов (Macro Settings) -Отключить все макросы без уведомления (Disable All Macros without notification)

После изменения параметров безопасности макросов необходимо перезапустить приложение Excel: закрыть его полностью и открыть заново. Только после этого изменения вступят в силу.

О том, что такое модуль листа и где его искать можно прочитать в статье: Что такое модуль? Какие бывают модули?

Причина пятая - мы где-то про что-то забыли
А это уже скорее некий перечень действий, которые тоже не мешает проверить.

Читайте также: