Excel UDF werk nie: probleme en oplossings

  • Deel Dit
Michael Brown

In hierdie artikel gaan ons kyk na die kwessies waarmee u te doen kan kry wanneer u gepasmaakte funksies in u werkboeke gebruik. Ek sal jou probeer wys wat hulle veroorsaak en hoe maklik dit opgelos kan word.

Hier is waaroor ons sal praat:

    Vroeër het ons gepraat oor wat 'n persoonlike funksie is, hoe om dit te skep en te gebruik. As jy voel dat jy die basiese kennis van UDF's vooraf moet verfris, neem 'n pouse en kyk deur my vorige artikel.

    Hoekom herbereken Excel UDF nie?

    Wanneer jy enige veranderinge aanbring in jou werkboek, sal Excel nie elke formule wat jy daar het, herbereken nie. Dit sal slegs die resultate opdateer vir daardie formules wat aan die veranderde selle gekoppel is.

    Maar dit gaan oor die standaard Excel-funksies. Wat die pasgemaakte betref, kan Excel nie die VBA-kode bekragtig en ander selle identifiseer wat ook die resultaat van die pasgemaakte funksie kan beïnvloed nie. Daarom sal jou pasgemaakte formule dalk nie verander wanneer jy veranderinge aan die werkboek maak nie.

    Om die probleem op te los, sal jy net die Application.Volatile -stelling moet gebruik. Kyk na die volgende hoofstuk om die stap-vir-stap-instruksies te leer oor hoe om dit toe te pas.

    Volitiele vs nie-vlugtige pasgemaakte funksies

    By verstek is pasgemaakte funksies in Excel nie wisselvallig nie. Dit beteken dat die UDF slegs herbereken word as die waarde van enige van die selle waarna dit verwys, verander. Maar as die formaat van die selle, die naam van diewerkblad, die naam van die lêer verander, dan sal geen veranderinge in die UDF plaasvind nie.

    Kom ons skakel oor van woorde na voorbeelde. Byvoorbeeld, jy moet die naam van jou werkboek in 'n sel neerskryf. Om dit te doen, skep jy 'n pasgemaakte funksie:

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

    Stel jou nou die volgende geval voor. Jy het persoonlike formule =WorkbookName() in die sel geskryf en die lêernaam daar gekry. In 'n rukkie het jy besluit om die lêer te hernoem en dit met 'n ander naam gestoor. Maar jy kyk na die waarde in die sel en sien dat dit nie verander het nie. Daar is steeds 'n ou lêernaam wat nie meer reg is nie.

    Aangesien daar geen argumente in hierdie funksie is nie, word die funksie nie herbereken nie (selfs al verander jy die naam van die werkboek, maak dit toe en maak dan weer oop dit).

    Let wel. Om al die funksies in jou lêer te herbereken, kan jy die Ctrl + Alt + F9-kortpad gebruik.

    Is daar 'n makliker manier? Om die formule te laat herbereken elke keer as die werkblad verander, benodig jy 'n ekstra reël kode. Plak die volgende stukkie kode aan die begin van jou funksie:

    Application.Volatile

    Dus, jou kode sal so lyk:

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

    Nou is jou UDF wisselvallig, dus sal dit outomaties herbereken word indien enige sel in die werkbladis herbereken of enige verandering het in die werkboek plaasgevind. Sodra jy die naam van die lêer verander, sal jy daardie opdatering dadelik sien.

    Let wel. Hou asseblief in gedagte dat te veel wisselvallige funksies jou Excel kan vertraag. Daar is immers te veel pasgemaakte funksies wat komplekse berekeninge uitvoer en voortdurend op groot datareekse werk.

    Daarom beveel ek aan om wisselvalligheid slegs te gebruik waar dit regtig nodig is.

    Waarom pasgemaakte funksies nie beskikbaar is nie

    Wanneer jy die eerste letters van die naam van 'n pasgemaakte funksie invoer, verskyn dit in die aftreklys langs die invoersel, net soos standaard Excel-funksies.

    Dit gebeur egter nie altyd nie. Watter foute kan hierdie situasie veroorsaak?

    As jy Excel 2003-2007 het, verskyn die UDF nooit in die aftreklys nie. Daar kan jy net standaardfunksies sien.

    Maar selfs al gebruik jy 'n nuwer weergawe van Excel, is daar nog 'n fout wat jy per ongeluk kan maak.

    Jy sien, die pasgemaakte funksie moet in 'n standaard VBA-module genoem Modules. Wanneer jy 'n nuwe module byvoeg om die funksiekode te skryf, word 'n Modules-lêergids outomaties geskep waarin alle modules geskryf word.

    Maar soms gebeur dit dat 'n nuwe module nie geskep word. Op die volgende skermkiekie kan jy sien dat die pasgemaakte funksiekode in die "Microsoft Excel Objects"-module saam metHierdieWerkboek.

    Die punt is dat jy nie 'n pasgemaakte funksie in die kodearea van 'n werkblad of werkboek kan plaas nie. In hierdie geval sal die funksie nie werk nie. Boonop sal dit nie in die aftreklys van funksies verskyn nie. Daarom moet die kode altyd in die vouer Modules wees.

    Excel pasgemaakte funksie-hulpteks word nie vertoon nie

    'n Ander probleem kan voorkom, is die wenk wat jy sien wanneer jy plak 'n pasgemaakte funksie. As jy 'n standaardfunksie gebruik, sal jy altyd 'n nutswenk vir die funksie en vir sy argumente sien. Maar wat van UDF's?

    As jy baie persoonlike funksies het, sal dit vir jou uiters moeilik wees om te onthou watter berekeninge elkeen van hulle doen. Dit sal selfs moeiliker wees om te onthou watter argumente om te gebruik. Ek dink dit sal 'n goeie idee wees om 'n beskrywing van jou pasgemaakte funksies as 'n herinnering te hê.

    Hiervoor stel ek voor om die Application.MacroOptions -metode te gebruik. Dit sal jou help om die beskrywing van nie net die funksie nie, maar ook van elkeen van sy argumente in die Function Wizard-venster te wys. Jy sien hierdie venster wanneer jy die Fx-knoppie in die formulebalk klik.

    Kom ons kyk hoe om so 'n wenk by jou UDF's te voeg. In die vorige artikel het ons gekyk na die GetMaxBetween-pasmaakfunksie. Dit vind die maksimum getal in die gespesifiseerde reeks en neem drie argumente: 'n reeks numeriese waardes, en 'n maksimum en minimum waarde omsoek na.

    Nou sal ons 'n beskrywing vir hierdie pasgemaakte funksie byvoeg. Om dit te doen, skep en hardloop die Application.MacroOptions opdrag. Vir die GetMaxBetween -funksie kan jy die volgende opdrag uitvoer:

    Sub RegisterUDF () Dim strFuncName As String 'naam van die funksie wat jy wil registreer Dim strDescr As String ' beskrywing van die funksie self Dim strArgs () As String 'beskrywing van funksie-argumente ' Registreer GetMaxBetween-funksie ReDim strArgs (1 Tot 3) 'Aantal argumente in jou funksie strFuncName = "GetMaxBetween" strDescr = "Maksimum aantal in die gespesifiseerde reeks" strArgs (1) = "Omvang van numeriese waardes" strArgs (2) = "Onderintervalgrens " strArgs (3) = " Boonste intervalgrens " Application.MacroOptions Makro: = strFuncName, _ Description: = strDescr, _ ArgumentDescriptions: = strArgs, _ Kategorie: = " My Custom Functions " End Sub

    of

    Sub RegisterUDF () Application.MacroOptions Makro: = "GetMaxBetween" , _ Description: = "Maksimum getal in die gespesifiseerde reeks" , _ Kategorie: = "My Pasgemaakte funksies" , _ ArgumentDescriptions: = Skikking (_ "Omvang van numeriese waardes" , _ "Laer interval bor der" , _ "Boonste intervalgrens" ) End Sub

    Veranderlike str FuncName is die naam van die funksie. strDescr - funksiebeskrywing. Die strArgs -veranderlikes bevat wenke vir elke argument.

    Jy wonder dalk wat die vierde argument is omToepassing.Makro-opsies. Hierdie opsionele argument word Kategorie genoem en dui die klas Excel-funksies aan waarin ons pasgemaakte GetMaxBetween () -funksie geplaas sal word. Jy kan dit na enige van die bestaande kategorieë noem: Wiskunde &amp. ; Trig, Statisties, Logies, ens. Jy kan 'n naam spesifiseer vir die nuwe kategorie waarin jy die funksies wat jy skep sal plaas. As jy nie die kategorie-argument gebruik nie, sal die pasgemaakte funksie outomaties in die "Gebruikergedefinieerde" kategorie geplaas word.

    Plak die funksiekode in die modulevenster:

    Klik dan op die "Run"-knoppie. Die opdrag sal al die instellings uitvoer vir die gebruik van die Fx -knoppie met jou GetMaxBetween() -funksie.

    As jy probeer om 'n funksie in 'n sel in te voeg met die Voeg funksie in -instrument, jy sal sien dat jou GetMaxBetween -funksie in die "My Custom Functions"-kategorie is:

    Jy kan eenvoudig die funksienaam in die sel begin tik en jy sal jou pasgemaakte funksie in die aftreklys van funksies sien om van te kies.

    Roep dan die Funksieassistent met die Fx-knoppie.

    Wenk. Jy kan ook die sleutelkombinasie CRTL + A gebruik om die Function Wizard oop te maak.

    In die Funksie Wizard venster sal jy 'n beskrywing van jou funksie sien, sowel as 'n wenk vir die eerste argument. As jy jou wyser oor dietweede of derde argument, jy sal ook wenke vir hulle sien.

    As jy die teks van hierdie wenke wil verander, verander die waardes van die strDescr en strArgs veranderlikes in die RegisterUDF () kode. Voer dan die RegisterUDF () -opdrag weer uit.

    As jy al die instellings wat gemaak is ongedaan wil maak en die funksiebeskrywing wil uitvee, voer hierdie kode uit:

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

    Daar is nog een manier om 'n wenk te kry wanneer jy 'n gepasmaakte funksie invoer. Tik die naam van die funksie in en druk dan die Ctrl + Shift + A :

    =GetMaxBetween( + Ctrl + Shift + A

    Jy sal 'n lys van al die funksie se argumente sien:

    Ongelukkig sal jy nie die beskrywing van die funksie en sy argumente hier sien nie. Maar as die name van die argumente redelik insiggewend is, kan dit ook nuttig wees. Tog is dit beter as niks :)

    Dit sal 'n bietjie meer werk verg om intellisense te skep vir UDF's wat soos standaard Excel-funksies werk. Ongelukkig bied Microsoft geen opsies nie. Die enigste oplossing wat tans beskikbaar is, is 'n Excel-DNA IntelliSense-uitbreiding. Jy kan meer inligting op die ontwikkelaar se webwerf kry.

    Hopelik sal hierdie riglyne jou help om probleme op te los wanneer jou pasgemaakte funksie nie werk nie of niewerk soos jy wil. As jou UDF egter steeds nie werk nie, beskryf asseblief jou probleem akkuraat in die Opmerkings-afdeling. Ons sal probeer om dit uit te vind en die oplossing vir jou te vind ;)

    Michael Brown is 'n toegewyde tegnologie-entoesias met 'n passie om komplekse prosesse te vereenvoudig deur sagteware-instrumente te gebruik. Met meer as 'n dekade se ondervinding in die tegnologiebedryf, het hy sy vaardighede in Microsoft Excel en Outlook, sowel as Google Sheets en Docs, opgeskerp. Michael se blog is toegewy daaraan om sy kennis en kundigheid met ander te deel, en verskaf maklik-om-te volg wenke en tutoriale vir die verbetering van produktiwiteit en doeltreffendheid. Of jy nou 'n ervare professionele persoon of 'n beginner is, Michael se blog bied waardevolle insigte en praktiese raad om die meeste uit hierdie noodsaaklike sagteware-nutsmiddels te kry.