Tartalomjegyzék
Ebben a cikkben megnézzük, hogy milyen problémákkal szembesülhetsz, ha egyéni függvényeket használsz a munkafüzetekben. Megpróbálom megmutatni, hogy mi okozza ezeket, és hogyan lehet könnyen megoldani őket.
A következőkről fogunk beszélgetni:
Korábban már beszéltünk arról, hogy mi az az egyéni függvény, hogyan kell létrehozni és használni. Ha úgy érzed, hogy előtte fel kell frissítened az UDF-ekkel kapcsolatos alapismereteidet, tarts egy kis szünetet és nézd át az előző cikkemet.
Miért nem számolja újra az Excel UDF-et?
Amikor bármilyen módosítást végez a munkafüzetben, az Excel nem számítja újra az összes ott lévő képletet. Csak a módosított cellákhoz kapcsolódó képletek eredményeit frissíti.
Ez azonban a szabványos Excel-függvényekre vonatkozik. Ami az egyéni függvényeket illeti, az Excel nem tudja érvényesíteni a VBA-kódot, és azonosítani a többi cellát, amelyek szintén befolyásolhatják az egyéni függvény eredményét. Ezért az egyéni képlet nem biztos, hogy megváltozik, ha változtatásokat végez a munkafüzetben.
A probléma megoldásához egyszerűen csak használnia kell a Application.Volatile nyilatkozat. A következő fejezetben lépésről lépésre megtanulhatja az alkalmazáshoz szükséges utasításokat.
Volatile vs non-volatile egyéni funkciók
Alapértelmezés szerint az egyéni függvények az Excelben nem illékonyak. Ez azt jelenti, hogy az UDF csak akkor kerül újraszámításra, ha az általa hivatkozott cellák bármelyikének értéke megváltozik. Ha azonban a cellák formátuma, a munkalap neve, a fájl neve megváltozik, akkor az UDF-ben nem történik változás.
Váltsunk át a szavakról a példákra. Például a munkafüzet nevét kell leírnia egy cellába. Ehhez létrehoz egy egyéni függvényt:
Function WorkbookName() As String WorkbookName = ThisWorkbook.Name End Function
Most képzeljük el a következő esetet. Ön egyéni képletet írt =WorkbookName() a cellába, és ott megkapta a fájl nevét. Egy idő után úgy döntött, hogy átnevezi a fájlt, és más névvel mentette el. De megnézi a cellában lévő értéket, és látja, hogy az nem változott. Még mindig a régi fájlnév van, ami már nem megfelelő.
Mivel ebben a függvényben nincsenek argumentumok, a függvény nem kerül újraszámításra (még akkor sem, ha megváltoztatja a munkafüzet nevét, bezárja, majd újra megnyitja).
Megjegyzés: A fájlban lévő összes függvény újraszámításához használhatja a Ctrl + Alt + F9 billentyűkombinációt.
Van egyszerűbb megoldás? Ahhoz, hogy a képlet minden alkalommal újraszámoljon, amikor a munkalap változik, szükség van egy további kódsorra. Illessze be a következő kódot a függvény elejére:
Application.Volatile
Tehát a kódod így fog kinézni:
Function WorkbookName() As String Application.Volatile WorkbookName = ThisWorkbook.Name End Function
Most az UDF illékony, ezért automatikusan újraszámításra kerül, ha a munkalap bármely cellája újraszámításra került, vagy bármilyen változás történt a munkafüzetben. Amint megváltoztatja a fájl nevét, azonnal látni fogja a frissítést.
Megjegyzés: Ne feledje, hogy a túl sok illékony függvény lelassíthatja az Excel-t. Hiszen túl sok egyéni függvény van, amelyek bonyolult számításokat végeznek, és folyamatosan nagy adattartományokon dolgoznak.
Ezért azt javaslom, hogy csak ott használjuk a volatilitást, ahol valóban szükség van rá.
Miért nem állnak rendelkezésre egyéni funkciók
Amikor beírja az egyéni függvény nevének első betűit, az a beviteli cella melletti legördülő listában jelenik meg, akárcsak a standard Excel-funkciók.
Ez azonban nem mindig történik meg. Milyen hibák okozhatják ezt a helyzetet?
Ha Excel 2003-2007, akkor az UDF soha nem jelenik meg a legördülő listában. Ott csak a szabványos függvények láthatók.
De még akkor is, ha az Excel újabb verzióját használja, van egy másik hiba, amelyet véletlenül elkövethet.
Az egyéni függvénynek ugyanis a Modulok nevű szabványos VBA-modulban kell lennie. Amikor új modult ad hozzá a függvénykód megírásához, automatikusan létrejön egy Modulok mappa, amelybe az összes modul íródik.
De néha előfordul, hogy egy új modul nem jön létre. A következő képernyőképen látható, hogy az egyéni függvénykód a "Microsoft Excel Objects" modulban van a ThisWorkbookkal együtt.
A lényeg az, hogy egy egyéni függvényt nem helyezhet el egy munkalap vagy munkafüzet kódterületén. Ebben az esetben a függvény nem fog működni. Ráadásul nem fog megjelenni a függvények legördülő listájában. Ezért a kódnak mindig a következő mappában kell lennie Modulok .
Az Excel egyéni funkció súgószövege nem jelenik meg
Egy másik probléma lehet a súgó, amelyet akkor lát, amikor beilleszt egy egyéni függvényt. Ha egy szabványos függvényt használ, akkor mindig megjelenik egy tooltip a függvényhez és annak argumentumaihoz. De mi a helyzet az UDF-ekkel?
Ha sok egyéni függvényed van, rendkívül nehéz lesz megjegyezni, hogy mindegyik milyen számításokat végez. Még nehezebb lesz megjegyezni, hogy milyen argumentumokat kell használni. Azt hiszem, jó ötlet lesz, ha lesz egy leírás az egyéni függvényeidről emlékeztetőnek.
Ehhez azt javaslom, hogy használd a Application.MacroOptions módszer. Segítségével nemcsak a függvény, hanem annak minden argumentumának leírását is megjelenítheti a Function Wizard ablakban. Ez az ablak akkor jelenik meg, amikor a képletsor Fx gombjára kattint.
Lássuk, hogyan adhatunk ilyen utalást az UDF-jeinkhez. Az előző cikkben a GetMaxBetween egyéni függvényt tekintettük meg. Ez a függvény a megadott tartományban lévő legnagyobb számot keresi, és három argumentumot fogad el: egy numerikus értéktartományt, valamint a keresett maximális és minimális értéket.
Most hozzáadunk egy leírást ehhez az egyéni függvényhez. Ehhez hozzuk létre és futtassuk le az Application.MacroOptions parancs. A GetMaxBetween funkciót, futtassa a következő parancsot:
Sub RegisterUDF () Dim strFuncName As String 'a regisztrálni kívánt függvény neve Dim strDescr As String ' a függvény leírása Dim strArgs () As String 'a függvény argumentumainak leírása ' GetMaxBetween függvény regisztrálása ReDim strArgs (1 To 3) 'A függvényben szereplő argumentumok száma strFuncName = "GetMaxBetween" strDescr = "Maximális szám a megadott tartományban" strArgs (1) ="Numerikus értékek tartománya" strArgs (2) = "Alsó intervallumhatár " strArgs (3) = "Felső intervallumhatár " Application.MacroOptions Macro: = strFuncName, _ Description: = strDescr, _ ArgumentDescriptions: = strArgs, _ Category: = " My Custom Functions " End Sub
vagy
Sub RegisterUDF () Application.MacroOptions Macro: = "GetMaxBetween" , _ Description: = "Maximális szám a megadott tartományban" , _ Category: = "My Custom Functions" , _ ArgumentDescriptions: = Array (_ "Numerikus értékek tartománya" , _ "Alsó intervallumhatár" , _ "Felső intervallumhatár" ) End SubVáltozó str FuncName a függvény neve. strDescr - funkció leírása. strArgs változók tartalmazzák az egyes argumentumokhoz tartozó tippeket.
Elgondolkodhat azon, hogy mi az Application.MacroOptions negyedik argumentuma. Ennek az opcionális argumentumnak a neve Kategória és jelzi az Excel függvények azon osztályát, amelyet az egyéni GetMaxBetween () Megadhatja a meglévő kategóriák bármelyikének nevét: Math & Trig, Statistical, Logical, stb. Megadhat egy nevet az új kategóriának, amelyben az Ön által létrehozott függvényeket elhelyezi. Ha nem használja a Category argumentumot, akkor az egyéni függvény automatikusan a "User Defined" kategóriába kerül.
Illessze be a funkció kódját a modul ablakába:
Ezután kattintson a "Futtatás" gombra. A parancs elvégzi az összes beállítást, hogy használhassa a Fx gombot a GetMaxBetween() funkció.
Ha megpróbál egy függvényt beszúrni egy cellába a Beillesztési funkció eszközzel, látni fogja, hogy ott van a GetMaxBetween funkció a "Saját egyéni funkciók" kategóriában található:
Egyszerűen elkezdheti beírni a függvény nevét a cellába, és a legördülő listában megjelenik az egyéni függvénye, amelyből választhat.
Ezután hívja a Funkció varázsló az Fx gombbal.
Tipp. A CRTL + A billentyűkombinációval is megnyithatja a Funkcióvarázslót.
A Funkció varázsló ablakban megjelenik a függvény leírása, valamint az első argumentumra vonatkozó súgó. Ha a kurzort a második vagy harmadik argumentum fölé helyezi, akkor ezekre is megjelenik egy súgó.
Ha meg akarja változtatni ezeknek a célzásoknak a szövegét, akkor módosítsa a strDescr és strArgs változók a RegisterUDF () kódot. Ezután futtassa a RegisterUDF () parancsot újra.
Ha vissza akarja vonni az összes elvégzett beállítást, és törölni szeretné a funkció leírását, futtassa ezt a kódot:
Sub UnregisterUDF () Application.MacroOptions Macro: = "GetMaxBetween" , _ Description: = Empty , ArgumentDescriptions: = Empty , Category: = Empty End Sub
Van még egy módja annak, hogy egy egyéni függvény beírásakor kapjon egy tippet. Írja be a függvény nevét, majd nyomja le a Ctrl + Shift + A billentyűkombinációt:
=GetMaxBetween(
+ Ctrl + Shift + A
Megjelenik a függvény összes argumentumának listája:
Sajnos itt nem látod a függvény és az argumentumok leírását. De ha az argumentumok neve elég informatív, akkor ezek is hasznosak lehetnek. De azért jobb, mint a semmi :)
Kicsit több munkát igényel az UDF-ek intellisense-ének létrehozása, amelyek úgy működnek, mint a standard Excel függvények. Sajnos a Microsoft nem biztosít semmilyen lehetőséget. Az egyetlen elérhető megoldás jelenleg egy Excel-DNA IntelliSense bővítmény. További információkat a fejlesztő weboldalán talál.
Remélhetőleg ezek az iránymutatások segítenek megoldani a problémákat, amikor az egyéni függvényed nem működik, vagy nem úgy működik, ahogy szeretnéd. Ha azonban az UDF-ed mégsem működik, kérjük, írd le pontosan a problémádat a Hozzászólások részben. Megpróbáljuk kitalálni és megtalálni a megoldást neked ;)