Inhoudsopgave
Aangezien u al weet hoe u UDF's maakt (en, naar ik hoop, ook hebt geprobeerd ze toe te passen in uw Excel), laten we wat dieper graven en zien wat u kunt doen als uw door de gebruiker gedefinieerde functie niet werkt.
Om sommige problemen bij het maken van een aangepaste functie op te lossen, moet u waarschijnlijk een debug uitvoeren. Dan kunt u er zeker van zijn dat de functie correct werkt.
We zullen de volgende debugging technieken onderzoeken:
Wanneer u een aangepaste functie maakt, is er altijd een kans dat u een fout maakt. Aangepaste functies zijn meestal vrij complex. En ze werken niet altijd meteen goed. De formule kan een onjuist resultaat of de foutmelding #VALUE! opleveren. In tegenstelling tot standaard Excel-functies ziet u geen andere meldingen.
Is er een manier om een aangepaste functie stap voor stap te doorlopen om te controleren hoe elk van de verklaringen werkt? Zeker! Debugging wordt hiervoor gebruikt.
Ik zal u verschillende manieren aanbieden om uw aangepaste functie te debuggen, zodat u de manier kunt kiezen die voor u werkt.
Als voorbeeld gebruiken we de aangepaste functie GetMaxBetween uit een van onze vorige artikelen die het maximum aantal berekent in het opgegeven bereik van waarden:
Functie 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 FunctionDe argumenten van de functie zijn het bereik van de cellen waarin de getallen worden geschreven, en de boven- en ondergrens van de waarden.
Plaats de MsgBox-functie op belangrijke plaatsen
Om de uitvoering van berekeningen te controleren, kunt u de waarden van de belangrijkste variabelen op de juiste plaatsen op het scherm weergeven. Dit kan met behulp van pop-up dialoogvensters.
MsgBox is een dialoogvenster dat je kunt gebruiken om een boodschap aan de gebruiker te tonen.
De syntaxis van MsgBox is vergelijkbaar met die van andere VBA-functies:
MsgBox(prompt [, knoppen] [, titel] [, helpbestand, context])prompt is een verplicht argument. Het bevat het bericht dat u in het dialoogvenster ziet. Het kan ook worden gebruikt om de waarden van individuele variabelen weer te geven.
Alle andere argumenten zijn optioneel.
[ knoppen ] - bepaalt welke knoppen en pictogrammen worden weergegeven in het MsgBox Als we bijvoorbeeld de optie vbOkOnly dan is alleen de OK Zelfs als u dit argument heeft gemist, wordt deze knop standaard gebruikt.
[ titel ] - hier kunt u de titel van het berichtvenster opgeven.
Laten we overschakelen van woorden naar praktijk en beginnen met debuggen. Om het bericht weer te geven, voeg je de volgende regel toe aan de code van de GetMaxBetween gebruiker gedefinieerde functie vóór de Case Else operator:
MsgBox vMax,, "Count -" & iDit is het resultaat:
Functie 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 =.WerkbladFunctie.Max(arrNums) Einde functieMet behulp van de vMax variabele in het dialoogvenster zien we welke getallen aan de selectiecriteria voldoen, zodat we de grootste daarvan kunnen selecteren. Met de uitdrukking "Count -" & I in de titelbalk geven we aan hoeveel getallen we al hebben geselecteerd om de maximumwaarde te bepalen. De teller wordt bij elke nieuwe waarde verhoogd.
Zodra we onze UDF hebben ingesteld, passen we de onderstaande formule toe op het datumbereik:
= GetMaxBetween (A1:A6,10,50)
Nadat u op de knop Enter hebt gedrukt, ziet u een bericht zoals in de onderstaande schermafbeelding:
Dit is het eerste getal in het bereik A1: A6 dat voldoet aan de criteria: groter dan 10 maar kleiner dan 50.
Nadat u op OK klikt, verschijnt een tweede bericht met het getal 14. De rest van de getallen voldoet niet aan de selectiecriteria. Daarom sluit de functie af en geeft de grootste van de twee waarden, 17, terug.
De MsgBox functie kan worden gebruikt op de belangrijkste plaatsen in uw aangepaste functie om te controleren hoe de waarden van individuele variabelen veranderen. Berichtenboxen kunnen zeer nuttig zijn wanneer u een grote functie en veel berekeningen hebt. In dat geval kunt u gemakkelijk bepalen in welk deel van de code de fout optreedt.
Stoppunten bepalen en stap voor stap uitvoeren
U kunt breekpunten toevoegen aan de code van uw functie waar de uitvoering van de code stopt. Zo kunt u het rekenproces stap voor stap volgen. Zo kunt u zien hoe de waarden van de variabelen veranderen.
Om een onderbrekingspunt toe te voegen, plaatst u de cursor op de regel met het statement waar u wilt pauzeren. Klik dan met de rechtermuisknop en selecteer Debug -> Toggle Breakpoint of druk gewoon op F9 . U kunt ook op de gewenste plaats klikken op het verticale grijze vlak links van de functiecode.
Er verschijnt een rode cirkel, zoals u kunt zien in de schermafbeelding hieronder. De regel code waar de berekening wordt gestopt is rood gemarkeerd.
Nu wordt het VBA-editorvenster geopend wanneer de functie wordt uitgevoerd. De cursor staat op het punt waar u bent gestopt.
Als je met je muiscursor over een van de variabelen in de functiecode gaat, zie je hun huidige waarde:
Druk op F5 om de berekening voort te zetten.
Opmerking. Na het onderbrekingspunt kunt u de voortgang van de berekeningen stap voor stap gaan volgen. Als u op de toets F8 drukt, wordt alleen de volgende regel van de VBA-code uitgevoerd. De gele lijn met een pijl gaat ook naar de laatst uitgevoerde codepositie.
Aangezien de uitvoering van de functie opnieuw wordt gepauzeerd, kunt u de huidige waarden van alle variabelen van de functie bekijken met behulp van de muiscursor.
Met de volgende druk op F8 gaan we een stap vooruit. U kunt dus op F8 drukken tot het einde van de berekening. Of op F5 drukken om de berekening voort te zetten tot het volgende breekpunt.
Als er een fout optreedt, wordt de cursor gestopt op het punt in de code waar de fout optrad. En u ziet ook een pop-up foutmelding. Dit maakt het gemakkelijk om de oorzaak van het probleem te achterhalen.
De onderbrekingspunten die u opgeeft, blijven van toepassing totdat u het bestand sluit. Wanneer u het bestand opnieuw opent, moet u ze opnieuw instellen. Niet de handigste methode, vindt u niet?
Dit probleem kan echter worden opgelost. Voeg een Stop statement in de functiecode op de noodzakelijke punten, en u kunt de programma-uitvoering op dezelfde manier stoppen als bij het gebruik van breekpunten.
Wanneer VBA een Stop statement, zal het programma stoppen met uitvoeren en wachten op jouw actie. Controleer de waarden van de variabelen en druk dan op F5 om verder te gaan.
Of druk op F8 om de functie stap voor stap uit te voeren zoals hierboven beschreven.
De Stop statement maakt deel uit van het programma en wordt daarom niet verwijderd, zoals het geval is met een breakpoint. Als u klaar bent met debuggen, verwijdert u het zelf. Of u maakt er een commentaar van door het te laten voorafgaan door een enkel aanhalingsteken (').
Debuggen met de Debug.Print-operator
U kunt de Debug.Print in de functiecode op de juiste plaats. Dit is nuttig voor het controleren van de waarden van variabelen die cyclisch veranderen.
Een voorbeeld van de prestaties van Debug.Print ziet u in de onderstaande schermafbeelding.
Verklaring Debug.Print i, vMax drukt waarden en hun rangnummers af.
In het onmiddellijke venster ziet u twee getallen (17 en 14) uit het geselecteerde bereik, dat overeenkomt met de ingestelde grenzen en waarvan het maximum zal worden geselecteerd. De cijfers 1 en 2 betekenen dat de functie 2 cycli heeft doorlopen waarin de getallen werden geselecteerd. We zien de waarden van de belangrijkste variabelen, zoals we eerder deden met MsgBox Maar dit stopte de functie niet.
Een functie aanroepen vanuit een procedure
U kunt een door de gebruiker gedefinieerde functie niet aanroepen vanuit een cel in het werkblad, maar vanuit een procedure. In dat geval worden alle fouten getoond in het venster Visual Basic Editor.
Hier ziet u hoe u de door de gebruiker gedefinieerde functie GetMaxBerween kunt aanroepen vanuit een procedure:
Sub Test() Dim x x = GetMaxBetween(Range ("A1:A6" ), 10, 50) MsgBox(x) End SubPlaats de cursor ergens in de code en druk op F5 . Als er geen fout in de functie zit, ziet u een pop-up venster met het berekeningsresultaat.
In geval van een fout ziet u een overeenkomstig bericht in de VBA-editor. De berekening wordt gestopt en de regel code waarin de fout is opgetreden, wordt geel gemarkeerd. U kunt gemakkelijk nagaan waar en waarom de fout is opgetreden.
Dat is alles. Nu heb je je eigen add-in gemaakt, toegevoegd aan Excel en kun je de UDF erin gebruiken. Als je meer UDF's wilt gebruiken, schrijf je de code in de add-in module in de VBA editor en sla je die op.
Dat is het voor vandaag. We hebben verschillende manieren behandeld om aangepaste functies te debuggen en geleerd hoe je ze in je werkmap kunt gebruiken. We hopen echt dat je deze richtlijnen nuttig vindt. Als je vragen hebt, schrijf dan in de opmerkingen bij dit artikel.