Excel UDF nefunguje: problémy a riešenia

  • Zdieľajte To
Michael Brown

V tomto článku sa pozrieme na problémy, s ktorými sa môžete stretnúť pri používaní vlastných funkcií v zošitoch. Pokúsim sa vám ukázať, čo ich spôsobuje a ako ich možno jednoducho vyriešiť.

O čom budeme hovoriť:

    Predtým sme hovorili o tom, čo je to vlastná funkcia, ako ju vytvoriť a používať. Ak máte pocit, že si predtým potrebujete osviežiť základné znalosti o UDF, urobte si prestávku a prečítajte si môj predchádzajúci článok.

    Prečo sa neprepočítava Excel UDF?

    Keď v zošite vykonáte akékoľvek zmeny, Excel neprepočíta každý vzorec, ktorý tam máte. Aktualizuje výsledky len pre tie vzorce, ktoré sú spojené so zmenenými bunkami.

    To sa však týka štandardných funkcií programu Excel. Pokiaľ ide o vlastné funkcie, program Excel nedokáže overiť kód VBA a identifikovať iné bunky, ktoré by tiež mohli ovplyvniť výsledok vlastnej funkcie. Preto sa váš vlastný vzorec nemusí zmeniť, keď vykonáte zmeny v zošite.

    Ak chcete tento problém vyriešiť, stačí použiť Aplikácia.Volatile Pozrite si ďalšiu kapitolu, kde sa dozviete podrobné pokyny na jeho použitie.

    Prchavé a neprchavé vlastné funkcie

    V predvolenom nastavení nie sú vlastné funkcie v programe Excel nestále. To znamená, že UDF sa prepočíta len vtedy, ak sa zmení hodnota niektorej z buniek, na ktoré sa vzťahuje. Ak sa však zmení formát buniek, názov pracovného hárka alebo názov súboru, v UDF sa nevykonajú žiadne zmeny.

    Prejdime od slov k príkladom. Potrebujete napríklad zapísať názov zošita do bunky. Na tento účel vytvoríte vlastnú funkciu:

    Funkcia WorkbookName() As String WorkbookName = ThisWorkbook.Name Koniec funkcie

    Teraz si predstavte nasledujúci prípad. Napísali ste vlastný vzorec =Názov pracovného zošita() do bunky a dostali ste tam názov súboru. O chvíľu ste sa rozhodli súbor premenovať a uložili ste ho s iným názvom. Pozriete sa však na hodnotu v bunke a vidíte, že sa nezmenila. Stále je tam starý názov súboru, ktorý už nie je správny.

    Keďže v tejto funkcii nie sú žiadne argumenty, funkcia sa neprepočíta (ani keď zmeníte názov zošita, zatvoríte ho a potom ho znova otvoríte).

    Poznámka: Ak chcete prepočítať všetky funkcie v súbore, môžete použiť klávesovú skratku Ctrl + Alt + F9.

    Existuje jednoduchší spôsob? Aby sa vzorec prepočítal pri každej zmene pracovného hárka, potrebujete ďalší riadok kódu. Na začiatok funkcie vložte nasledujúci kus kódu:

    Aplikácia.Volatile

    Váš kód teda bude vyzerať takto:

    Funkcia WorkbookName() As String Application.Volatile WorkbookName = ThisWorkbook.Name End Function

    Teraz je váš UDF nestály, preto sa automaticky prepočíta, ak sa prepočítala niektorá bunka v pracovnom hárku alebo došlo k akejkoľvek zmene v zošite. Hneď ako zmeníte názov súboru, okamžite uvidíte túto aktualizáciu.

    Poznámka: Majte na pamäti, že príliš veľa nestálych funkcií môže spomaliť váš Excel. Existuje totiž príliš veľa vlastných funkcií, ktoré vykonávajú zložité výpočty a nepretržite pracujú s veľkými rozsahmi údajov.

    Preto odporúčam používať volatilitu len tam, kde je to naozaj potrebné.

    Prečo nie sú k dispozícii vlastné funkcie

    Keď zadáte prvé písmená názvu vlastnej funkcie, zobrazí sa v rozbaľovacom zozname vedľa vstupnej bunky rovnako ako štandardné funkcie programu Excel.

    Nie vždy sa to však stáva. Aké chyby môžu spôsobiť túto situáciu?

    Ak máte Excel 2003-2007, potom sa UDF nikdy nezobrazí v rozbaľovacom zozname. Tam sa zobrazujú len štandardné funkcie.

    Ale aj keď používate novšiu verziu programu Excel, môžete sa náhodne dopustiť ďalšej chyby.

    Vidíte, že vlastná funkcia musí byť v štandardnom module VBA s názvom Modules. Keď pridáte nový modul na zápis kódu funkcie, automaticky sa vytvorí priečinok Modules, v ktorom sú zapísané všetky moduly.

    Niekedy sa však stáva, že sa nový modul nevytvorí. Na ďalšej snímke obrazovky vidíte, že kód vlastnej funkcie je v module "Microsoft Excel Objects" spolu s modulom ThisWorkbook.

    Ide o to, že vlastnú funkciu nemôžete umiestniť do oblasti kódu pracovného hárka alebo zošita. V takom prípade funkcia nebude fungovať. Okrem toho sa nezobrazí v rozbaľovacom zozname funkcií. Preto by mal byť kód vždy v priečinku Moduly .

    Text nápovedy k vlastnej funkcii programu Excel sa nezobrazuje

    Ďalším problémom môže byť nápoveda, ktorá sa zobrazí, keď vložíte vlastnú funkciu. Ak použijete štandardnú funkciu, vždy sa zobrazí nápoveda pre funkciu a jej argumenty. Ale čo UDF?

    Ak máte veľa vlastných funkcií, bude pre vás nesmierne ťažké zapamätať si, aké výpočty každá z nich vykonáva. Ešte ťažšie bude zapamätať si, ktoré argumenty použiť. Myslím, že bude dobré mať popis vlastných funkcií ako pripomienku.

    Na tento účel by som odporúčal použiť Application.MacroOptions metóda. Pomôže vám zobraziť popis nielen funkcie, ale aj jednotlivých jej argumentov v okne Sprievodca funkciou. Toto okno sa zobrazí po kliknutí na tlačidlo Fx v paneli vzorcov.

    Pozrime sa, ako takúto nápovedu pridať do vašich UDF. V predchádzajúcom článku sme sa zaoberali vlastnou funkciou GetMaxBetween. Táto funkcia nájde maximálne číslo v zadanom rozsahu a preberá tri argumenty: rozsah číselných hodnôt a maximálnu a minimálnu hodnotu, ktorú má hľadať.

    Teraz pridáme popis tejto vlastnej funkcie. Ak to chcete urobiť, vytvorte a spustite Application.MacroOptions príkaz. Pre GetMaxBetween môžete spustiť nasledujúci príkaz:

    Sub RegisterUDF () Dim strFuncName As String 'názov funkcie, ktorú chcete zaregistrovať Dim strDescr As String ' popis samotnej funkcie Dim strArgs () As String 'popis argumentov funkcie ' Zaregistrujte funkciu GetMaxBetween ReDim strArgs (1 To 3) 'Počet argumentov vo vašej funkcii strFuncName = "GetMaxBetween" strDescr = "Maximálny počet v zadanom rozsahu" strArgs (1) ="Rozsah číselných hodnôt" strArgs (2) = "Dolná hranica intervalu " strArgs (3) = " Horná hranica intervalu " Application.MacroOptions Macro: = strFuncName, _ Description: = strDescr, _ ArgumentDescriptions: = strArgs, _ Category: = " Moje vlastné funkcie " End Sub

    alebo

    Sub RegisterUDF () Application.MacroOptions Makro: = "GetMaxBetween" , _ Description: = "Maximálne číslo v zadanom rozsahu" , _ Category: = "Moje vlastné funkcie" , _ ArgumentDescriptions: = Array (_ "Rozsah číselných hodnôt" , _ "Dolná hranica intervalu" , _ "Horná hranica intervalu" ) End Sub

    Variabilné str FuncName je názov funkcie. strDescr - opis funkcie. strArgs premenné obsahujú hinty pre každý argument.

    Možno vás zaujíma, čo je štvrtým argumentom príkazu Application.MacroOptions. Tento nepovinný argument má názov Kategória a označuje triedu funkcií Excelu, ktoré naša vlastná GetMaxBetween () bude funkcia umiestnená. Môžete ju pomenovať podľa niektorej z existujúcich kategórií: Math & Trig, Statistical, Logical atď. Môžete zadať názov novej kategórie, do ktorej budete umiestňovať vytvorené funkcie. Ak nepoužijete argument Category, potom bude vlastná funkcia automaticky umiestnená do kategórie "User Defined".

    Vložte kód funkcie do okna modulu:

    Potom kliknite na tlačidlo "Spustiť". Príkaz vykoná všetky nastavenia pre používanie Fx tlačidlo s vašou GetMaxBetween() funkcie.

    Ak sa pokúsite vložiť funkciu do bunky pomocou Vložiť funkciu nástroj, uvidíte, že je tu váš GetMaxBetween Funkcia sa nachádza v kategórii "Moje vlastné funkcie":

    Stačí začať písať názov funkcie do bunky a v rozbaľovacom zozname funkcií sa zobrazí vaša vlastná funkcia, z ktorej si môžete vybrať.

    Potom zavolajte Sprievodca funkciami pomocou tlačidla Fx.

    Tip. Na otvorenie sprievodcu funkciami môžete použiť aj kombináciu klávesov CRTL + A.

    V Sprievodca funkciami sa zobrazí opis funkcie a nápoveda pre prvý argument. Ak umiestnite kurzor na druhý alebo tretí argument, zobrazí sa aj nápoveda pre ne.

    Ak chcete zmeniť text týchto nápovedí, zmeňte hodnoty strDescr a strArgs premenné v RegisterUDF () Potom spustite RegisterUDF () znovu príkaz.

    Ak chcete zrušiť všetky vykonané nastavenia a vymazať popis funkcie, spustite tento kód:

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

    Existuje ešte jeden spôsob, ako získať nápovedu pri zadávaní vlastnej funkcie. Zadajte názov funkcie a potom stlačte klávesovú skratku Ctrl + Shift + A :

    =GetMaxBetween( + Ctrl + Shift + A

    Zobrazí sa zoznam všetkých argumentov funkcie:

    Bohužiaľ tu neuvidíte popis funkcie a jej argumentov. Ale ak sú názvy argumentov dosť informatívne, tak by mohli byť tiež užitočné. Stále je to lepšie ako nič :)

    Vytvorenie intellisense pre UDF, ktoré fungujú ako štandardné funkcie Excelu, si vyžiada trochu viac práce. Microsoft bohužiaľ neposkytuje žiadne možnosti. Jediným dostupným riešením je v súčasnosti rozšírenie Excel-DNA IntelliSense. Viac informácií nájdete na webovej stránke vývojára.

    Dúfame, že tieto pokyny vám pomôžu vyriešiť problémy, keď vaša vlastná funkcia nefunguje alebo nefunguje tak, ako by ste chceli. Ak však vaša UDF stále nefunguje, popíšte svoj problém presne v časti Komentáre. Pokúsime sa na to prísť a nájsť riešenie ;)

    Michael Brown je nadšený technologický nadšenec s vášňou pre zjednodušovanie zložitých procesov pomocou softvérových nástrojov. S viac ako desaťročnými skúsenosťami v technologickom priemysle si zdokonalil svoje zručnosti v programoch Microsoft Excel a Outlook, ako aj Tabuľky Google a Dokumenty. Michaelov blog je venovaný zdieľaniu svojich vedomostí a odborných znalostí s ostatnými a poskytuje jednoduché tipy a návody na zlepšenie produktivity a efektivity. Či už ste skúsený profesionál alebo začiatočník, Michaelov blog ponúka cenné poznatky a praktické rady, ako z týchto základných softvérových nástrojov vyťažiť maximum.