Learje hoe't jo oanpaste funksjes yn Excel kinne debuggen

  • Diel Dit
Michael Brown

Sa't jo al witte hoe't jo UDF's kinne oanmeitsje (en, ik hoopje, jo hawwe ek besocht se yn jo Excel ta te passen), litte wy wat djipper grave en sjen wat der dien wurde kin as jo troch brûkers definieare funksje net wurket.

Om guon problemen op te lossen by it meitsjen fan in oanpaste funksje, moatte jo nei alle gedachten in debug útfiere. Dan kinne jo der wis fan wêze dat de funksje goed wurket.

Wy sille de folgjende debuggentechniken ûndersykje:

    As jo ​​in oanpaste funksje meitsje, is d'r altyd in mooglikheid dat jo in flater meitsje. Oanpaste funksjes binne normaal frij kompleks. En se begjinne net altyd direkt goed te wurkjen. De formule kin in ferkeard resultaat of de #VALUE! fersin. Oars as standert Excel-funksjes sille jo gjin oare berjochten sjen.

    Is d'r in manier om stap foar stap troch in oanpaste funksje te gean om te kontrolearjen hoe't elk fan syn útspraken wurket? Wis! Debuggen wurdt dêrfoar brûkt.

    Ik sil jo ferskate manieren biede om jo oanpaste funksje te debuggen, sadat jo dejinge kinne kieze dy't foar jo wurket.

    As foarbyld brûke wy de oanpaste funksje GetMaxBetween út ien fan ús eardere artikels dy't it maksimum oantal berekkent yn it opjûne berik fan wearden:

    Funksje GetMaxBetween(rngCells As Range, MinNum, MaxNum) Dim NumRange As Range Dim vMax Dim arrNums() Dim i As Integer ReDim arrNums(rngCells.Count) Foar Elke NumRange In rngCells vMax =NumRange Selektearje Case vMax Case MinNum + 0,01 To MaxNum - 0,01 arrNums(i) = vMax i = i + 1 Case Else GetMaxBetween = 0 End Selektearje Folgjende NumRange GetMaxBetween = WurkblêdFunction.Max(End function argumint <0 is de>) berik fan sellen dêr't nûmers wurde skreaun, lykas de boppe- en ûndergrins fan wearden.

    Plaze de MsgBox-funksje op wichtige plakken

    Om de útfiering fan berekkeningen te kontrolearjen, kinne jo werjaan de wearden fan de meast wichtige fariabelen op it skerm op de goede plakken. Dit kin dien wurde mei help fan pop-up dialoochfinsters.

    MsgBox is in dialoochfinster dat jo brûke kinne om in soart berjocht oan de brûker te sjen.

    De syntaksis fan MsgBox is gelyk oan oare VBA-funksjes:

    MsgBox (prompt [, knoppen] [, titel] [, helptriem, kontekst])

    prompt is in fereaske argumint. It befettet it berjocht dat jo sjogge yn it dialoochfinster. It kin ek brûkt wurde om de wearden fan yndividuele fariabelen wer te jaan.

    Alle oare arguminten binne opsjoneel.

    [ knoppen ] - bepaalt hokker knoppen en ikoanen binne werjûn yn de MsgBox . As wy bygelyks de opsje vbOkOnly brûke, dan sil allinich de knop OK werjûn wurde. Sels as jo dit argumint hawwe mist, wurdt dizze knop standert brûkt.

    [ titel ] - hjir kinne jo de titel fan it berjochtfak opjaan.

    Litte wy oerskeakelje fan wurden om te oefenjen en te begjinnen mei debuggen. Om werjaan deberjocht, foegje de folgjende rigel ta oan de koade fan de GetMaxBetween brûker-definieare funksje foar de Case Else operator:

    MsgBox vMax,, "Count -" & i

    Hjir is wat wy krije yn it resultaat:

    Funksje GetMaxBetween(rngCells As Range, MinNum, MaxNum) Dim NumRange As Range Dim vMax Dim arrNums() Dim i As Integer ReDim arrNums(rngCells.Count) Foar eltse NumRange In rngCells vMax = NumRange Selektearje Case vMax Case MinNum + 0,01 To MaxNum - 0,01 arrNums (ik) = vMax i = i + 1 MsgBox vMax,, "Count -" & amp; i Case Else GetMaxBetween = 0 End Selektearje Folgjende NumRange GetMaxBetween = WorksheetFunction.Max(arrNums) End Function

    Mei help fan de vMax fariabele yn it dialoochfinster, sille wy sjen hokker nûmers foldogge oan de kritearia foar seleksje, dus dat wy kinne selektearje de grutste fan harren. Mei de útdrukking "Count -" & amp; Ik yn 'e titelbalke, wy jouwe oan hoefolle nûmers wy hawwe al selektearre foar in bepale de maksimale wearde. De teller wurdt ferhege mei elke nije wearde.

    As wy ús UDF ynsteld hawwe, tapasse wy de formule hjirûnder op it datumberik:

    = GetMaxBetween (A1:A6,10,50)

    Nei de Enter-knop wurdt yndrukt, sille jo in berjocht sjen lykas yn it skermôfbylding hjirûnder:

    Dit is it earste nûmer yn it berik A1: A6 dat foldocht oan de kritearia: grutter dan 10 mar minder as 50.

    Neidat jo op OK klikke, ferskynt in twadde berjocht mei it nûmer 14. De rest fan de nûmers komme net oerien mei de seleksjekritearia. Dêrom giet de funksje út en jout de grutste fan 'e twa wearden werom, 17.

    De funksje MsgBox kin brûkt wurde op 'e wichtichste plakken yn jo oanpaste funksje om te kontrolearjen hoe't de wearden fan yndividuele fariabelen feroarje. Berjochtfakjes kinne heul nuttich wêze as jo in grutte funksje hawwe en in protte berekkening. Yn dit gefal sil it jo maklik wêze om te bepalen yn hokker diel fan 'e koade de flater optreedt.

    Bepale stoppunten en útfiere stap foar stap

    Jo kinne brekpunten tafoegje oan de koade fan jo funksje dêr't de koade útfiering sil stopje. Sa kinne jo it berekkeningsproses stap foar stap folgje. Dêrmei kinne jo sjen hoe't de wearden fan 'e fariabelen feroarje.

    Om in brekpunt ta te foegjen, set de rinnerke op 'e rigel mei de ferklearring wêryn jo kieze om te pausen. Rjochtsklik dan en selektearje Debug -> Skeakelje Breakpoint of druk gewoan op F9 . Jo kinne ek op it winske plak klikke op it fertikale grize gebiet links fan 'e funksjekoade.

    Der sil in reade sirkel ferskine, sa't jo kinne sjen yn 'e skermprint hjirûnder. De rigel fan koade dêr't de berekkening wurdt stoppe wurdt markearre yn read.

    No, it VBA bewurker finster wurdt iepene as de funksje rint. De rinnerke sil pleatst wurde op it punt dêr't jo stoppe binne.

    As jo ​​mei de mûsoanwizer oer ien fan 'e fariabelen yn 'e funksjekoade hâlde, kinne jo har aktuele sjenwearde:

    Druk op F5 om de berekkening troch te gean.

    Opmerking. Nei it brekpunt kinne jo de fuortgong fan 'e berekkeningen stap foar stap begjinne te folgjen. As jo ​​op de F8-knop drukke, sil mar ien folgjende rigel fan 'e VBA-koade wurde útfierd. De giele line mei in pylk sil ek ferpleatse nei de lêste útfierde koade posysje.

    Sûnt de útfiering fan de funksje wer ûnderbrutsen is, kinne jo de aktuele wearden fan alle fariabelen fan de funksje besjen mei de mûsoanwizer.

    De folgjende druk op F8 sil ús ien stap foarút bringe . Sa kinne jo op F8 drukke oant it ein fan 'e berekkening. Of druk op F5 om de berekkening troch te gean oant it folgjende brekpunt.

    As in flater optreedt, sil de rinnerke stoppe wurde op it punt yn 'e koade wêr't de flater ûntstie. En jo sille ek in pop-up flater berjocht sjen. Dit makket it maklik om de oarsaak fan it probleem te bepalen.

    De brekpunten dy't jo oantsjutte wurde tapast oant jo it bestân slute. As jo ​​​​it opnij iepenje, moatte jo se opnij ynstelle. Net de meast handige metoade, tinke jo net?

    Dit probleem kin lykwols oplost wurde. Foegje in Stop -útspraak yn de funksjekoade op de nedige punten, en jo kinne de útfiering fan it programma op deselde wize stopje as by it brûken fan brekpunten.

    As VBA in Stop -statement tsjinkomt, sil it programma-útfiering stopje en wachtsje op jo aksje. Kontrolearje dan de wearden fan 'e fariabelendruk op F5 om troch te gean.

    Of druk op F8 om de funksje stap foar stap út te fieren lykas hjirboppe beskreaun.

    De Stop -útspraak is ûnderdiel fan it programma en is dêrom net wiske, lykas it gefal is mei in brekpunt. As jo ​​klear binne mei debuggen, ferwiderje it sels. Of feroarje it yn in opmerking troch it foar te setten mei in inkele quote (').

    Debuggen mei de Debug.Print-operator

    Jo kinne de Debug.Print yn pleatse de funksje koade op it goede plak. Dit is nuttich foar it kontrolearjen fan de wearden fan fariabelen dy't syklisk feroarje.

    Jo kinne in foarbyld sjen fan de prestaasjes fan Debug.Print op it skermôfbylding hjirûnder.

    Statement Debug.Print i, vMax drukt wearden en harren rangnûmers ôf.

    Yn it Immediate finster sjogge jo twa nûmers (17 en 14) út it selektearre berik, dat oerienkomt mei de set grinzen en ûnder dêr't it maksimum wurdt selektearre. Sifers 1 en 2 betsjutte dat de funksje hat foltôge 2 syklusen wêryn de nûmers waarden selektearre. Wy sjogge de wearden fan 'e wichtichste fariabelen, lykas wy earder diene mei MsgBox . Mar dit stoppe de funksje net.

    Roppe in funksje út in proseduere

    Jo kinne in troch de brûker definieare funksje net út in sel yn it wurkblêd, mar út in proseduere neame. Yn dit gefal wurde alle flaters werjûn yn it finster fan Visual Basic Editor.

    Hjir is hoe't jo de troch de brûkers definieare funksje GetMaxBerween fan inproseduere:

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

    Plaze de rinnerke oeral yn 'e koade en druk op F5. As der gjin flater is yn 'e funksje, sille jo in pop-up-finster sjen mei it berekkeningsresultaat.

    Yn gefal fan in flater sille jo in oerienkommende berjocht sjen yn 'e VBA-bewurker. De berekkening sil wurde stoppe en de rigel fan koade wêryn de flater barde wurdt yn giel markearre. Jo kinne maklik identifisearje wêr en wêrom't de flater ûntstie.

    Dat is alles. No hawwe jo jo eigen add-in oanmakke, tafoege oan Excel en jo kinne de UDF deryn brûke. As jo ​​mear UDF's brûke wolle, skriuw dan gewoan de koade yn de add-in module yn de VBA bewurker en bewarje it.

    Dat is it foar hjoed. Wy hawwe ferskate manieren behannele om oanpaste funksjes te debuggen en leard hoe't jo se kinne brûke yn jo wurkboek. Wy hoopje echt dat jo dizze rjochtlinen nuttich fine. As jo ​​​​fragen hawwe, skriuw dan yn 'e opmerkings by dit artikel.

    Michael Brown is in tawijd technology-entûsjast mei in passy foar it ferienfâldigjen fan komplekse prosessen mei software-ark. Mei mear as in desennium ûnderfining yn 'e tech-yndustry hat hy syn feardigens yn Microsoft Excel en Outlook, lykas Google Blêden en Docs, oanskerpe. Michael's blog is wijd oan it dielen fan syn kennis en ekspertize mei oaren, en biedt maklik te folgjen tips en tutorials foar it ferbetterjen fan produktiviteit en effisjinsje. Oft jo in betûfte profesjonele of in begjinner binne, Michael's blog biedt weardefolle ynsjoch en praktysk advys om it measte út dizze essensjele software-ark te heljen.