Excel UDF fungerar inte: problem och lösningar

  • Dela Detta
Michael Brown

I den här artikeln tar vi en titt på de problem som du kan stöta på när du använder anpassade funktioner i dina arbetsböcker. Jag ska försöka visa vad som orsakar dem och hur enkelt de kan lösas.

Här är vad vi kommer att prata om:

    Tidigare har vi talat om vad en anpassad funktion är, hur man skapar och använder den. Om du känner att du behöver uppdatera dina grundläggande kunskaper om UDF:er kan du ta en paus och titta igenom min tidigare artikel.

    Varför räknar Excel UDF inte om?

    När du gör ändringar i arbetsboken räknar Excel inte om alla formler du har där, utan uppdaterar endast resultaten för de formler som är kopplade till de ändrade cellerna.

    Detta gäller dock Excel-standardfunktioner. När det gäller de anpassade funktionerna kan Excel inte validera VBA-koden och identifiera andra celler som också kan påverka resultatet av den anpassade funktionen. Därför kan det hända att din anpassade formel inte ändras när du gör ändringar i arbetsboken.

    För att åtgärda problemet behöver du bara använda Applikation.Volatile Läs nästa kapitel för att få steg-för-steg-instruktioner om hur du använder den.

    Flyktiga respektive icke-flyktiga anpassade funktioner

    Som standard är anpassade funktioner i Excel inte flyktiga. Det betyder att UDF:n räknas om endast om värdet på någon av de celler som den hänvisar till ändras. Men om cellernas format, arbetsbladets namn eller filens namn ändras, ändras inte UDF:n.

    Låt oss byta från ord till exempel. Du behöver till exempel skriva ner namnet på arbetsboken i en cell. För att göra det skapar du en anpassad funktion:

    Funktion WorkbookName() As String WorkbookName = ThisWorkbook.Name Slutfunktion

    Föreställ dig nu följande fall: Du har skrivit en anpassad formel =WorkbookName() i cellen och fick filnamnet där. Efter ett tag bestämde du dig för att byta namn på filen och sparade den med ett annat namn. Men du tittar på värdet i cellen och ser att det inte har ändrats. Det finns fortfarande ett gammalt filnamn som inte längre är rätt.

    Eftersom det inte finns några argument i den här funktionen räknas funktionen inte om (även om du ändrar arbetsbokens namn, stänger den och sedan öppnar den igen).

    Observera: Om du vill räkna om alla funktioner i din fil kan du använda genvägen Ctrl + Alt + F9.

    Finns det ett enklare sätt? För att få formeln att räknas om varje gång arbetsbladet ändras behöver du en extra kodrad. Klistra in följande kod i början av din funktion:

    Applikation.Volatile

    Din kod kommer alltså att se ut så här:

    Funktion WorkbookName() As String Application.Volatile WorkbookName = ThisWorkbook.Name Slutfunktion

    Nu är din UDF flyktig, vilket innebär att den kommer att räknas om automatiskt om någon cell i kalkylbladet har räknats om eller om någon ändring har skett i arbetsboken. Så snart du ändrar namnet på filen kommer du att se uppdateringen omedelbart.

    Observera: Tänk på att för många flyktiga funktioner kan göra Excel långsammare. Det finns trots allt för många anpassade funktioner som utför komplexa beräkningar och som kontinuerligt bearbetar stora datavärden.

    Därför rekommenderar jag att volatilitet endast används där det verkligen behövs.

    Varför anpassade funktioner inte är tillgängliga

    När du anger de första bokstäverna i namnet på en anpassad funktion visas den i rullgardinslistan bredvid inmatningscellen, precis som vanliga Excel-funktioner.

    Detta är dock inte alltid fallet. Vilka misstag kan orsaka denna situation?

    Om du har Excel 2003-2007 visas UDF aldrig i rullgardinslistan. Där visas endast standardfunktioner.

    Men även om du använder en nyare version av Excel finns det ett annat misstag som du kan råka göra.

    Den anpassade funktionen måste finnas i en standard VBA-modul som heter Modules. När du lägger till en ny modul för att skriva funktionskoden skapas automatiskt en mapp Modules där alla moduler skrivs.

    Men ibland händer det att en ny modul inte skapas. På nästa skärmdump kan du se att koden för den anpassade funktionen finns i modulen "Microsoft Excel Objects" tillsammans med ThisWorkbook.

    Poängen är att du inte kan placera en anpassad funktion i kodområdet i ett arbetsblad eller en arbetsbok. I så fall kommer funktionen inte att fungera. Dessutom kommer den inte att visas i rullgardinslistan över funktioner. Därför ska koden alltid finnas i mappen Moduler .

    Hjälptexten för Excel-anpassad funktion visas inte

    Ett annat problem som kan uppstå är den tips som visas när du klistrar in en anpassad funktion. Om du använder en standardfunktion visas alltid en verktygstips för funktionen och dess argument. Men hur är det med UDF:er?

    Om du har många anpassade funktioner kommer det att bli extremt svårt för dig att komma ihåg vilka beräkningar varje funktion gör. Det blir ännu svårare att komma ihåg vilka argument som ska användas. Jag tror att det är en bra idé att ha en beskrivning av dina anpassade funktioner som en påminnelse.

    För detta föreslår jag att du använder Application.MacroOptions Det hjälper dig att visa beskrivningen av inte bara funktionen utan också av varje argument i fönstret Funktionsguiden. Du ser detta fönster när du klickar på knappen Fx i formellfältet.

    Låt oss se hur du kan lägga till en sådan ledtråd i dina UDF:er. I föregående artikel tittade vi på den anpassade funktionen GetMaxBetween. Den hittar det högsta talet i det angivna intervallet och tar emot tre argument: ett intervall av numeriska värden samt ett högsta och lägsta värde att söka efter.

    Nu ska vi lägga till en beskrivning för den här anpassade funktionen. För att göra detta skapar och kör du Application.MacroOptions kommandot. För GetMaxBetween funktionen kan du köra följande kommando:

    Sub RegisterUDF () Dim strFuncName As String 'namnet på den funktion du vill registrera Dim strDescr As String ' beskrivning av själva funktionen Dim strArgs () As String 'beskrivning av funktionsargument ' Registrera GetMaxBetween-funktionen ReDim strArgs (1 To 3) 'Antal argument i din funktion strFuncName = "GetMaxBetween" strDescr = "Maximalt antal i det angivna intervallet" strArgs (1) ="Intervall av numeriska värden" strArgs (2) = "Nedre intervallgräns" strArgs (3) = "Övre intervallgräns" Application.MacroOptions Macro: = strFuncName, _ Description: = strDescr, _ ArgumentDescriptions: = strArgs, _ Category: = " Mina egna funktioner " End Sub

    eller .

    Sub RegisterUDF () Application.MacroOptions Makro: = "GetMaxBetween" , _ Description: = "Maximalt antal i det angivna intervallet" , _ Category: = "Mina egna funktioner" , _ ArgumentDescriptions: = Array (_ "Intervall av numeriska värden" , _ "Nedre intervallgräns" , _ "Övre intervallgräns" ) End Sub

    Variabel str FuncName är namnet på funktionen. strDescr - funktionsbeskrivning. strArgs Variablerna innehåller tips för varje argument.

    Du kanske undrar vad det fjärde argumentet i Application.MacroOptions är. Detta valfria argument heter Kategori och anger den klass av Excel-funktioner som vår anpassade GetMaxBetween () Du kan namnge den efter någon av de befintliga kategorierna: Math & Trig, Statistical, Logical, etc. Du kan ange ett namn för den nya kategorin där du kommer att placera de funktioner du skapar. Om du inte använder argumentet Category placeras den anpassade funktionen automatiskt i kategorin "User Defined".

    Klistra in funktionskoden i modulfönstret:

    Klicka sedan på knappen "Kör". Kommandot kommer att utföra alla inställningar för att använda Fx knappen med din GetMaxBetween() funktion.

    Om du försöker infoga en funktion i en cell med hjälp av Infoga funktion verktyget, ser du att det finns din GetMaxBetween finns i kategorin "Mina egna funktioner":

    Du kan helt enkelt börja skriva in funktionsnamnet i cellen så visas din anpassade funktion i rullgardinslistan med funktioner att välja mellan.

    Ring sedan upp Funktionsguiden med Fx-knappen.

    Tips: Du kan också använda tangentkombinationen CRTL + A för att öppna funktionsguiden.

    I Funktionsguiden fönstret ser du en beskrivning av din funktion och en ledtråd för det första argumentet. Om du placerar markören över det andra eller tredje argumentet ser du också ledtrådar för dem.

    Om du vill ändra texten i dessa tips ändrar du värdena för strDescr och strArgs variabler i RegistreraUDF () koden. Kör sedan RegistreraUDF () kommandot igen.

    Om du vill ångra alla inställningar och rensa funktionsbeskrivningen kör du den här koden:

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

    Det finns ytterligare ett sätt att få en ledtråd när du anger en anpassad funktion: Ange funktionens namn och tryck sedan på Ctrl + Shift + A :

    =GetMaxBetween( + Ctrl + Shift + A

    Du får en lista med alla funktionens argument:

    Tyvärr kan du här inte se beskrivningen av funktionen och dess argument. Men om namnen på argumenten är ganska informativa, så kan de också vara till hjälp. Det är bättre än ingenting :)

    Det krävs lite mer arbete för att skapa intellisense för UDF:er som fungerar som vanliga Excel-funktioner. Tyvärr erbjuder Microsoft inga alternativ. Den enda lösningen som finns är för närvarande ett Excel-DNA IntelliSense-tillägg. Du hittar mer information på utvecklarens webbplats.

    Förhoppningsvis kan dessa riktlinjer hjälpa dig att lösa problem när din anpassade funktion inte fungerar eller inte fungerar som du vill. Om din UDF ändå inte fungerar, beskriv ditt problem noggrant i kommentarsfältet. Vi ska försöka lista ut det och hitta en lösning åt dig ;)

    Michael Brown är en hängiven teknikentusiast med en passion för att förenkla komplexa processer med hjälp av mjukvaruverktyg. Med mer än ett decenniums erfarenhet inom teknikbranschen har han finslipat sina kunskaper i Microsoft Excel och Outlook, samt Google Sheets och Docs. Michaels blogg är tillägnad att dela med sig av sin kunskap och expertis med andra, och tillhandahåller lätta att följa tips och handledningar för att förbättra produktiviteten och effektiviteten. Oavsett om du är en erfaren proffs eller nybörjare, erbjuder Michaels blogg värdefulla insikter och praktiska råd för att få ut det mesta av dessa viktiga programvaruverktyg.