Excel UDF fungerer ikke: problemer og løsninger

  • Dele Denne
Michael Brown

I denne artikkelen tar vi en titt på problemene du kan møte når du bruker egendefinerte funksjoner i arbeidsbøkene dine. Jeg skal prøve å vise deg hva som forårsaker dem og hvor enkelt de kan løses.

Her er det vi skal snakke om:

    Tidligere snakket vi om hva en tilpasset funksjon er hvordan du oppretter og bruker den. Hvis du føler at du trenger å oppdatere den grunnleggende kunnskapen om UDFer på forhånd, ta en pause og se gjennom min forrige artikkel.

    Hvorfor regner ikke Excel UDF om?

    Når du gjør endringer i arbeidsboken din, vil ikke Excel omberegne hver eneste formel du har der. Det vil bare oppdatere resultatene for de formlene som er koblet til de endrede cellene.

    Men dette gjelder standard Excel-funksjoner. Når det gjelder de tilpassede, kan ikke Excel validere VBA-koden og identifisere andre celler som også kan påvirke resultatet av den tilpassede funksjonen. Derfor kan det hende at den egendefinerte formelen ikke endres når du gjør endringer i arbeidsboken.

    For å fikse problemet trenger du bare å bruke Application.Volatile -setningen. Ta en titt på neste kapittel for å lære trinnvise instruksjoner om hvordan du bruker det.

    Volatile vs ikke-flyktige egendefinerte funksjoner

    Som standard er ikke egendefinerte funksjoner i Excel flyktige. Dette betyr at UDF bare beregnes på nytt hvis verdien av noen av cellene den refererer til endres. Men hvis formatet på cellene, navnet påregneark, navnet på filen endres, så vil ingen endringer skje i UDF.

    La oss bytte fra ord til eksempler. Du må for eksempel skrive ned navnet på arbeidsboken i en celle. For å gjøre dette, oppretter du en egendefinert funksjon:

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

    Tenk deg nå følgende tilfelle. Du skrev egendefinert formel =WorkbookName() inn i cellen og fikk filnavnet der. Etter en stund bestemte du deg for å gi nytt navn til filen og lagret den med et annet navn. Men du ser på verdien i cellen og ser at den ikke har endret seg. Det er fortsatt et gammelt filnavn som ikke lenger er riktig.

    Siden det ikke er noen argumenter i denne funksjonen, beregnes ikke funksjonen på nytt (selv om du endrer navnet på arbeidsboken, lukker den og åpner den på nytt det).

    Merk. For å beregne alle funksjonene i filen din på nytt, kan du bruke snarveien Ctrl + Alt + F9.

    Finnes det en enklere måte? For å få formelen til å beregne på nytt hver gang regnearket endres, trenger du en ekstra kodelinje. Lim inn følgende kodebit i begynnelsen av funksjonen din:

    Application.Volatile

    Så koden din vil se slik ut:

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

    Nå er UDF-en din flyktig, derfor vil den bli beregnet på nytt automatisk hvis noen celle i regnearkethar blitt beregnet på nytt eller det har skjedd endringer i arbeidsboken. Så snart du endrer navnet på filen, vil du se den oppdateringen umiddelbart.

    Merk. Vær oppmerksom på at for mange flyktige funksjoner kan bremse Excel. Tross alt er det for mange tilpassede funksjoner som utfører komplekse beregninger og opererer på store dataområder kontinuerlig.

    Derfor anbefaler jeg å bruke volatilitet bare der det virkelig er nødvendig.

    Hvorfor egendefinerte funksjoner ikke er tilgjengelige

    Når du skriver inn de første bokstavene i navnet på en egendefinert funksjon, vises det i nedtrekkslisten ved siden av inndatacellen, akkurat som standard Excel-funksjoner.

    Dette skjer imidlertid ikke alltid. Hvilke feil kan forårsake denne situasjonen?

    Hvis du har Excel 2003-2007, vises aldri UDF i rullegardinlisten. Der kan du bare se standardfunksjoner.

    Men selv om du bruker en nyere versjon av Excel, er det en annen feil du kan gjøre ved et uhell.

    Du skjønner, den tilpassede funksjonen må være i en standard VBA-modul kalt moduler. Når du legger til en ny modul for å skrive funksjonskoden, opprettes det automatisk en Moduler-mappe der alle moduler er skrevet.

    Men noen ganger hender det at en ny modul ikke er det. blir skapt. På neste skjermbilde kan du se at den tilpassede funksjonskoden er i "Microsoft Excel Objects"-modulen sammen medThisWorkbook.

    Poenget er at du ikke kan plassere en egendefinert funksjon i kodeområdet til et regneark eller arbeidsbok. I dette tilfellet vil ikke funksjonen fungere. Dessuten vil det ikke vises i rullegardinlisten over funksjoner. Derfor skal koden alltid være i mappen Modules .

    Hjelpeteksten for Excel-egendefinerte funksjoner vises ikke

    Et annet problem kan oppstå er hintet du ser når du limer inn en tilpasset funksjon. Hvis du bruker en standardfunksjon, vil du alltid se et verktøytips for funksjonen og dens argumenter. Men hva med UDF-er?

    Hvis du har mange tilpassede funksjoner, vil det være ekstremt vanskelig for deg å huske hvilke beregninger hver av dem gjør. Det blir enda vanskeligere å huske hvilke argumenter man skal bruke. Jeg tror det vil være en god idé å ha en beskrivelse av de egendefinerte funksjonene dine som en påminnelse.

    For dette vil jeg foreslå å bruke Application.MacroOptions -metoden. Det vil hjelpe deg med å vise beskrivelsen av ikke bare funksjonen, men også av hvert av dens argumenter i funksjonsveiviser-vinduet. Du ser dette vinduet når du klikker på Fx-knappen i formellinjen.

    La oss se hvordan du legger til et slikt hint til UDF-ene dine. I forrige artikkel så vi på den tilpassede funksjonen GetMaxBetween. Den finner det maksimale antallet i det angitte området og tar tre argumenter: et område med numeriske verdier, og en maksimums- og minimumsverdi for åsøk etter.

    Nå legger vi til en beskrivelse for denne egendefinerte funksjonen. For å gjøre dette, opprett og kjør kommandoen Application.MacroOptions . For funksjonen GetMaxBetween kan du kjøre følgende kommando:

    Sub RegisterUDF () Dim strFuncName As String 'navn på funksjonen du vil registrere Dim strDescr As String ' beskrivelse av funksjonen seg Dim strArgs () Som streng 'beskrivelse av funksjonsargumenter ' Registrer GetMaxBetween-funksjonen ReDim strArgs (1 til 3) 'Antall argumenter i funksjonen din strFuncName = "GetMaxBetween" strDescr = "Maksimalt antall i det angitte området" strArgs (1) = "Omfang av numeriske verdier" strArgs (2) = "Nedre intervallgrense " strArgs (3) = " Øvre intervallkant " Application.MacroOptions Makro: = strFuncName, _ Beskrivelse: = strDescr, _ ArgumentDescriptions: = strArgs, _ Kategori: = " Mine egendefinerte funksjoner " End Sub

    eller

    Sub RegisterUDF () Application.MacroOptions Makro: = "GetMaxBetween" , _ Beskrivelse: = "Maksimalt antall i det angitte området" , _ Kategori: = "Min Egendefinerte funksjoner" , _ ArgumentDescriptions: = Matrise (_ "Område av numeriske verdier" , _ "Nedre intervall bor der", _ "Øvre intervallgrense" ) End Sub

    Variabel str Funksjonsnavn er navnet på funksjonen. strDescr - funksjonsbeskrivelse. strArgs -variablene inneholder hint for hvert argument.

    Du lurer kanskje på hva som er det fjerde argumentet tilApplication.MacroOptions. Dette valgfrie argumentet heter Kategori og indikerer klassen av Excel-funksjoner som vår egendefinerte GetMaxBetween () -funksjon vil bli plassert i. Du kan navngi den etter en av de eksisterende kategoriene: Math & ; Trig, Statistical, Logical, etc. Du kan angi et navn for den nye kategorien der du skal plassere funksjonene du oppretter. Hvis du ikke bruker kategoriargumentet, vil den tilpassede funksjonen automatisk bli plassert i kategorien "Brukerdefinert".

    Lim inn funksjonskoden i modulvinduet:

    Klikk deretter på "Kjør"-knappen. Kommandoen vil utføre alle innstillingene for bruk av Fx -knappen med GetMaxBetween() -funksjonen.

    Hvis du prøver å sette inn en funksjon i en celle ved å bruke GetMaxBetween() -funksjonen. 6>Sett inn funksjon -verktøyet, vil du se at GetMaxBetween -funksjonen din er i kategorien "Mine tilpassede funksjoner":

    Du kan du ganske enkelt begynne å skrive funksjonsnavnet inn i cellen, og du vil se din egendefinerte funksjon i rullegardinlisten over funksjoner du kan velge fra.

    Krop deretter Funksjonsveiviseren med Fx-knappen.

    Tips. Du kan også bruke tastekombinasjonen CRTL + A for å åpne funksjonsveiviseren.

    I vinduet Funksjonsveiviser vil du se en beskrivelse av funksjonen din, samt et hint til det første argumentet. Hvis du plasserer markøren overandre eller tredje argument, vil du også se hint for dem.

    Hvis du vil endre teksten til disse hintene, endre verdiene til strDescr og strArgs variabler i RegisterUDF () -koden. Kjør deretter kommandoen RegisterUDF () igjen.

    Hvis du vil angre alle innstillingene som er gjort og slette funksjonsbeskrivelsen, kjør denne koden:

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

    Det er en annen måte å få et hint når du går inn i en egendefinert funksjon. Skriv inn navnet på funksjonen og trykk deretter Ctrl + Shift + A :

    =GetMaxBetween( + Ctrl + Shift + A

    Du vil se en liste over alle funksjonens argumenter:

    Her vil du dessverre ikke se beskrivelsen av funksjonen og dens argumenter. Men hvis navnene på argumentene er ganske informative, så kan de også være nyttige. Likevel er det bedre enn ingenting :)

    Det vil kreve litt mer arbeid å lage intellisense for UDF-er som fungerer som standard Excel-funksjoner. Dessverre tilbyr ikke Microsoft noen alternativer. Den eneste tilgjengelige løsningen er for øyeblikket en Excel-DNA IntelliSense-utvidelse. Du kan finne mer informasjon på utviklerens nettsted.

    Forhåpentligvis vil disse retningslinjene hjelpe deg med å løse problemer når den tilpassede funksjonen din ikke fungerer eller ikkejobbe som du vil. Hvis imidlertid UDF-en din fortsatt ikke fungerer, vennligst beskriv problemet ditt nøyaktig i kommentarfeltet. Vi skal prøve å finne ut av det og finne løsningen for deg ;)

    Michael Brown er en dedikert teknologientusiast med en lidenskap for å forenkle komplekse prosesser ved hjelp av programvareverktøy. Med mer enn ti års erfaring i teknologibransjen, har han forbedret ferdighetene sine i Microsoft Excel og Outlook, samt Google Sheets og Docs. Michaels blogg er dedikert til å dele sin kunnskap og ekspertise med andre, og gir enkle å følge tips og veiledninger for å forbedre produktivitet og effektivitet. Enten du er en erfaren profesjonell eller nybegynner, tilbyr Michaels blogg verdifull innsikt og praktiske råd for å få mest mulig ut av disse viktige programvareverktøyene.