Excel UDF wurket net: problemen en oplossingen

  • Diel Dit
Michael Brown

Yn dit artikel sille wy de problemen besjen dy't jo kinne tsjinkomme by it brûken fan oanpaste funksjes yn jo wurkboeken. Ik sil besykje om jo sjen te litten wat se feroarsaket en hoe maklik se kinne wurde oplost.

Hjir sille wy it oer hawwe:

    Earder hawwe wy it oer wat in oanpaste funksje is, hoe te meitsjen en brûk it. As jo ​​​​fiele dat jo de basiskennis fan UDF's foarôf moatte ferfarskje, nim dan in skoft en sjoch troch myn foarige artikel.

    Wêrom wurdt Excel UDF net opnij berekkene?

    As jo ​​wizigingen meitsje yn jo wurkboek, sil Excel net elke formule dy't jo dêr hawwe opnij berekkenje. It sil de resultaten bywurkje foar dy formules dy't allinich keppele binne oan de feroare sellen.

    Mar dit giet om de standert Excel-funksjes. Wat de oanpaste oanbelanget, kin Excel de VBA-koade net falidearje en oare sellen identifisearje dy't ek it resultaat fan 'e oanpaste funksje kinne beynfloedzje. Dêrom kin jo oanpaste formule net feroarje as jo wizigingen meitsje yn it wurkboek.

    Om it probleem op te lossen, moatte jo gewoan de Application.Volatile -statement brûke. Besjoch it folgjende haadstik om de stap foar stap ynstruksjes te learen oer hoe't jo it tapasse kinne.

    Fluchtige vs net-flechtige oanpaste funksjes

    Standert binne oanpaste funksjes yn Excel net flechtich. Dit betsjut dat de UDF allinich opnij berekkene wurdt as de wearde fan ien fan 'e sellen dy't it ferwiist nei feroaret. Mar as de opmaak fan de sellen, de namme fan dewurkblêd, de namme fan it bestân wizigje, dan komme der gjin feroarings yn it UDF.

    Litte wy fan wurden nei foarbylden oerstappe. Jo moatte bygelyks de namme fan jo wurkboek yn in sel opskriuwe. Om dit te dwaan, meitsje jo in oanpaste funksje:

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

    Stel jo no it folgjende gefal foar. Jo hawwe oanpaste formule =WurkbookName() yn 'e sel skreaun en dêr de triemnamme krigen. Yn in skoftke hawwe jo besletten om it bestân werneame en bewarre it mei in oare namme. Mar jo sjogge nei de wearde yn 'e sel en sjogge dat it net feroare is. Der is noch in âlde triemnamme dy't net mear goed is.

    Om't der gjin arguminten yn dizze funksje binne, wurdt de funksje net opnij berekkene (sels as jo de namme fan it wurkboek feroarje, slute it en dan opnij iepenje it).

    Opmerking. Om alle funksjes yn jo bestân opnij te berekkenjen, kinne jo de fluchtoets Ctrl + Alt + F9 brûke.

    Is der in maklikere manier? Om de formule opnij te berekkenjen elke kear as it wurkblêd feroaret, hawwe jo in ekstra rigel koade nedich. Plak it folgjende stik koade oan it begjin fan jo funksje:

    Application.Volatile

    Dus, jo koade sil der sa útsjen:

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

    No is jo UDF flechtich, dus sil it automatysk opnij berekkene wurde as in sel yn it wurkblêdis op 'e nij berekkene of elke feroaring is bard yn it wurkboek. Sadree't jo de namme fan it bestân feroarje, sille jo dy fernijing daliks sjen.

    Opmerking. Tink derom dat tefolle flechtige funksjes jo Excel kinne fertrage. D'r binne ommers tefolle oanpaste funksjes dy't komplekse berekkeningen útfiere en kontinu operearje op grutte gegevensbereiken.

    Dêrom ried ik oan om volatiliteit allinich te brûken wêr't it echt nedich is.

    Wêrom oanpaste funksjes net beskikber binne

    As jo ​​de earste letters fan 'e namme fan in oanpaste funksje ynfiere, ferskynt it yn it útklapmenu neist de ynfiersel, krekt as standert Excel-funksjes.

    Dat bart lykwols net altyd. Hokker flaters kinne dizze situaasje feroarsaakje?

    As jo ​​Excel 2003-2007 hawwe, dan ferskynt de UDF nea yn it útklapmenu. Dêr kinne jo allinich standertfunksjes sjen.

    Mar sels as jo in nijere ferzje fan Excel brûke, is der in oare flater dy't jo per ûngelok meitsje kinne.

    Jo sjogge, de oanpaste funksje moat yn wêze in standert VBA module neamd Modules. As jo ​​in nije module taheakje om de funksjekoade te skriuwen, wurdt automatysk in Modules-map makke wêryn alle modules skreaun binne.

    Mar soms komt it foar dat in nije module net is. getting makke. Op de folgjende skermôfbylding kinne jo sjen dat de oanpaste funksje koade is yn 'e module "Microsoft Excel Objekten" tegearre meiThisWorkbook.

    It punt is dat jo gjin oanpaste funksje kinne pleatse yn it koadegebiet fan in wurkblêd of wurkboek. Yn dit gefal sil de funksje net wurkje. Boppedat sil it net ferskine yn 'e dellûklist mei funksjes. Dêrom moat de koade altyd yn de map Modules .

    Excel oanpaste funksje helptekst wurdt net werjûn

    In oar probleem kin foarkomme is de hint dy't jo sjogge as jo plakke in oanpaste funksje. As jo ​​in standertfunksje brûke, sille jo altyd in tooltip sjen foar de funksje en foar syn arguminten. Mar hoe sit it mei UDF's?

    As jo ​​in protte oanpaste funksjes hawwe, sil it foar jo ekstreem lestich wêze om te ûnthâlden hokker berekkeningen elk fan har docht. It sil noch dreger wêze om te ûnthâlden hokker arguminten te brûken. Ik tink dat it in goed idee wêze sil om in beskriuwing fan jo oanpaste funksjes as herinnering te hawwen.

    Dêrfoar stel ik foar om de metoade Application.MacroOptions te brûken. It sil jo helpe om de beskriuwing fan net allinich de funksje te sjen, mar ek fan elk fan syn arguminten yn it finster Function Wizard. Jo sjogge dit finster as jo op de Fx-knop yn 'e formulebalke klikke.

    Litte wy sjen hoe't jo sa'n hint tafoegje kinne oan jo UDF's. Yn it foarige artikel seagen wy de oanpaste funksje GetMaxBetween. It fynt it maksimum oantal yn it opjûne berik en nimt trije arguminten: in berik fan numerike wearden, en in maksimum en minimale wearde foarsykje nei.

    No sille wy in beskriuwing tafoegje foar dizze oanpaste funksje. Om dit te dwaan, meitsje en útfiere it kommando Application.MacroOptions . Foar de funksje GetMaxBetween kinne jo it folgjende kommando útfiere:

    Sub RegisterUDF () Dim strFuncName As String 'namme fan de funksje dy't jo registrearje wolle Dim strDescr As String ' beskriuwing fan de funksje sels Dim strArgs () As String 'beskriuwing fan funksje-arguminten' Registrearje GetMaxBetween-funksje ReDim strArgs (1 oant 3) 'Aantal arguminten yn jo funksje strFuncName = "GetMaxBetween" strDescr = "Maksimum oantal yn it opjûne berik" strArgs (1) = "Rang fan numerike wearden" strArgs (2) = "Lêste yntervalgrins " strArgs (3) = " Boppeste yntervalgrins " Application.MacroOptions Makro: = strFuncName, _ Description: = strDescr, _ ArgumentDescriptions: = strArgs, _ Category: = " Myn oanpaste funksjes " End Sub

    of

    Sub RegisterUDF () Application.MacroOptions Macro: = "GetMaxBetween" , _ Description: = "Maksimum oantal yn it opjûne berik" , _ Kategory: = "Myn Oanpaste funksjes" , _ ArgumentDescriptions: = Array (_ "Berik fan numerike wearden" , _ "Leger ynterval bor der", _ "Boppeste yntervalgrins") End Sub

    Fariabele str FuncName is de namme fan de funksje. strDescr - funksjebeskriuwing. De strArgs -fariabelen befetsje hints foar elk argumint.

    Jo kinne jo ôffreegje wat it fjirde argumint is foarApplication.MacroOptions. Dit opsjonele argumint wurdt Kategory neamd en jout de klasse fan Excel-funksjes oan wêryn ús oanpaste funksje GetMaxBetween () pleatst wurde sil. Jo kinne it neame nei ien fan de besteande kategoryen: Math & ; Trig, statistysk, logysk, ensfh Jo kinne opjaan in namme foar de nije kategory wêryn jo pleatse de funksjes dy't jo meitsje. As jo ​​it argumint Kategory net brûke, dan sil de oanpaste funksje automatysk pleatst wurde yn 'e kategory "User Defined".

    Plak de funksjekoade yn it modulefinster:

    Klikje dan op de knop "Utfiere". It kommando sil alle ynstellings útfiere foar it brûken fan de knop Fx mei jo funksje GetMaxBetween() .

    As jo ​​besykje in funksje yn in sel yn te foegjen mei de GetMaxBetween() 6>Funksje ynfoegje ark, jo sille sjen dat jo GetMaxBetween funksje is yn 'e kategory "Myn oanpaste funksjes":

    Jo kinne gewoan begjinne mei it typen fan de funksjenamme yn 'e sel en jo sille jo oanpaste funksje sjen yn it útklapmenu fan funksjes om út te selektearjen.

    Rop dan de Funksjewizard op mei de Fx-knop.

    Tip. Jo kinne ek de toetskombinaasje CRTL + A brûke om de Function Wizard te iepenjen.

    Yn it finster Funksjewizard sille jo in beskriuwing fan jo funksje sjen, en ek in oanwizing foar it earste argumint. As jo ​​pleatse jo rinnerke oer detwadde of tredde argumint, jo sille ek hints foar har sjen.

    As jo ​​de tekst fan dizze hints feroarje wolle, feroarje dan de wearden fan de strDescr en strArgs fariabelen yn de RegisterUDF () koade. Fier dan it kommando RegisterUDF () nochris út.

    As jo ​​alle makke ynstellings ûngedien meitsje wolle en de funksjebeskriuwing wiskje, fier dan dizze koade út:

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

    Der is noch ien manier om in hint te krijen as jo in oanpaste funksje ynfiere. Fier de namme fan de funksje yn en druk dan op de Ctrl + Shift + A :

    =GetMaxBetween( + Ctrl + Shift + A

    Jo sille in list sjen mei alle arguminten fan de funksje:

    Spitigernôch sille jo hjir de beskriuwing fan 'e funksje en syn arguminten net sjen. Mar as de nammen fan 'e arguminten aardich ynformatyf binne, dan kinne se ek nuttich wêze. Noch altyd is it better as neat :)

    It sil wat mear wurk duorje om intellisense te meitsjen foar UDF's dy't wurkje as standert Excel-funksjes. Spitigernôch biedt Microsoft gjin opsjes. De ienige beskikbere oplossing is op it stuit in Excel-DNA IntelliSense-útwreiding. Jo kinne mear ynformaasje fine op 'e webside fan' e ûntwikkelders.

    Hooplik sille dizze rjochtlinen jo helpe om problemen op te lossen as jo oanpaste funksje net wurket of net wurketwurkje sa't jo wolle. As jo ​​UDF lykwols noch net wurket, beskriuw asjebleaft jo probleem krekt yn 'e seksje Opmerkings. Wy sille besykje it út te finen en de oplossing foar jo te finen ;)

    Michael Brown is in tawijd technology-entûsjast mei in passy foar it ferienfâldigjen fan komplekse prosessen mei software-ark. Mei mear as in desennium ûnderfining yn 'e tech-yndustry hat hy syn feardigens yn Microsoft Excel en Outlook, lykas Google Blêden en Docs, oanskerpe. Michael's blog is wijd oan it dielen fan syn kennis en ekspertize mei oaren, en biedt maklik te folgjen tips en tutorials foar it ferbetterjen fan produktiviteit en effisjinsje. Oft jo in betûfte profesjonele of in begjinner binne, Michael's blog biedt weardefolle ynsjoch en praktysk advys om it measte út dizze essensjele software-ark te heljen.