Excel UDF ne deluje: težave in rešitve

  • Deliti To
Michael Brown

V tem članku si bomo ogledali težave, s katerimi se lahko srečate pri uporabi funkcij po meri v delovnih zvezkih. Poskušal vam bom pokazati, kaj jih povzroča in kako jih je mogoče preprosto rešiti.

O čem se bomo pogovarjali:

    Prej smo govorili o tem, kaj je funkcija po meri, kako jo ustvariti in uporabiti. Če se vam zdi, da morate pred tem osvežiti osnovno znanje o funkcijah UDF, se ustavite in si preberite moj prejšnji članek.

    Zakaj se Excelov UDF ne preračuna?

    Ko v delovnem zvezku naredite kakršne koli spremembe, Excel ne bo ponovno izračunal vsake formule, ki jo imate v njem. Posodobil bo samo rezultate tistih formul, ki so povezane s spremenjenimi celicami.

    Vendar to velja za standardne funkcije programa Excel. Pri funkcijah po meri Excel ne more potrditi kode VBA in prepoznati drugih celic, ki bi prav tako lahko vplivale na rezultat funkcije po meri. Zato se vaša formula po meri morda ne bo spremenila, ko boste spremenili delovni zvezek.

    Če želite odpraviti težavo, morate uporabiti Uporaba.Volatile izjavo. V naslednjem poglavju si preberite navodila po korakih, kako jo uporabiti.

    Hlapne in nehlapne funkcije po meri

    Privzeto so funkcije po meri v Excelu nestanovitne. To pomeni, da se UDF preračuna le, če se spremeni vrednost katere koli celice, na katero se sklicuje. Če pa se spremeni oblika celic, ime delovnega lista ali ime datoteke, se UDF ne spremeni.

    Z besed preidimo na primere. Na primer, v celico morate zapisati ime delovnega zvezka. V ta namen ustvarite funkcijo po meri:

    Funkcija Ime delovnega zvezka() kot String Ime delovnega zvezka = ThisWorkbook.Name Konec funkcije

    Zdaj si predstavljajte naslednji primer: napisali ste formulo po meri =Ime delovnega zvezka() v celico in tam dobili ime datoteke. čez nekaj časa ste se odločili datoteko preimenovati in jo shranili z drugim imenom. vendar pogledate vrednost v celici in vidite, da se ni spremenila. še vedno je tam staro ime datoteke, ki ni več pravilno.

    Ker v tej funkciji ni argumentov, se funkcija ne preračuna (tudi če spremenite ime delovnega zvezka, ga zaprete in nato znova odprete).

    Opomba: Če želite ponovno izračunati vse funkcije v datoteki, lahko uporabite bližnjico Ctrl + Alt + F9.

    Ali obstaja lažji način? Da se formula preračuna ob vsaki spremembi delovnega lista, potrebujete dodatno vrstico kode. Na začetek funkcije prilepite naslednji del kode:

    Uporaba.Volatile

    Tako bo vaša koda videti takole:

    Funkcija Ime delovnega zvezka() kot niz Application.Volatile Ime delovnega zvezka = ThisWorkbook.Name Konec funkcije

    Zdaj je vaš UDF spremenljiv, zato se bo samodejno preračunal, če bo katera koli celica v delovnem listu preračunana ali če bo v delovnem zvezku prišlo do kakršne koli spremembe. Takoj ko spremenite ime datoteke, boste takoj videli posodobitev.

    Opomba: Ne pozabite, da lahko preveč nestanovitnih funkcij upočasni Excel. Navsezadnje je preveč funkcij po meri, ki izvajajo zapletene izračune in neprekinjeno delujejo na velikih podatkovnih obsegih.

    Zato priporočam, da nestanovitnost uporabite le tam, kjer je res potrebna.

    Zakaj funkcije po meri niso na voljo

    Ko vnesete prve črke imena funkcije po meri, se ta prikaže na spustnem seznamu poleg vnosne celice, tako kot standardne funkcije programa Excel.

    Vendar se to ne zgodi vedno. Katere napake lahko povzročijo takšno stanje?

    Če imate Excel 2003-2007, se UDF nikoli ne prikaže na spustnem seznamu. Tam so prikazane samo standardne funkcije.

    Tudi če uporabljate novejšo različico programa Excel, lahko po pomoti naredite še eno napako.

    Funkcija po meri mora biti v standardnem modulu VBA, imenovanem Moduli. Ko dodate nov modul za zapis kode funkcije, se samodejno ustvari mapa Moduli, v kateri so zapisani vsi moduli.

    Vendar se včasih zgodi, da se nov modul ne ustvari. Na naslednji zaslonski sliki lahko vidite, da je koda funkcije po meri v modulu "Microsoft Excel Objects" skupaj z modulom ThisWorkbook.

    Gre za to, da funkcije po meri ne morete namestiti v območje kode delovnega lista ali delovnega zvezka. V tem primeru funkcija ne bo delovala. Poleg tega se ne bo pojavila na spustnem seznamu funkcij. Zato mora biti koda vedno v mapi Moduli .

    Besedilo pomoči funkcije Excel po meri ni prikazano

    Druga težava se lahko pojavi pri namigu, ki ga vidite, ko prilepite funkcijo po meri. Če uporabite standardno funkcijo, se vedno prikaže namig za funkcijo in njene argumente. Kaj pa UDF?

    Če imate veliko funkcij po meri, si boste zelo težko zapomnili, kakšne izračune opravlja vsaka od njih. Še težje si boste zapomnili, katere argumente je treba uporabiti. Menim, da bo dobro, če boste imeli opis funkcij po meri kot opomnik.

    Za to predlagam uporabo Application.MacroOptions metoda. Pomagala vam bo prikazati opis ne le funkcije, temveč tudi vsakega njenega argumenta v oknu Čarovnik funkcije. To okno se prikaže, ko kliknete gumb Fx v vrstici s formulami.

    Oglejmo si, kako takšen namig dodati v svoje UDF-je. V prejšnjem članku smo si ogledali funkcijo po meri GetMaxBetween. Funkcija poišče največje število v določenem območju in sprejme tri argumente: območje številskih vrednosti ter največjo in najmanjšo vrednost, ki jo je treba poiskati.

    Zdaj bomo dodali opis za to funkcijo po meri. To storite tako, da ustvarite in zaženete Application.MacroOptions ukaz. Za GetMaxBetween lahko zaženete naslednji ukaz:

    Sub RegisterUDF () Dim strFuncName As String 'ime funkcije, ki jo želite registrirati Dim strDescr As String ' opis same funkcije Dim strArgs () As String 'opis argumentov funkcije ' Registracija funkcije GetMaxBetween ReDim strArgs (1 Do 3) 'Število argumentov v vaši funkciji strFuncName = "GetMaxBetween" strDescr = "Največje število v določenem območju" strArgs (1) ="Območje številčnih vrednosti" strArgs (2) = "Spodnja meja intervala" strArgs (3) = "Zgornja meja intervala" Application.MacroOptions Makro: = strFuncName, _ Description: = strDescr, _ ArgumentDescriptions: = strArgs, _ Category: = " Funkcije po meri " End Sub

    ali

    Sub RegisterUDF () Application.MacroOptions Makro: = "GetMaxBetween" , _ Description: = "Največje število v določenem razponu" , _ Category: = "Moje funkcije po meri" , _ ArgumentDescriptions: = Array (_ "Razpon numeričnih vrednosti" , _ "Spodnja meja intervala" , _ "Zgornja meja intervala" ) End Sub

    Spremenljivka str FuncName je ime funkcije. strDescr - opis funkcije. strArgs spremenljivke vsebujejo namige za vsak argument.

    Morda se sprašujete, kaj je četrti argument za Application.MacroOptions. Ta neobvezni argument se imenuje Kategorija in označuje razred funkcij programa Excel, ki jih po meri GetMaxBetween () Lahko jo poimenujete po kateri koli od obstoječih kategorij: Math & amp; Trig, Statistical, Logical itd. Določite lahko ime nove kategorije, v katero boste umestili ustvarjene funkcije. Če ne uporabite argumenta Category, bo funkcija po meri samodejno umeščena v kategorijo "User Defined".

    Kodo funkcije prilepite v okno modula:

    Nato kliknite gumb "Zaženi". Ukaz bo izvedel vse nastavitve za uporabo Fx z gumbom GetMaxBetween() funkcijo.

    Če poskušate vstaviti funkcijo v celico z uporabo Funkcija vstavljanja orodje, boste videli, da je v njem vaš GetMaxBetween je v kategoriji "Moje funkcije po meri":

    V celico lahko preprosto vnesete ime funkcije in na spustnem seznamu funkcij, med katerimi lahko izbirate, se bo prikazala funkcija po meri.

    Nato pokličite Čarovnik za funkcije z gumbom Fx.

    Nasvet: Čarovnika za funkcije lahko odprete tudi s kombinacijo tipk CRTL + A.

    V Čarovnik za funkcije V oknu se bo prikazal opis funkcije in namig za prvi argument. Če postavite kazalec na drugi ali tretji argument, se bodo prav tako prikazali namigi zanju.

    Če želite spremeniti besedilo teh namigov, spremenite vrednosti strDescr in . strArgs spremenljivke v RegisterUDF () kodo. Nato zaženite RegisterUDF () ponovno ukažite ukaz.

    Če želite razveljaviti vse nastavitve in izbrisati opis funkcije, zaženite to kodo:

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

    Obstaja še en način, kako lahko dobite namig, ko vnesete funkcijo po meri. Vnesite ime funkcije in nato pritisnite kombinacijo tipk Ctrl + Shift + A :

    =GetMaxBetween( + Ctrl + Shift + A

    Prikazal se bo seznam vseh argumentov funkcije:

    Na žalost tukaj ne boste videli opisa funkcije in njenih argumentov. Če pa so imena argumentov precej informativna, bodo morda tudi koristna. Vseeno je bolje kot nič :)

    Za ustvarjanje intellisense za UDF, ki delujejo kot standardne funkcije programa Excel, bo potrebno nekaj več dela. Žal Microsoft ne ponuja nobenih možnosti. Edina rešitev, ki je trenutno na voljo, je razširitev Excel-DNA IntelliSense. Več informacij lahko najdete na spletnem mestu razvijalca.

    Upamo, da vam bodo te smernice pomagale pri reševanju težav, ko vaša funkcija po meri ne deluje ali ne deluje tako, kot bi želeli. Če vaša funkcija UDF kljub temu ne deluje, natančno opišite svojo težavo v razdelku s komentarji. Poskušali bomo ugotoviti in najti rešitev za vas ;)

    Michael Brown je predan tehnološki navdušenec s strastjo do poenostavljanja kompleksnih procesov z uporabo programskih orodij. Z več kot desetletnimi izkušnjami v tehnološki industriji je svoje veščine izpopolnil v Microsoft Excelu in Outlooku ter Google Preglednicah in Dokumentih. Michaelov blog je namenjen deljenju svojega znanja in strokovnega znanja z drugimi ter ponuja preproste nasvete in vadnice za izboljšanje produktivnosti in učinkovitosti. Ne glede na to, ali ste izkušen strokovnjak ali začetnik, Michaelov blog ponuja dragocene vpoglede in praktične nasvete, kako kar najbolje izkoristiti ta osnovna programska orodja.