Nefunkční UDF aplikace Excel: problémy a řešení

  • Sdílet Toto
Michael Brown

V tomto článku se podíváme na problémy, se kterými se můžete setkat při používání vlastních funkcí v sešitech. Pokusím se ukázat, co je způsobuje a jak je lze snadno vyřešit.

O čem budeme mluvit:

    Dříve jsme si řekli, co je to vlastní funkce, jak ji vytvořit a používat. Pokud máte pocit, že si předtím potřebujete osvěžit základní znalosti o UDF, udělejte si pauzu a projděte si můj předchozí článek.

    Proč se UDF aplikace Excel nepřepočítává?

    Když v sešitě provedete nějaké změny, Excel nepřepočítá každý vzorec, který tam máte. Aktualizuje pouze výsledky těch vzorců, které jsou spojeny se změněnými buňkami.

    To se však týká standardních funkcí aplikace Excel. Pokud jde o vlastní funkce, aplikace Excel nemůže ověřit kód VBA a identifikovat další buňky, které by také mohly ovlivnit výsledek vlastní funkce. Proto se váš vlastní vzorec nemusí při změnách v sešitě změnit.

    Chcete-li problém vyřešit, stačí použít příkaz Aplikace.Volatile Podívejte se do další kapitoly, kde se dozvíte návod krok za krokem, jak jej použít.

    Volatilní vs. nevolatilní vlastní funkce

    Ve výchozím nastavení nejsou vlastní funkce v aplikaci Excel nestálé. To znamená, že UDF se přepočítá pouze tehdy, pokud se změní hodnota některé z buněk, na které odkazuje. Pokud se však změní formát buněk, název pracovního listu nebo název souboru, nedojde v UDF k žádným změnám.

    Přejděme od slov k příkladům. Potřebujete například zapsat název sešitu do buňky. Za tímto účelem vytvoříte vlastní funkci:

    Function WorkbookName() As String Název sešitu = ThisWorkbook.Name End Function

    Nyní si představte následující případ. Napsali jste vlastní vzorec =Název pracovního sešitu() do buňky a získali jste tam název souboru. Za chvíli jste se rozhodli soubor přejmenovat a uložili jste ho pod jiným názvem. Podíváte se však na hodnotu v buňce a zjistíte, že se nezměnila. Stále je tam starý název souboru, který už není správný.

    Protože v této funkci nejsou žádné argumenty, funkce se nepřepočítá (ani když změníte název sešitu, zavřete jej a znovu otevřete).

    Poznámka: Chcete-li přepočítat všechny funkce v souboru, můžete použít klávesovou zkratku Ctrl + Alt + F9.

    Existuje snadnější způsob? Aby se vzorec přepočítával při každé změně pracovního listu, potřebujete další řádek kódu. Na začátek funkce vložte následující část kódu:

    Aplikace.Volatile

    Váš kód tedy bude vypadat takto:

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

    Nyní je vaše UDF nestálé, a proto se automaticky přepočítá, pokud byla přepočítána jakákoli buňka v listu nebo došlo k jakékoli změně v sešitě. Jakmile změníte název souboru, okamžitě se zobrazí tato aktualizace.

    Poznámka: Mějte na paměti, že příliš mnoho nestálých funkcí může zpomalit Excel. Koneckonců existuje příliš mnoho vlastních funkcí, které provádějí složité výpočty a nepřetržitě pracují s velkými rozsahy dat.

    Proto doporučuji používat volatilitu pouze tam, kde je to opravdu nutné.

    Proč nejsou k dispozici vlastní funkce

    Když zadáte první písmena názvu vlastní funkce, zobrazí se v rozevíracím seznamu vedle vstupní buňky stejně jako standardní funkce aplikace Excel.

    Ne vždy se to však podaří. Jaké chyby mohou tuto situaci způsobit?

    Pokud máte Excel 2003-2007, pak se UDF v rozevíracím seznamu nikdy nezobrazí. Jsou tam vidět pouze standardní funkce.

    Ale i když používáte novější verzi aplikace Excel, můžete se omylem dopustit další chyby.

    Vidíte, že vlastní funkce musí být ve standardním modulu VBA s názvem Moduly. Když přidáte nový modul pro zápis kódu funkce, automaticky se vytvoří složka Moduly, do které se zapisují všechny moduly.

    Někdy se však stane, že se nový modul nevytvoří. Na dalším snímku obrazovky vidíte, že kód vlastní funkce je v modulu "Objekty aplikace Microsoft Excel" spolu s modulem ThisWorkbook.

    Jde o to, že vlastní funkci nemůžete umístit do oblasti kódu listu nebo sešitu. V takovém případě nebude funkce fungovat. Navíc se nezobrazí v rozevíracím seznamu funkcí. Proto by měl být kód vždy ve složce Moduly .

    Text nápovědy k vlastní funkci aplikace Excel se nezobrazuje

    Dalším problémem může být nápověda, která se zobrazí při vložení vlastní funkce. Pokud použijete standardní funkci, vždy se zobrazí nápověda pro funkci a její argumenty. Ale co UDF?

    Pokud máte mnoho vlastních funkcí, bude pro vás nesmírně obtížné zapamatovat si, jaké výpočty každá z nich provádí. Ještě obtížnější bude zapamatovat si, které argumenty použít. Myslím, že bude dobré mít popis vlastních funkcí jako připomínku.

    K tomu bych doporučil použít Application.MacroOptions metoda. Pomůže vám zobrazit popis nejen funkce, ale i jednotlivých jejích argumentů v okně Průvodce funkcí. Toto okno se zobrazí po kliknutí na tlačítko Fx na panelu vzorců.

    Podívejme se, jak takovou nápovědu přidat do vašich UDF. V předchozím článku jsme se zabývali vlastní funkcí GetMaxBetween. Ta vyhledává maximální číslo v zadaném rozsahu a přijímá tři argumenty: rozsah číselných hodnot a maximální a minimální hodnotu, kterou má hledat.

    Nyní přidáme popis této vlastní funkce. Za tímto účelem vytvořte a spusťte příkaz Application.MacroOptions příkaz. Pro GetMaxBetween můžete spustit následující příkaz:

    Sub RegisterUDF () Dim strFuncName As String 'název funkce, kterou chcete zaregistrovat Dim strDescr As String ' popis samotné funkce Dim strArgs () As String 'popis argumentů funkce ' Zaregistrujte funkci GetMaxBetween ReDim strArgs (1 To 3) 'Počet argumentů ve vaší funkci strFuncName = "GetMaxBetween" strDescr = "Maximální počet v zadaném rozsahu" strArgs (1) ="Rozsah číselných hodnot" strArgs (2) = "Dolní hranice intervalu " strArgs (3) = " Horní hranice intervalu " Application.MacroOptions Makro: = strFuncName, _ Description: = strDescr, _ ArgumentDescriptions: = strArgs, _ Category: = " Moje vlastní funkce " End Sub

    nebo

    Sub RegisterUDF () Application.MacroOptions Makro: = "GetMaxBetween" , _ Description: = "Maximální číslo v zadaném rozsahu" , _ Category: = "Moje vlastní funkce" , _ ArgumentDescriptions: = Array (_ "Rozsah číselných hodnot" , _ "Dolní hranice intervalu" , _ "Horní hranice intervalu" ) End Sub

    Proměnná str FuncName je název funkce. strDescr - popis funkce. strArgs proměnné obsahují nápovědy pro každý argument.

    Možná vás zajímá, co je čtvrtým argumentem příkazu Application.MacroOptions. Tento nepovinný argument se jmenuje Kategorie a označuje třídu funkcí Excelu, které naše vlastní funkce GetMaxBetween () do které bude funkce umístěna. Můžete ji pojmenovat podle některé z existujících kategorií: Math & Trig, Statistical, Logical atd. Můžete zadat název nové kategorie, do které budete umísťovat vytvořené funkce. Pokud nepoužijete argument Category, pak bude vlastní funkce automaticky umístěna do kategorie "User Defined".

    Vložte kód funkce do okna modulu:

    Poté klikněte na tlačítko "Spustit". Příkaz provede všechna nastavení pro použití Fx tlačítko s GetMaxBetween() funkce.

    Pokud se pokusíte vložit funkci do buňky pomocí příkazu Vložit funkci nástroj, uvidíte, že je zde váš GetMaxBetween funkce se nachází v kategorii "Moje vlastní funkce":

    Stačí začít psát název funkce do buňky a v rozevíracím seznamu funkcí se zobrazí vlastní funkce, ze které si můžete vybrat.

    Pak zavolejte Průvodce funkcí pomocí tlačítka Fx.

    Tip: Průvodce funkcemi můžete otevřít také pomocí kombinace kláves CRTL + A.

    V Průvodce funkcemi se zobrazí popis funkce a nápověda pro první argument. Pokud umístíte kurzor na druhý nebo třetí argument, zobrazí se nápověda i pro ně.

    Pokud chcete změnit text těchto nápověd, změňte hodnoty parametrů strDescr a strArgs proměnné v RegisterUDF () kód. Pak spusťte RegisterUDF () znovu příkaz.

    Pokud chcete zrušit všechna provedená nastavení a vymazat popis funkce, spusťte tento kód:

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

    Existuje ještě jeden způsob, jak získat nápovědu při zadávání vlastní funkce. Zadejte název funkce a poté stiskněte klávesovou zkratku Ctrl + Shift + A :

    =GetMaxBetween( + Ctrl + Shift + A

    Zobrazí se seznam všech argumentů funkce:

    Bohužel zde neuvidíte popis funkce a jejích argumentů. Ale pokud jsou názvy argumentů docela informativní, tak by mohly být také užitečné. Pořád je to lepší než nic :)

    Vytvořit intellisense pro UDF, které pracují jako standardní funkce Excelu, dá trochu více práce. Microsoft bohužel neposkytuje žádné možnosti. Jediným dostupným řešením je v současné době rozšíření Excel-DNA IntelliSense. Více informací najdete na webu vývojáře.

    Doufejme, že vám tyto pokyny pomohou vyřešit problémy, když vaše vlastní funkce nefunguje nebo nefunguje tak, jak byste si přáli. Pokud však vaše UDF přesto nefunguje, popište prosím svůj problém přesně v sekci Komentáře. Pokusíme se na to přijít a najít pro vás řešení ;)

    Michael Brown je oddaný technologický nadšenec s vášní pro zjednodušování složitých procesů pomocí softwarových nástrojů. S více než desetiletými zkušenostmi v technologickém průmyslu zdokonalil své dovednosti v aplikacích Microsoft Excel a Outlook a také v Tabulkách a Dokumentech Google. Michaelův blog je věnován sdílení jeho znalostí a odborných znalostí s ostatními a poskytuje snadno pochopitelné tipy a návody pro zlepšení produktivity a efektivity. Ať už jste zkušený profesionál nebo začátečník, Michaelův blog nabízí cenné postřehy a praktické rady, jak tyto základní softwarové nástroje co nejlépe využít.