Excel не видит пользовательские функции
Обновлено: 07.07.2024
Когда я добавляю общедоступную функцию в стандартный модуль кода в Excel, она отображается в мастере вставки функции в универсальной категории «Определено пользователем».
- Сохранить функцию общедоступной (чтобы ее можно было вызывать из других модулей), но скрыть ее от мастера функций Excel?
- Сделать так, чтобы функция отображалась во встроенной категории (например, «Финансы», «Статистические данные», «Логические»)?
- Создать мою собственную категорию (например, «Бессмысленный») и отображать ли там мою функцию?
Мне нужно только уметь заставить работать один из приведенных выше случаев, но мне было бы любопытно узнать, возможен ли каждый из них.
Примечание. Я с удовольствием разделю этот вопрос на три отдельных вопроса, если сообщество сочтет это более подходящим. Я думаю, что среди трех вопросов может быть один ответ с небольшими вариациями.
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, а.
не получается вызвать пользовательскую функцию
есть пользовательская функция для ввода определенной строки после проверок, как только.
на листе становитесь в формулу и жмете ввод.
функция отработает до точки останова и дальше можно идти стандартно 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
Разблокировать файл
- полностью закрыть Excel(все файлы и приложение целиком)
- перейти в папку с нужной надстройкой и найти там файл надстройки
- правая кнопка мыши по файлу -Свойства. На вкладке Общие нажать кнопку Разблокировать(так же это может быть флажок блокировки - тогда его надо снять)
- нажать кнопку Применить -OK
Проделать действие со всеми нужными файлами надстроек.
Вариант 4
Небольшой финт , за который отдельное спасибо Захарову Владимиру, известному на форумах под ником ZVI
- полностью закрыть Excel(все файлы и приложение целиком)
- перейти в папку с нужной надстройкой и найти там файл надстройки
- запаковать в 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: закрыть его полностью и открыть заново. Только после этого изменения вступят в силу.
О том, что такое модуль листа и где его искать можно прочитать в статье: Что такое модуль? Какие бывают модули?
Причина пятая - мы где-то про что-то забыли
А это уже скорее некий перечень действий, которые тоже не мешает проверить.
Читайте также: