Excel UDF не работи: проблеми и решения

  • Споделя Това
Michael Brown

В тази статия ще разгледаме проблемите, с които може да се сблъскате, когато използвате потребителски функции в работните си книги. Ще се опитам да ви покажа какво ги причинява и как лесно могат да бъдат решени.

Ето за какво ще говорим:

    По-рано говорихме за това какво е потребителска функция, как да я създадем и използваме. Ако смятате, че трябва предварително да опресните основните познания за UDF, направете пауза и прегледайте предишната ми статия.

    Защо Excel UDF не преизчислява?

    Когато направите промени в работната си книга, Excel няма да преизчисли всяка формула, която имате в нея. Той ще актуализира резултатите само за тези формули, които са свързани с променените клетки.

    Но това се отнася за стандартните функции на Excel. Що се отнася до персонализираните функции, Excel не може да валидира кода VBA и да идентифицира други клетки, които също биха могли да повлияят на резултата от персонализираната функция. Следователно персонализираната формула може да не се промени, когато направите промени в работната книга.

    За да отстраните проблема, трябва просто да използвате Application.Volatile Вижте следващата глава, за да научите инструкциите стъпка по стъпка как да го приложите.

    Енергозависими срещу неенергозависими потребителски функции

    По подразбиране потребителските функции в Excel не са променливи. Това означава, че UDF се преизчислява само ако стойността на някоя от клетките, към които се отнася, се промени. Но ако се промени форматът на клетките, името на работния лист, името на файла, тогава няма да настъпят промени в UDF.

    Нека да преминем от думи към примери. Например трябва да запишете името на работната си книга в клетка. За целта създавате потребителска функция:

    Функция WorkbookName() As String WorkbookName = ThisWorkbook.Name Край на функцията

    Сега си представете следния случай: написали сте потребителска формула =Име на работна книга() в клетката и получихте името на файла в нея. След известно време решихте да преименувате файла и го записахте с друго име. Но погледнахте стойността в клетката и видяхте, че тя не се е променила. Все още има старо име на файла, което вече не е правилно.

    Тъй като в тази функция няма аргументи, функцията не се преизчислява (дори ако смените името на работната книга, затворите я и след това я отворите отново).

    Забележка: За да преизчислите всички функции във файла, можете да използвате бързата клавишна комбинация Ctrl + Alt + F9.

    Има ли по-лесен начин? За да накарате формулата да се преизчислява при всяка промяна на работния лист, се нуждаете от допълнителен ред код. Поставете следната част от кода в началото на вашата функция:

    Application.Volatile

    Така кодът ви ще изглежда по следния начин:

    Функция WorkbookName() As String Application.Volatile WorkbookName = ThisWorkbook.Name Край на функцията

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

    Забележка. Имайте предвид, че твърде много нестабилни функции могат да забавят работата на Excel-а. В крайна сметка има твърде много потребителски функции, които извършват сложни изчисления и работят непрекъснато с големи диапазони от данни.

    Ето защо препоръчвам да използвате променливостта само там, където тя е наистина необходима.

    Защо потребителските функции не са налични

    Когато въведете първите букви от името на потребителска функция, тя се появява в падащия списък до входната клетка, точно както стандартните функции на Excel.

    Това обаче невинаги се случва. Какви грешки могат да причинят тази ситуация?

    Ако имате Excel 2003-2007, тогава UDF никога не се появява в падащия списък. Там можете да видите само стандартни функции.

    Но дори и да използвате по-нова версия на Excel, има още една грешка, която може да допуснете случайно.

    Виждате, че потребителската функция трябва да бъде в стандартен модул на VBA, наречен Modules (Модули). Когато добавяте нов модул, за да запишете кода на функцията, автоматично се създава папка Modules (Модули), в която се записват всички модули.

    Но понякога се случва да не се създаде нов модул. На следващата екранна снимка можете да видите, че кодът на потребителската функция е в модула "Microsoft Excel Objects" заедно с ThisWorkbook.

    Въпросът е, че не можете да поставите потребителска функция в областта за код на работен лист или работна книга. В този случай функцията няма да работи. Освен това тя няма да се появи в падащия списък с функции. Следователно кодът винаги трябва да бъде в папката Модули .

    Текстът за помощ на персонализираната функция на Excel не се показва

    Друг проблем, който може да възникне, е подсказката, която виждате, когато поставяте потребителска функция. Ако използвате стандартна функция, винаги ще виждате подсказка за функцията и за нейните аргументи. Но какво да кажем за UDF?

    Ако имате много потребителски функции, ще ви е изключително трудно да запомните какви изчисления прави всяка от тях. Още по-трудно ще е да запомните кои аргументи да използвате. Мисля, че ще е добра идея да имате описание на потребителските си функции като напомняне.

    За тази цел бих предложил да използвате Application.MacroOptions метод. Той ще ви помогне да покажете описанието не само на функцията, но и на всеки от аргументите ѝ в прозореца Function Wizard (Съветник за функции). Този прозорец се вижда, когато щракнете върху бутона Fx в лентата с формули.

    Нека видим как да добавим такава подсказка към вашите UDF-и. В предишната статия разгледахме потребителската функция GetMaxBetween. Тя намира максималното число в зададения диапазон и приема три аргумента: диапазон от числови стойности и максимална и минимална стойност за търсене.

    Сега ще добавим описание за тази потребителска функция. За целта създайте и стартирайте Application.MacroOptions команда. За GetMaxBetween можете да стартирате следната команда:

    Sub RegisterUDF () Dim strFuncName As String 'име на функцията, която искате да регистрирате Dim strDescr As String ' описание на самата функция Dim strArgs () As String 'описание на аргументите на функцията ' Регистрирайте функцията GetMaxBetween ReDim strArgs (1 To 3) 'Брой аргументи във вашата функция strFuncName = "GetMaxBetween" strDescr = "Максимален брой в посочения диапазон" strArgs (1) ="Диапазон от числови стойности" strArgs (2) = "Долна граница на интервала" strArgs (3) = "Горна граница на интервала" Application.MacroOptions Macro: = strFuncName, _ Description: = strDescr, _ ArgumentDescriptions: = strArgs, _ Category: = " My Custom Functions " End Sub

    или

    Sub RegisterUDF () Application.MacroOptions Macro: = "GetMaxBetween" , _ Description: = "Максимално число в посочения интервал" , _ Category: = "My Custom Functions" , _ ArgumentDescriptions: = Array (_ "Range of numeric values" , _ "Lower interval border" , _ "Upper interval border" ) End Sub

    Променлива str FuncName е името на функцията. strDescr - описание на функцията. strArgs променливите съдържат подсказки за всеки аргумент.

    Може би се чудите какъв е четвъртият аргумент на Application.MacroOptions. Този незадължителен аргумент се нарича Категория и посочва класа на функциите на Excel, които нашата потребителска GetMaxBetween () Можете да я наречете по името на някоя от съществуващите категории: Math & Trig, Statistical, Logical и т.н. Можете да посочите име на новата категория, в която ще поставяте създадените от вас функции. Ако не използвате аргумента Category (Категория), потребителската функция автоматично ще бъде поставена в категорията "User Defined" (Дефинирано от потребителя).

    Поставете кода на функцията в прозореца на модула:

    След това щракнете върху бутона "Изпълни". Командата ще извърши всички настройки за използване на Fx бутон с вашия GetMaxBetween() функция.

    Ако се опитате да вмъкнете функция в клетка с помощта на Функция за вмъкване инструмент, ще видите, че там е вашият GetMaxBetween Функцията се намира в категорията "Моите потребителски функции":

    Можете просто да започнете да въвеждате името на функцията в клетката и ще видите персонализираната си функция в падащия списък с функции, от които да избирате.

    След това извикайте Съветник за функции с бутона Fx.

    Съвет: Можете също така да използвате клавишната комбинация CRTL + A, за да отворите съветника за функции.

    В Съветник за функции ще видите описание на функцията, както и подсказка за първия аргумент. Ако поставите курсора върху втория или третия аргумент, също ще видите подсказки за тях.

    Ако искате да промените текста на тези подсказки, променете стойностите на strDescr и strArgs променливи в RegisterUDF () След това стартирайте RegisterUDF () команда отново.

    Ако искате да отмените всички направени настройки и да изчистите описанието на функцията, изпълнете този код:

    Sub UnregisterUDF () Application.MacroOptions Macro: = "GetMaxBetween" , _ Description: = Empty , ArgumentDescriptions: = Empty , Category: = Empty End Sub

    Има още един начин за получаване на подсказка при въвеждане на потребителска функция. Въведете името на функцията и след това натиснете клавишите Ctrl + Shift + A :

    =GetMaxBetween( + Ctrl + Shift + A

    Ще видите списък с всички аргументи на функцията:

    За съжаление, тук няма да видите описанието на функцията и аргументите ѝ. Но ако имената на аргументите са доста информативни, то те също могат да бъдат полезни. Все пак е по-добре от нищо :)

    Създаването на intellisense за UDF, които работят като стандартни функции на Excel, ще изисква малко повече работа. За съжаление Microsoft не предоставя никакви възможности. Единственото налично решение в момента е разширение Excel-DNA IntelliSense. Можете да намерите повече информация на уебсайта на разработчика.

    Надяваме се, че тези насоки ще ви помогнат да разрешите проблемите, когато вашата потребителска функция не работи или не работи така, както бихте искали. Ако все пак вашата UDF все още не работи, моля, опишете проблема си точно в раздела за коментари. Ще се опитаме да го разберем и да намерим решението за вас ;)

    Майкъл Браун е отдаден технологичен ентусиаст със страст към опростяване на сложни процеси с помощта на софтуерни инструменти. С повече от десетилетие опит в технологичната индустрия, той е усъвършенствал уменията си в Microsoft Excel и Outlook, както и в Google Sheets и Docs. Блогът на Майкъл е посветен на споделянето на неговите знания и опит с други, предоставяйки лесни за следване съвети и уроци за подобряване на продуктивността и ефективността. Независимо дали сте опитен професионалист или начинаещ, блогът на Michael предлага ценни прозрения и практически съвети за извличане на максимума от тези основни софтуерни инструменти.