Innehållsförteckning
Eftersom du redan vet hur man skapar UDF:er (och jag hoppas att du också har provat att använda dem i Excel), ska vi gräva lite djupare och se vad som kan göras om din användardefinierade funktion inte fungerar.
För att lösa vissa problem när du skapar en anpassad funktion behöver du troligen köra en felsökning. Då kan du vara säker på att funktionen fungerar korrekt.
Vi kommer att utforska följande felsökningstekniker:
När du skapar en anpassad funktion finns det alltid en möjlighet att du gör ett misstag. Anpassade funktioner är vanligtvis ganska komplexa. Och de börjar inte alltid fungera korrekt direkt. Formeln kan ge ett felaktigt resultat eller felet #VALUE!. Till skillnad från vanliga Excel-funktioner får du inte se några andra meddelanden.
Finns det ett sätt att gå igenom en anpassad funktion steg för steg för att kontrollera hur varje enskilt uttalande fungerar? Visst! Debugging används för detta.
Jag kommer att erbjuda dig flera olika sätt att felsöka din anpassade funktion så att du kan välja det som passar dig bäst.
Som exempel använder vi den anpassade funktionen GetMaxBetween från en av våra tidigare artiklar som beräknar det högsta antalet i det angivna intervallet av värden:
Funktion GetMaxBetween(rngCells As Range, MinNum, MaxNum) Dim NumRange As Range Dim vMax Dim arrNums() Dim i As Integer ReDim arrNums(rngCells.Count) For Each NumRange In rngCells vMax = NumRange Select Case vMax Case MinNum + 0.01 To MaxNum - 0.01 arrNums(i) = vMax i = i + 1 Case Else GetMaxBetween = 0 End Select Next NumRange GetMaxBetween = WorksheetFunction.Max(arrNums) End FunctionFunktionsargumenten är det område av celler där siffror skrivs, samt den övre och undre gränsen för värdena.
Placera MsgBox-funktionen på viktiga ställen
För att övervaka utförandet av beräkningar kan du visa värdena för de viktigaste variablerna på skärmen på rätt ställe. Detta kan göras med hjälp av popup-dialogrutor.
MsgBox är en dialogruta som du kan använda för att visa ett meddelande till användaren.
Syntaxen för MsgBox liknar andra VBA-funktioner:
MsgBox(prompt [, knappar] [, titel] [, helpfile, kontext])uppmaning är ett obligatoriskt argument. Det innehåller det meddelande som visas i dialogrutan. Det kan också användas för att visa värdena för enskilda variabler.
Alla andra argument är valfria.
[ knappar ] - bestämmer vilka knappar och ikoner som ska visas i MsgBox Om vi till exempel använder alternativet vbOkOnly , är det endast den OK Även om du missat detta argument används denna knapp som standard.
[ titel ] - här kan du ange rubriken för meddelanderutan.
Låt oss byta från ord till praktik och börja felsöka. För att visa meddelandet lägger du till följande rad i koden för GetMaxBetween användardefinierad funktion före den Fall Else operatör:
MsgBox vMax,, "Antal -" & iSå här ser resultatet ut:
Funktion GetMaxBetween(rngCells As Range, MinNum, MaxNum) Dim NumRange As Range Dim vMax Dim arrNums() Dim i As Integer ReDim arrNums(rngCells.Count) For Each NumRange In rngCells vMax = NumRange Select Case vMax Case MinNum + 0.01 To MaxNum - 0.01 arrNums(i) = vMax i = i + 1 MsgBox vMax,,, "Count -" & i Case Else GetMaxBetween = 0 End Select Next NumRange GetMaxBetween =WorksheetFunction.Max(arrNums) SlutfunktionAnvändning av vMax variabeln i dialogrutan ser vi vilka tal som uppfyller urvalskriterierna, så att vi kan välja det största av dem. Med uttrycket "Count -" & I i rubrikfältet anger vi hur många tal vi redan har valt för att bestämma det maximala värdet. Räknaren ökas med varje nytt värde.
När vi har ställt in vår UDF tillämpar vi formeln nedan på datumintervallet:
= GetMaxBetween (A1:A6,10,50)
När du har tryckt på Enter-knappen visas ett meddelande som i skärmbilden nedan:
Detta är det första talet i intervallet A1: A6 som uppfyller kriterierna: större än 10 men mindre än 50.
När du klickar på OK visas ett andra meddelande med siffran 14. Resten av siffrorna motsvarar inte urvalskriterierna. Därför avslutas funktionen och returnerar det största av de två värdena, 17.
MsgBox kan användas på de viktigaste platserna i din anpassade funktion för att styra hur värdena för enskilda variabler ändras. Meddelanderutor kan vara mycket användbara när du har en stor funktion och många beräkningar. I det här fallet är det lätt för dig att avgöra i vilken del av koden felet uppstår.
Bestäm stopppunkter och utför steg för steg.
Du kan lägga till brytpunkter i koden för din funktion där kodutförandet stannar. På så sätt kan du följa beräkningsprocessen steg för steg. På så sätt kan du se hur värdena för variablerna ändras.
Om du vill lägga till en brytpunkt placerar du markören på den rad som innehåller det uttalande där du vill pausa. Högerklicka sedan och välj Debug -> Brytning av brytpunkt Du kan också klicka på önskad plats i det vertikala grå området till vänster om funktionskoden.
En röd cirkel visas, som du kan se i skärmbilden nedan. Den kodrad där beräkningen ska stoppas är markerad med rött.
Nu öppnas VBA-redigeringsfönstret när funktionen körs och markören placeras på den punkt där du slutade.
Om du för muspekaren över någon av variablerna i funktionskoden kan du se deras aktuella värde:
Tryck på F5 för att fortsätta beräkningen.
Obs. Efter brytpunkten kan du börja följa utvecklingen av beräkningarna steg för steg. Om du trycker på knappen F8 kommer endast en nästa rad av VBA-koden att exekveras. Den gula linjen med en pil kommer också att flytta sig till den senast exekverade kodpositionen.
Eftersom utförandet av funktionen är pausat igen kan du se de aktuella värdena för alla variabler i funktionen med hjälp av muspekaren.
Nästa tryck på F8 tar oss ett steg framåt. Du kan alltså trycka på F8 till slutet av beräkningen eller trycka på F5 för att fortsätta beräkningen fram till nästa brytpunkt.
Om ett fel inträffar stoppas markören vid den punkt i koden där felet inträffade. Dessutom visas ett popup-felmeddelande. Detta gör det enkelt att fastställa orsaken till problemet.
De brytpunkter du anger kommer att gälla tills du stänger filen. När du öppnar den igen måste du ställa in dem igen. Inte den mest praktiska metoden, tycker du inte?
Det här problemet kan dock lösas. Stoppa Statement i funktionskoden på de nödvändiga ställena, och du kan stoppa programutförandet på samma sätt som när du använder brytpunkter.
När VBA möter en Stoppa kommer programmet att avbrytas och vänta på din åtgärd. Kontrollera värdena för variablerna och tryck sedan på F5 för att fortsätta.
Eller tryck på F8 för att utföra funktionen stegvis enligt beskrivningen ovan.
Stoppa är en del av programmet och raderas därför inte, vilket är fallet med en brytpunkt. När du är klar med felsökningen tar du bort den själv. Eller gör den till en kommentar genom att föregå den med ett enkelt citationstecken (').
Felsökning med hjälp av Debug.Print-operatorn
Du kan placera Debug.Print Detta är användbart för att kontrollera värdena för variabler som ändras cykliskt.
Du kan se ett exempel på Debug.Prints prestanda i skärmdumpen nedan.
Uttalande Debug.Print i, vMax skriver ut värden och deras ordningsnummer.
I fönstret Immediate ser du två siffror (17 och 14) från det valda intervallet, som motsvarar de inställda gränserna och bland vilka det högsta värdet kommer att väljas. Siffrorna 1 och 2 betyder att funktionen har genomfört två cykler där siffrorna valdes. Vi ser värdena för de viktigaste variablerna, som vi gjorde tidigare med MsgBox Men detta stoppade inte funktionen.
Kalla en funktion från en procedur
Du kan anropa en användardefinierad funktion inte från en cell i arbetsbladet utan från en procedur. I det här fallet visas alla fel i fönstret Visual Basic Editor.
Så här kan du anropa den användardefinierade funktionen GetMaxBerween från en procedur:
Sub Test() Dim x x = GetMaxBetween(Range ("A1:A6" ), 10, 50) MsgBox(x) End SubPlacera markören någonstans i koden och tryck på F5 . Om det inte finns något fel i funktionen visas ett popup-fönster med beräkningsresultatet.
Om ett fel uppstår visas ett motsvarande meddelande i VBA-redigeraren. Beräkningen stoppas och den kodrad där felet inträffade markeras med gult. Du kan enkelt identifiera var och varför felet inträffade.
Nu har du skapat din egen tilläggsmodul, lagt till den i Excel och kan använda UDF:en i den. Om du vill använda fler UDF:er skriver du bara koden i tilläggsmodulen i VBA-editorn och sparar den.
Det var allt för idag. Vi har tagit upp olika sätt att felsöka anpassade funktioner och lärt oss hur du använder dem i din arbetsbok. Vi hoppas verkligen att du tycker att dessa riktlinjer är till hjälp. Om du har några frågor kan du skriva i kommentarerna till den här artikeln.