A VBA kód ellenőrzése, hibakeresés kapcsán még van egy nagyon hasznos tulajdonság, amit ki tudunk használni. Ez pedig a Debug.Print parancs.
Ezzel a paranccsal a Immediate Window-ba tudunk közvetlenül információt kiíratni, ami a kódunk írása közben nagyon hasznos lehet. Ilyen információkat lehetne akár a Message Box-ba is küldeni, de az minden alkalommal megakasztaná a kódot és tovább kéne engedni az OK megnyomásával. Így viszont lefut a kód, és mi megkapjuk a kért információt.
VBA DEBUG PRINT – egyszerű példa
Nézzünk először erre egy egyszerű példát!
A leírásban bemutatott fájlt itt tudod letölteni: VBA Debug Print
Az alábbi kód lefuttatása annyit tesz, hogy az i értékét lépteti 2 és 10 között kettesével, és a n az i köbe lesz minden esetben. Ha lefuttatjuk a kódot, akkor a következőt látjuk az Immediate Window-ban:
Azt meg kell jegyeznünk, hogy a Debug.Print minden esetben az Immediate Window-ba küldi az információt, attól függetlenül, hogy az látható-e vagy nem. Ezért ilyen esetben mindig hozzuk elő ezt az ablakot (Ctrl+G, vagy a VBA Editor => View menüpontja alatt).
De mikor is lehet ez igazán hasznos nekünk? Amikor írjuk a kódunkat és vannak olyan részei, amikor nem vagyunk teljesen biztosak abban, hogy valóban úgy fut-e le, ahogy szeretnénk, vagy pedig valahol hibára fut, akkor, ha látjuk folyamatában a változóink értékét, az nagyon nagy segítséget nyújt.
VBA DEBUG PRINT – gyakorlati példa
A következő példában az a helyzet áll fenn, hogy van egy táblázatunk, ahol Beszállítónként van egy teljes nettó összegünk, és a különböző árubeérkezésekhez egy eloszlási érték, ami alapján a macro felosztja a teljes nettó összeget.
Ha lefuttatjuk a macro-t, akkor látjuk, hogy valami hibás, mert kihagy bizonyos sorokat.
A macro, ami fut mögötte így néz ki:
VBA DEBUG PRINT – a macro logikája
A macro logikája a következő:
Elindul a 9. soron, és amennyiben az eloszlás (4. oszlop) értéke 1, akkor egyszerűen beírja a teljes nettó összeget az 5. oszlopba. Amennyiben nem, akkor egy új változóval (n) elindul, és végig lépked a sorokon, és megszorozza a teljes nettó összeget az eloszlás értékével. Mivel Loop Until-al működik, ezért addig lépked, amíg egy olyan sort nem talál, ahol a nettó összeg már újra ki van töltve a 3. oszlopban, azaz nem üres a cella értéke. Ekkor átadja az n a j-nek az értékét, hogy innen folyatathassa tovább az első ellenőrzéssel a macro a futását, és kezdi elölről, az eloszlás értékének ellenőrzésével.
A macro szépen végigfut, de valamiért, mégis kimaradnak sorok.
Tegyünk be egy Debug.Print j, n parancsot, és nézzük meg hol van a hiba a logikánkban.
Ezt a parancsot az utolsó j = j+1 sor után teszem be, hogy lássuk minden továbblépés előtt, hogy hol lehet a gond.
Futassuk le macro-t és nézzük meg, hogy milyen eredményt kapunk.
VBA DEBUG PRINT – Ellenőrzés Immediate Window-ban
Az Immediate Windowban látjuk, egymás mellett a j és az n értékeit. Az j=9-et nem látjuk, mert már továbblépteti az értéket, de ez nem is baj, mert az első soroknál nem is volt hiba. Ami viszont szembetűnik, hogy a 10 után a 17 következik, és kihagyja a 16-os sort. Pedig az n jól állt meg, és a 15-ös sort még kitöltötte az eloszlás*nettó értékkel, és a 16-os sornál állt meg. Ezt is látjuk az Immediate Windowban, hogy az n 16-os értéke mellett veszi fel a j a 16-ot.
És itt láthatjuk is rögtön, mi a hiba. Hiszen miután az n átadja a j-nek az értékét, mi még léptetünk is a j-n egyet, hiszen a külső Loop-ban tovább kell gördítenünk a macro futását.
VBA DEBUG PRINT – a helyes kód
Tehát a megoldás az lesz, hogy mikor a j átveszi az n értékét, akkor abból 1-et le kell vonnunk, hogy ne hagyjon a j ki egy sort.
Így tehát a helyes kód a következő:
És ha most lefuttatjuk a macrot, akkor a következő eredményt kapjuk:
Látszik, hogy a táblázat is helyesen lett kitöltve, és az Immediate Window-ban is látható a változás, hogy a j valóban szépen lépked végig minden soron, amire szükségünk van.
Remélem hasznosnak találod ezt a VBA parancsot és segítségedre lesz a macro-k írása során. Kérlek oszd meg másokkal is!