Indholdsfortegnelse
I denne artikel vil vi se på de problemer, som du kan støde på, når du bruger bruger brugerdefinerede funktioner i dine arbejdsbøger. Jeg vil forsøge at vise dig, hvad der forårsager dem, og hvor let de kan løses.
Her er, hvad vi skal tale om:
Tidligere har vi talt om, hvad en brugerdefineret funktion er, hvordan man opretter og bruger den. Hvis du føler, at du har brug for at genopfriske den grundlæggende viden om UDF'er, kan du tage en pause og kigge min tidligere artikel igennem.
Hvorfor genberegner Excel UDF ikke?
Når du foretager ændringer i din projektmappe, vil Excel ikke genberegne hver eneste formel, du har der. Den vil kun opdatere resultaterne for de formler, der er knyttet til de ændrede celler.
Men det drejer sig om standard Excel-funktioner. Hvad angår de brugerdefinerede funktioner, kan Excel ikke validere VBA-koden og identificere andre celler, der også kan påvirke resultatet af den brugerdefinerede funktion. Derfor ændres din brugerdefinerede formel muligvis ikke, når du foretager ændringer i arbejdsmappen.
For at løse problemet skal du blot bruge Application.Volatile erklæring. Se det næste kapitel for at få trin-for-trin vejledninger om, hvordan du anvender den.
Flygtige vs. ikke-flygtige brugerdefinerede funktioner
Som standard er brugerdefinerede funktioner i Excel ikke flygtige. Det betyder, at UDF'en kun genberegnes, hvis værdien af en af de celler, den refererer til, ændres. Men hvis cellernes format, regnearkets navn eller filens navn ændres, sker der ingen ændringer i UDF'en.
Lad os skifte fra ord til eksempler. Du skal f.eks. skrive navnet på din arbejdsbog ned i en celle. For at gøre dette opretter du en brugerdefineret funktion:
Function WorkbookName() As String WorkbookName = ThisWorkbook.Name End Function
Forestil dig nu følgende tilfælde: Du har skrevet en brugerdefineret formel =WorkbookName() ind i cellen og fik filnavnet der. Efter et stykke tid besluttede du dig for at omdøbe filen og gemte den med et andet navn. Men du kigger på værdien i cellen og ser, at den ikke er ændret. Der er stadig et gammelt filnavn, som ikke længere er rigtigt.
Da der ikke er nogen argumenter i denne funktion, bliver funktionen ikke genberegnet (selv hvis du ændrer navnet på arbejdsmappen, lukker den og derefter åbner den igen).
Bemærk. For at genberegne alle funktionerne i din fil kan du bruge genvejen Ctrl + Alt + F9.
Er der en nemmere måde? For at få formlen til at genberegne formlen, hver gang regnearket ændres, skal du bruge en ekstra kodelinje. Indsæt følgende kode i begyndelsen af din funktion:
Application.Volatile
Så din kode vil se således ud:
Function WorkbookName() As String Application.Volatile WorkbookName = ThisWorkbook.Name End Function
Nu er din UDF flygtig, og den vil derfor automatisk blive genberegnet, hvis en celle i regnearket er blevet genberegnet, eller hvis der er sket ændringer i regnearket. Så snart du ændrer navnet på filen, vil du se opdateringen med det samme.
Bemærk. Husk på, at for mange flygtige funktioner kan gøre Excel langsommere. Der er trods alt for mange brugerdefinerede funktioner, der udfører komplekse beregninger og opererer på store datarækker løbende.
Derfor anbefaler jeg, at man kun bruger volatilitet, hvor det virkelig er nødvendigt.
Hvorfor brugerdefinerede funktioner ikke er tilgængelige
Når du indtaster de første bogstaver i navnet på en brugerdefineret funktion, vises den i rullelisten ved siden af indtastningscellen, ligesom standard Excel-funktioner.
Men det sker ikke altid. Hvilke fejl kan forårsage denne situation?
Hvis du har Excel 2003-2007, vises UDF'en aldrig i rullelisten. Der kan du kun se standardfunktioner.
Men selv hvis du bruger en nyere version af Excel, er der en anden fejl, du kan komme til at begå ved et uheld.
Den brugerdefinerede funktion skal nemlig være i et standard VBA-modul kaldet Modules. Når du tilføjer et nyt modul til at skrive funktionskoden, oprettes der automatisk en mappe Modules, hvori alle moduler skrives.
Men nogle gange sker det, at et nyt modul ikke bliver oprettet. På det næste skærmbillede kan du se, at den brugerdefinerede funktionskode er i modulet "Microsoft Excel Objects" sammen med ThisWorkbook.
Pointen er, at du ikke kan placere en brugerdefineret funktion i kodeområdet i et regneark eller en projektmappe. I så fald vil funktionen ikke fungere. Desuden vil den ikke blive vist i rullelisten over funktioner. Derfor skal koden altid ligge i mappen Moduler .
Excel brugerdefinerede funktioners hjælpetekst vises ikke
Et andet problem kan opstå i forbindelse med det tip, du får vist, når du indsætter en brugerdefineret funktion. Hvis du bruger en standardfunktion, vises der altid et tooltip for funktionen og dens argumenter. Men hvad med UDF'er?
Hvis du har mange brugerdefinerede funktioner, vil det være ekstremt svært for dig at huske, hvilke beregninger hver enkelt af dem foretager. Det vil være endnu sværere at huske, hvilke argumenter du skal bruge. Jeg tror, det vil være en god idé at have en beskrivelse af dine brugerdefinerede funktioner som en påmindelse.
Til dette formål vil jeg foreslå at bruge Application.MacroOptions Det hjælper dig med at vise beskrivelsen af ikke kun funktionen, men også af hvert af dens argumenter i vinduet Funktionsguiden. Du ser dette vindue, når du klikker på knappen Fx i formellinjen.
Lad os se, hvordan du tilføjer et sådant hint til dine UDF'er. I den foregående artikel så vi på den brugerdefinerede funktion GetMaxBetween. Den finder det maksimale tal i det angivne område og tager tre argumenter: et område af numeriske værdier og en maksimum- og minimumsværdi, der skal søges efter.
Nu skal vi tilføje en beskrivelse til denne brugerdefinerede funktion. For at gøre dette skal du oprette og køre Application.MacroOptions kommando. For den GetMaxBetween funktion, kan du køre følgende kommando:
Sub RegisterUDF () Dim strFuncName As String 'navnet på den funktion, du vil registrere Dim strDescr As String ' beskrivelse af selve funktionen Dim strArgs () As String 'beskrivelse af funktionens argumenter ' Registrer GetMaxBetween-funktionen ReDim strArgs (1 To 3) 'Antal argumenter i din funktion strFuncName = "GetMaxBetween" strDescr = "Maksimalt antal i det angivne område" strArgs (1) ="Område af numeriske værdier" strArgs (2) = "Nedre intervalgrænse " strArgs (3) = " Øvre intervalgrænse " Application.MacroOptions Macro: = strFuncName, _ Description: = strDescr, _ ArgumentDescriptions: = strArgs, _ Category: = " Mine brugerdefinerede funktioner " End Sub
eller
Sub RegisterUDF () Application.MacroOptions Makro: = "GetMaxBetween" , _ Description: = "Maksimalt tal i det angivne interval" , _ Category: = "Mine brugerdefinerede funktioner" , _ ArgumentDescriptions: = Array (_ "Område af numeriske værdier" , _ "Nedre intervalgrænse" , _ "Øvre intervalgrænse" ) End SubVariabel str FuncName er navnet på funktionen. strDescr - funktionsbeskrivelse. Den strArgs Variabler indeholder oplysninger for hvert argument.
Du undrer dig måske over, hvad det fjerde argument til Application.MacroOptions er. Dette valgfrie argument hedder Kategori og angiver den klasse af Excel-funktioner, som vores brugerdefinerede GetMaxBetween () Du kan navngive den efter en af de eksisterende kategorier: Math & Trig, Statistical, Logical, osv. Du kan angive et navn til den nye kategori, som du vil placere de funktioner, du opretter. Hvis du ikke bruger argumentet Category, vil den brugerdefinerede funktion automatisk blive placeret i kategorien "User Defined".
Indsæt funktionskoden i modulvinduet:
Klik derefter på knappen "Run" (Kør). Kommandoen vil udføre alle indstillingerne for brug af Fx knappen med din GetMaxBetween() funktion.
Hvis du forsøger at indsætte en funktion i en celle ved hjælp af Indsæt funktion værktøj, vil du se, at der er din GetMaxBetween funktionen er i kategorien "Mine brugerdefinerede funktioner":
Du kan blot begynde at skrive funktionsnavnet i cellen, og så vises din brugerdefinerede funktion i rullelisten over funktioner, som du kan vælge imellem.
Derefter skal du ringe til Guiden til funktioner med Fx-knappen.
Tip. Du kan også bruge tastekombinationen CRTL + A til at åbne funktionsguiden.
I den Guiden til funktioner vinduet vil du se en beskrivelse af din funktion samt et hint for det første argument. Hvis du placerer markøren over det andet eller tredje argument, vil du også se hints for dem.
Hvis du ønsker at ændre teksten i disse henvisninger, skal du ændre værdierne for strDescr og strArgs variabler i den RegisterUDF () kode. Kør derefter RegisterUDF () kommandoen igen.
Hvis du ønsker at fortryde alle indstillinger og slette funktionsbeskrivelsen, skal du køre denne kode:
Sub UnregisterUDF () Application.MacroOptions Macro: = "GetMaxBetween" , _ Description: = Empty , ArgumentDescriptions: = Empty , Category: = Empty End Sub
Der er endnu en måde at få et hint, når du indtaster en brugerdefineret funktion: Indtast navnet på funktionen, og tryk derefter på Ctrl + Shift + A :
=GetMaxBetween(
+ Ctrl + Shift + A
Du får vist en liste over alle funktionens argumenter:
Desværre kan du her ikke se beskrivelsen af funktionen og dens argumenter. Men hvis navnene på argumenterne er ret informative, så kan de også være nyttige. Det er dog bedre end ingenting :)
Det kræver lidt mere arbejde at skabe intellisense for UDF'er, der fungerer som standard Excel-funktioner. Desværre giver Microsoft ikke nogen muligheder. Den eneste løsning, der findes, er i øjeblikket en Excel-DNA IntelliSense-udvidelse. Du kan finde flere oplysninger på udviklerens websted.
Forhåbentlig vil disse retningslinjer hjælpe dig med at løse problemer, når din brugerdefinerede funktion ikke fungerer eller ikke fungerer som du gerne vil. Hvis din UDF stadig ikke fungerer, bedes du beskrive dit problem præcist i kommentarfeltet. Vi vil forsøge at finde ud af det og finde en løsning for dig ;)