Talaan ng nilalaman
Tulad ng alam mo na kung paano gumawa ng mga UDF (at, umaasa ako, nasubukan mo na ring ilapat ang mga ito sa iyong Excel), humukay tayo nang mas malalim at tingnan kung ano ang maaaring gawin kung sakaling hindi gumagana ang iyong function na tinukoy ng gumagamit.
Upang malutas ang ilang isyu kapag gumagawa ng custom na function, malamang na kailangan mong magpatakbo ng debug. Pagkatapos ay makatitiyak kang gumagana nang tama ang function.
I-explore namin ang mga sumusunod na diskarte sa pag-debug:
Kapag gumawa ka ng custom na function, palaging may posibilidad na magkakamali ka. Ang mga custom na function ay kadalasang medyo kumplikado. At hindi sila palaging nagsisimulang magtrabaho nang tama kaagad. Ang formula ay maaaring magbalik ng maling resulta o ang #VALUE! pagkakamali. Hindi tulad ng mga karaniwang pag-andar ng Excel, hindi ka makakakita ng anumang iba pang mga mensahe.
Mayroon bang paraan upang dumaan sa isang pasadyang function nang hakbang-hakbang upang suriin kung paano gumagana ang bawat isa sa mga pahayag nito? Oo naman! Ginagamit ang pag-debug para dito.
Mag-aalok ako sa iyo ng ilang paraan upang i-debug ang iyong custom na function upang mapili mo ang isa na gagana para sa iyo.
Bilang halimbawa, ginagamit namin ang custom na function GetMaxBetween mula sa isa sa aming mga nakaraang artikulo na kinakalkula ang maximum na bilang sa tinukoy na hanay ng mga halaga:
Function GetMaxBetween(rngCells As Range, MinNum, MaxNum) Dim NumRange As Range Dim vMax Dim arrNums() Dim i Bilang Integer ReDim arrNums(rngCells.Count) Para sa Bawat NumRange Sa 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 Function ay ang function argumentsAng function arguments hanay ng mga cell kung saan nakasulat ang mga numero, pati na rin ang upper at lower limit ng mga value.
Ilagay ang MsgBox function sa mahahalagang lugar
Upang masubaybayan ang pagsasagawa ng mga kalkulasyon, maaari mong ipakita ang mga halaga ng pinakamahalagang variable sa screen sa mga tamang lugar. Magagawa ito gamit ang mga pop-up na dialog box.
MsgBox ay isang dialog box na magagamit mo upang magpakita ng ilang uri ng mensahe sa user.
Syntax ng MsgBox ay katulad ng iba pang mga function ng VBA:
MsgBox(prompt [, buttons] [, title] [, helpfile, context])prompt ay isang kinakailangang argumento. Naglalaman ito ng mensahe na nakikita mo sa dialog box. Maaari din itong gamitin upang ipakita ang mga halaga ng mga indibidwal na variable.
Ang lahat ng iba pang mga argumento ay opsyonal.
[ mga button ] - tinutukoy kung aling mga button at icon ang ipinapakita sa MsgBox . Halimbawa, kung gagamitin namin ang opsyong vbOkOnly , ang button na OK lang ang ipapakita. Kahit na napalampas mo ang argumentong ito, ginagamit ang button na ito bilang default.
[ title ] - dito maaari mong tukuyin ang pamagat ng kahon ng mensahe.
Lumipat tayo mula sa mga salita para sanayin at simulan ang pag-debug. Upang ipakita angmensahe, idagdag ang sumusunod na linya sa code ng GetMaxBetween function na tinukoy ng user bago ang Case Else operator:
MsgBox vMax,, "Count -" & iNarito ang makukuha natin sa resulta:
Function GetMaxBetween(rngCells As Range, MinNum, MaxNum) Dim NumRange As Range Dim vMax Dim arrNums() Dim i As Integer ReDim arrNums(rngCells.Count) Para sa Bawat NumRange Sa rngCells vMax = NumRange Piliin ang Case vMax Case MinNum + 0.01 Hanggang 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) End FunctionGamit ang vMax variable sa dialog box, makikita natin kung aling mga numero ang nakakatugon sa pamantayan para sa pagpili, kaya na maaari nating piliin ang pinakamalaki sa kanila. Gamit ang expression na "Count -" & Ako sa title bar, ipinapahiwatig namin kung gaano karaming mga numero ang napili na namin upang matukoy ang maximum na halaga. Tataas ang counter sa bawat bagong value.
Kapag mayroon na kaming UDF set, ilalapat namin ang formula sa ibaba sa hanay ng petsa:
= GetMaxBetween (A1:A6,10,50)
Pagkatapos ng Enter button ay pinindot, makakakita ka ng mensahe tulad ng sa screenshot sa ibaba:
Ito ang unang numero sa hanay na A1: A6 na nakakatugon sa pamantayan: higit sa 10 ngunit mas mababa kaysa sa 50.
Pagkatapos mong i-click ang OK, may lalabas na pangalawang mensahe na may numerong 14. Ang iba pang mga numero ay hindi tumutugma sa pinilipamantayan. Samakatuwid, lalabas ang function at ibinabalik ang pinakamalaki sa dalawang value, 17.
Maaaring gamitin ang MsgBox function sa pinakamahahalagang lugar sa iyong custom na function para makontrol kung paano ang mga value ng mga indibidwal na variable ay nagbabago. Ang mga kahon ng mensahe ay maaaring maging lubhang kapaki-pakinabang kapag mayroon kang malaking function at maraming computation. Sa kasong ito, magiging madali para sa iyo na matukoy kung saang bahagi ng code nangyayari ang error.
Tukuyin ang mga hintong punto at magsagawa ng hakbang-hakbang
Maaari kang magdagdag ng mga breakpoint sa code ng iyong function kung saan titigil ang pagpapatupad ng code. Kaya maaari mong sundin ang proseso ng pagkalkula nang sunud-sunod. Sa paggawa nito, makikita mo kung paano nagbabago ang mga value ng mga variable.
Upang magdagdag ng breakpoint, ilagay ang cursor sa linyang naglalaman ng statement kung saan pipiliin mong i-pause. Pagkatapos ay i-right-click at piliin ang Debug -> I-toggle ang Breakpoint o pindutin lang ang F9 . Maaari ka ring mag-click sa gustong lugar sa vertical gray na lugar sa kaliwa ng function code.
May lalabas na pulang bilog, gaya ng makikita mo sa screenshot sa ibaba. Ang linya ng code kung saan ititigil ang pagkalkula ay naka-highlight sa pula.
Ngayon, bubuksan ang window ng editor ng VBA kapag tumatakbo ang function. Ipoposisyon ang cursor sa punto kung saan ka huminto.
Kung i-hover mo ang iyong mouse cursor sa alinman sa mga variable sa function code, makikita mo ang kanilang kasalukuyangvalue:
Pindutin ang F5 para ipagpatuloy ang pagkalkula.
Tandaan. Pagkatapos ng breakpoint, maaari mong simulan ang pagsubaybay sa pag-usad ng mga kalkulasyon nang hakbang-hakbang. Kung pinindot mo ang pindutan ng F8, isang susunod na linya lamang ng VBA code ang isasagawa. Ang dilaw na linya na may arrow ay lilipat din sa huling na-execute na posisyon ng code.
Dahil naka-pause muli ang pagsasagawa ng function, maaari mong tingnan ang mga kasalukuyang value ng lahat ng variable ng function gamit ang mouse cursor.
Ang susunod na pagpindot sa F8 ay magdadala sa amin ng isang hakbang pasulong . Kaya maaari mong pindutin ang F8 hanggang sa katapusan ng pagkalkula. O pindutin ang F5 upang ipagpatuloy ang pagkalkula hanggang sa susunod na breakpoint.
Kung may naganap na error, ititigil ang cursor sa punto sa code kung saan nangyari ang error. At makakakita ka rin ng isang pop-up na mensahe ng error. Ginagawa nitong madali upang matukoy ang sanhi ng problema.
Ang mga breakpoint na iyong tinukoy ay ilalapat hanggang sa isara mo ang file. Kapag binuksan mo itong muli, kakailanganin mong itakda muli ang mga ito. Hindi ang pinaka-maginhawang paraan, hindi ba?
Gayunpaman, maaaring malutas ang problemang ito. Maglagay ng Stop statement sa function code sa mga kinakailangang punto, at maaari mong ihinto ang pagpapatupad ng program sa parehong paraan tulad ng kapag gumagamit ng mga breakpoint.
Kapag nakatagpo ang VBA ng statement na Stop , hihinto nito ang pagpapatupad ng program at maghihintay sa iyong aksyon. Suriin ang mga halaga ng mga variable, pagkatapospindutin ang F5 upang magpatuloy.
O pindutin ang F8 upang matupad ang function na hakbang-hakbang tulad ng inilarawan sa itaas.
Ang Stop na pahayag ay bahagi ng programa at samakatuwid ay hindi tinanggal, tulad ng kaso sa isang breakpoint. Kapag tapos ka nang mag-debug, alisin mo ito. O gawin itong komento sa pamamagitan ng unahan nito ng isang quote (').
Pag-debug gamit ang Debug.Print operator
Maaari mong ilagay ang Debug.Print sa ang function code sa tamang lugar. Ito ay kapaki-pakinabang para sa pagsuri sa mga halaga ng mga variable na paikot-ikot na nagbabago.
Maaari kang makakita ng halimbawa ng Debug.Print's performance sa screenshot sa ibaba.
Sa Immediate window makikita mo ang dalawang numero (17 at 14) mula sa napiling hanay, na tumutugma sa magtakda ng mga limitasyon at kung saan pipiliin ang maximum. Ang mga digit 1 at 2 ay nangangahulugan na ang function ay nakumpleto ang 2 cycle kung saan ang mga numero ay pinili. Nakikita namin ang mga halaga ng pinakamahalagang variable, tulad ng ginawa namin kanina sa MsgBox . Ngunit hindi nito napigilan ang function.
Tumawag ng function mula sa isang procedure
Maaari kang tumawag sa function na tinukoy ng user hindi mula sa isang cell sa worksheet, ngunit mula sa isang procedure. Sa kasong ito, ang lahat ng mga error ay ipapakita sa window ng Visual Basic Editor.
Narito kung paano mo matatawagan ang function na tinukoy ng user na GetMaxBerween mula sa isangprocedure:
Sub Test() Dim x x = GetMaxBetween(Range ( "A1:A6" ), 10, 50) MsgBox(x) End SubIposisyon ang cursor kahit saan sa code at pindutin ang F5 . Kung walang error sa function, makakakita ka ng pop-up window na may resulta ng pagkalkula.
Sa kaso ng error, makakakita ka ng kaukulang mensahe sa VBA editor. Ang pagkalkula ay ititigil at ang linya ng code kung saan naganap ang error ay iha-highlight sa dilaw. Madali mong matutukoy kung saan at bakit nangyari ang error.
Iyon lang. Ngayon ay nakagawa ka na ng sarili mong add-in, idinagdag ito sa Excel at magagamit mo ang UDF dito. Kung gusto mong gumamit ng higit pang mga UDF, isulat lang ang code sa add-in na module sa VBA editor at i-save ito.
Iyon lang para sa araw na ito. Sinaklaw namin ang iba't ibang paraan upang i-debug ang mga custom na function at natutunan kung paano gamitin ang mga ito sa iyong workbook. Talagang inaasahan namin na nakakatulong ang mga alituntuning ito. Kung mayroon kang anumang mga katanungan, sumulat sa mga komento sa artikulong ito.