Leer hoe om persoonlike funksies in Excel te ontfout

  • Deel Dit
Michael Brown

Soos jy reeds weet hoe om UDF's te skep (en ek hoop, jy het dit ook in jou Excel probeer toepas), kom ons delf 'n bietjie dieper en kyk wat gedoen kan word ingeval jou gebruikergedefinieerde funksie nie werk nie.

Om sommige probleme op te los wanneer 'n pasgemaakte funksie geskep word, sal jy heel waarskynlik 'n ontfouting moet uitvoer. Dan kan jy seker wees dat die funksie reg werk.

Ons sal die volgende ontfoutingstegnieke ondersoek:

    Wanneer jy 'n pasgemaakte funksie skep, is daar altyd 'n moontlikheid dat jy 'n fout sal maak. Pasgemaakte funksies is gewoonlik redelik kompleks. En hulle begin nie altyd dadelik reg werk nie. Die formule kan 'n verkeerde resultaat of die #VALUE! fout. Anders as standaard Excel-funksies, sal jy geen ander boodskappe sien nie.

    Is daar 'n manier om stap vir stap deur 'n pasgemaakte funksie te gaan om te kyk hoe elkeen van sy stellings werk? Sekerlik! Ontfouting word hiervoor gebruik.

    Ek sal jou verskeie maniere bied om jou pasgemaakte funksie te ontfout sodat jy die een kan kies wat vir jou werk.

    As 'n voorbeeld gebruik ons ​​die pasgemaakte funksie GetMaxBetween uit een van ons vorige artikels wat die maksimum getal in die gespesifiseerde reeks waardes bereken:

    Funksie GetMaxBetween(rngCells As Range, MinNum, MaxNum) Dim NumRange As Range Dim vMax Dim arrNums() Dim i As Heelgetal ReDim arrNums(rngCells.Count) Vir elke Getalreeks in rngSelle vMax =NumRange Kies Case vMax Case MinNum + 0.01 To MaxNum - 0.01 arrNums(i) = vMax i = i + 1 Case Else GetMaxBetween = 0 End Kies Volgende NumRange GetMaxBetween = WerkbladFunction.Max(arrNums is die) reeks selle waar getalle geskryf word, sowel as die boonste en onderste limiet van waardes.

    Plaas die MsgBox-funksie op belangrike plekke

    Om die uitvoering van berekeninge te monitor, kan jy vertoon die waardes van die belangrikste veranderlikes op die skerm op die regte plekke. Dit kan gedoen word deur opspringdialoogkassies te gebruik.

    MsgBox is 'n dialoogkassie wat jy kan gebruik om 'n soort boodskap aan die gebruiker te wys.

    MsgBox se sintaksis is soortgelyk aan ander VBA-funksies:

    MsgBox(prompt [, knoppies] [, titel] [, hulplêer, konteks])

    prompt is 'n vereiste argument. Dit bevat die boodskap wat jy in die dialoogkassie sien. Dit kan ook gebruik word om die waardes van individuele veranderlikes te vertoon.

    Al die ander argumente is opsioneel.

    [ knoppies ] - bepaal watter knoppies en ikone is vertoon in die MsgBox . Byvoorbeeld, as ons die opsie vbOkOnly gebruik, sal slegs die OK -knoppie vertoon word. Selfs as jy hierdie argument gemis het, word hierdie knoppie by verstek gebruik.

    [ titel ] - hier kan jy die titel van die boodskapkas spesifiseer.

    Kom ons skakel oor van woorde om te oefen en te begin ontfout. Om dieboodskap, voeg die volgende reël by die kode van die GetMaxBetween gebruikergedefinieerde funksie voor die Case Else operateur:

    MsgBox vMax,, "Count -" & i

    Hier is wat ons in die resultaat sal kry:

    Funksie GetMaxBetween(rngCells As Range, MinNum, MaxNum) Dim NumRange As Range Dim vMax Dim arrNums() Dim i As Integer ReDim arrNums(rngCells.Count) Vir elke NumRange In rngCells vMax = NumRange Kies 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 Kies Volgende NumRange GetMaxBetween = WorksheetFunction.Max(arrNums) Eindfunksie

    Deur die vMax veranderlike in die dialoogkassie te gebruik, sal ons sien watter getalle aan die kriteria vir seleksie voldoen, dus dat ons die grootste van hulle kan kies. Met die uitdrukking "Tel -" & amp; I in die titelbalk, dui ons aan hoeveel getalle ons reeds gekies het om die maksimum waarde te bepaal. Die teller sal met elke nuwe waarde verhoog word.

    Sodra ons ons UDF-stel het, pas ons die formule hieronder toe op die datumreeks:

    = GetMaxBetween (A1:A6,10,50)

    Na die Enter-knoppie gedruk word, sal jy 'n boodskap sien soos in die skermkiekie hieronder:

    Dit is die eerste nommer in die reeks A1: A6 wat aan die kriteria voldoen: groter as 10 maar minder as 50.

    Nadat jy OK geklik het, verskyn 'n tweede boodskap met die nommer 14. Die res van die nommers stem nie ooreen met die keusekriteria. Daarom gaan die funksie uit en gee die grootste van die twee waardes terug, 17.

    Die MsgBox -funksie kan op die belangrikste plekke in jou persoonlike funksie gebruik word om te beheer hoe die waardes van individuele veranderlikes verander. Boodskapkassies kan baie nuttig wees wanneer jy 'n groot funksie en baie berekening het. In hierdie geval sal dit vir jou maklik wees om te bepaal in watter deel van die kode die fout voorkom.

    Bepaal stoppunte en voer stap vir stap uit

    Jy kan breekpunte by die kode van jou funksie waar die uitvoering van die kode sal stop. So jy kan die berekeningsproses stap vir stap volg. Deur dit te doen, kan jy sien hoe die waardes van die veranderlikes verander.

    Om 'n breekpunt by te voeg, plaas die wyser op die lyn wat die stelling bevat waar jy kies om te onderbreek. Regskliek dan en kies Debug -> Wissel Breekpunt of druk net F9 . Jy kan ook op die verlangde plek op die vertikale grys area aan die linkerkant van die funksiekode klik.

    'n Rooi sirkel sal verskyn, soos jy in die skermkiekie hieronder kan sien. Die kodereël waar die berekening gestop sal word, word in rooi uitgelig.

    Nou sal die VBA-redigeerdervenster oopgemaak word wanneer die funksie loop. Die wyser sal geplaas word by die punt waar jy gestop het.

    As jy jou muiswyser oor enige van die veranderlikes in die funksiekode beweeg, kan jy hul huidige sienwaarde:

    Druk F5 om voort te gaan met die berekening.

    Let wel. Na die breekpunt kan jy die vordering van die berekeninge stap vir stap begin dop. As jy die F8-knoppie druk, sal slegs een volgende reël van die VBA-kode uitgevoer word. Die geel lyn met 'n pyl sal ook beweeg na die laaste uitgevoer kode posisie.

    Aangesien die uitvoering van die funksie weer onderbreek word, kan jy die huidige waardes van al die veranderlikes van die funksie met die muiswyser sien.

    Die volgende druk van F8 sal ons 'n stap vorentoe neem . So jy kan F8 druk tot aan die einde van die berekening. Of druk F5 om met die berekening voort te gaan tot die volgende breekpunt.

    As 'n fout voorkom, sal die wyser gestop word by die punt in die kode waar die fout plaasgevind het. En jy sal ook 'n pop-up foutboodskap sien. Dit maak dit maklik om die oorsaak van die probleem te bepaal.

    Die breekpunte wat jy spesifiseer sal toegepas word totdat jy die lêer toemaak. Wanneer jy dit weer oopmaak, sal jy hulle weer moet stel. Nie die mees gerieflike metode nie, dink jy nie?

    Hierdie probleem kan egter opgelos word. Voeg 'n Stop -stelling in die funksiekode by die nodige punte, en jy kan die programuitvoering stop op dieselfde manier as wanneer jy breekpunte gebruik.

    Wanneer VBA 'n Stop -stelling teëkom, sal dit programuitvoering stop en wag vir jou aksie. Kontroleer dan die waardes van die veranderlikesdruk F5 om voort te gaan.

    Of druk F8 om die funksie stap-vir-stap te vervul soos hierbo beskryf.

    Die Stop -stelling is deel van die program en is dus nie geskrap nie, soos die geval is met 'n breekpunt. Wanneer jy klaar is met ontfouting, verwyder dit self. Of verander dit in 'n opmerking deur dit vooraf te gaan met 'n enkele aanhaling (').

    Ontfouting met behulp van die Debug.Print-operateur

    Jy kan die Debug.Print in plaas die funksiekode op die regte plek. Dit is nuttig om die waardes van veranderlikes wat siklies verander na te gaan.

    Jy kan 'n voorbeeld van Debug.Print se werkverrigting op die skermkiekie hieronder sien.

    Statement Debug.Print i, vMax druk waardes en hul rangnommers af.

    In die Onmiddellike venster sien jy twee nommers (17 en 14) uit die geselekteerde reeks, wat ooreenstem met die limiete stel en waaruit die maksimum gekies sal word. Syfers 1 en 2 beteken dat die funksie 2 siklusse voltooi het waarin die getalle gekies is. Ons sien die waardes van die belangrikste veranderlikes, soos ons vroeër met MsgBox gedoen het. Maar dit het nie die funksie gestop nie.

    Roep 'n funksie van 'n prosedure af

    Jy kan 'n gebruikergedefinieerde funksie nie uit 'n sel in die werkblad oproep nie, maar vanaf 'n prosedure. In hierdie geval sal alle foute in die Visual Basic Editor-venster gewys word.

    Hier is hoe jy die gebruikergedefinieerde funksie GetMaxBerween vanaf 'nprosedure:

    Sub Test() Dim x x = GetMaxBetween(Range ( "A1:A6"), 10, 50) MsgBox(x) End Sub

    Posisioneer die wyser enige plek in die kode en druk F5 . As daar geen fout in die funksie is nie, sal jy 'n opspringvenster met die berekeningsresultaat sien.

    In die geval van 'n fout, sal jy 'n ooreenstemmende boodskap in die VBA-redigeerder sien. Die berekening sal gestop word en die kodereël waarin die fout plaasgevind het, sal in geel uitgelig word. Jy kan maklik identifiseer waar en hoekom die fout plaasgevind het.

    Dit is al. Nou het jy jou eie byvoeging geskep, dit by Excel gevoeg en jy kan die UDF daarin gebruik. As jy meer UDF's wil gebruik, skryf net die kode in die byvoegingsmodule in die VBA-redigeerder en stoor dit.

    Dit is dit vir vandag. Ons het verskillende maniere gedek om gepasmaakte funksies te ontfout en geleer hoe om dit in jou werkboek te gebruik. Ons hoop regtig dat u hierdie riglyne nuttig vind. As jy enige vrae het, skryf in die kommentaar by hierdie artikel.

    Michael Brown is 'n toegewyde tegnologie-entoesias met 'n passie om komplekse prosesse te vereenvoudig deur sagteware-instrumente te gebruik. Met meer as 'n dekade se ondervinding in die tegnologiebedryf, het hy sy vaardighede in Microsoft Excel en Outlook, sowel as Google Sheets en Docs, opgeskerp. Michael se blog is toegewy daaraan om sy kennis en kundigheid met ander te deel, en verskaf maklik-om-te volg wenke en tutoriale vir die verbetering van produktiwiteit en doeltreffendheid. Of jy nou 'n ervare professionele persoon of 'n beginner is, Michael se blog bied waardevolle insigte en praktiese raad om die meeste uit hierdie noodsaaklike sagteware-nutsmiddels te kry.