VBA

1.

Eredménylap szerkesztés automatizálása

A laboratóriumban mintegy 10 féle vizsgálati eredménylappal dolgoztunk. Ezek közül a leggyakrabban a szűkített (2. kép) illetve bővített talajvizsgálatok eredménylapjait használtuk. A szűkített vizsgálat 9 vizsgálati paramétert tartalmazott, illetve a bővített további öt tápanyag paraméterrel egészült ki. A feladatom az volt, hogy ezeket az eredménylapokat valamilyen automatikus megoldással feltöltsem a vizsgálati eredményekkel. Mindezt makrók és VBA kódok segítségével oldottam meg, melyek alkalmazását munkám során fokozatosan sajátítottam el. Az adatok feldolgozására, az eredményközlő vizsgálati jegyzőkönyvek dokumentálására és ezeknek archiválására mintegy 25 modult írtam. A következőkben csak a két legfontosabb, az eredménylapok kitöltésére vonatkozó szubrutint mutatom be (1-2. fejezet).

Az első ilyen szubrutin a Sub erlapoz_szuk(), mely a szűkített eredménylapok sokszorosítását végzi, abban az esetben, ha azt a vizsgálandó talajminták száma indokolttá teszi. A bővített eredménylapok esetében hasonló a megoldás és csak a lépésközök számában valamint a munkalap nevében tér el az alább bemutatandó példától. Az alábbi példa ezért csak a szűkített talajvizsgálatok eredményközlési megoldásait részletezi.

A program maga egy segédtáblázatot tartalmazó munkalapról indult (1. kép), ahova előzetesen az eredményeket is feltöltöttük. A képen látható eredmények kitalált adatok, céljuk pusztán a szemléltetés.

1. kép: Segédmunkalap, mintaadatokkal és nem valós, kitalált eredményekkel

1. kódrészlet: erlapoz_szuk()

Sub erlapoz_szuk()

'szűkített lapok szerkesztése
Dim rowInsert As Integer, pageItem As Integer,
rowNum As Integer, colNum As Integer,
stepVar As Integer, i As Integer, m As Integer

'nincs kitöltve a segédtáblázat
If Range("B10").Value < 2 Then
MsgBox ("Nincsenek mintaadatok!")
Exit Sub
End If

'a szövegdobozban szereplő oldalszámot manuálisan kell kitölteni!
If Range("B12").Value > 8 Then
doWork = MsgBox("Biztos, hogy folytassam? Elképzelhető, hogy több eredménylapra
lesz szükség, ellenőrizd a szövegdobozban az oldalszámot!", vbOKCancel)

If doWork = vbCancel Then
Exit Sub

End If


1. kódrészlet: erlapoz_szuk()

Sub erlapoz_szuk()

'szűkített lapok szerkesztése
Dim rowInsert As Integer,
pageItem As Integer,
rowNum As Integer,
colNum As Integer,
stepVar As Integer,
i As Integer, m As Integer

'nincs kitöltve a segédtáblázat
If Range("B10").Value < 2 Then
MsgBox ("Nincsenek mintaadatok!")
Exit Sub
End If

'a szövegdobozban szereplő oldalszámot manuálisan kell kitölteni!
If Range("B12").Value > 8 Then
doWork = MsgBox("Biztos, hogy folytassam?
Elképzelhető, hogy több eredménylapra
lesz szükség, ellenőrizd a szövegdobozban oldalszámot!", vbOKCancel)

If doWork = vbCancel Then
Exit Sub

End If


A változók deklarálása után az első feltétel azt vizsgálja, hogy a talajminták azonosítói (származási hely, blokkazonosító, helyrajzi szám stb.) megvannak-e adva, ugyanis a mintákat minden esetben azonosítani kellett. A második feltétel egy figyelmeztetést tartalmazó szövegdobozzal tér vissza, abban az esetben, ha a minták számából arra lehet következtetni, hogy dokumentálásuk érdekében több eredménylapra is szükség lesz. Erre a figyelmeztetésre azért van szükség, mert a szövegdobozban szereplő oldalszám információ manuálisan kerül felvitelre. (1. kódrészlet)

A szubrutin ugyanakkor nem csak az eredménylapok számáról gondoskodott, hanem az eredménylap fejlécébe beszúrandó sorok számát is figyelembe vette és kezelte [rowInsert]. Ezzel együtt azt is figyelembe kellett vennie, hogy az eredménylapok fejlécsorokkal megnövelt mérete, melyik sorban teszi lehetővé – hogy egymásra másolás ne történjen – az újabb eredménylap bemásolását [stepVar]. Az alábbi eljárás az előforduló eseteket vizsgálja és annak megfelelően végzi a paraméterezést. (2. kódrészlet)

2. kódrészlet: erlapoz_szuk()

'SOROKAT A FEJLÉCBE BESZÚR -> ("szűkített_tvg")

Application.ScreenUpdating = False;
colNum = Range("B14").Value

'hány oszlop van > hány sor legyen
'+ lépés változó meghatározása a beszúrt soroktól függően

Select Case colNum

Case 1 To 4
rowInsert = 0
stepVar = 5

Case 5
rowInsert = 1
stepVar = 4

Case 6
rowInsert = 2
stepVar = 3

Case 7
rowInsert = 3
stepVar = 2

Case 8
rowInsert = 4
stepVar = 1

End Select


2. kódrészlet: erlapoz_szuk()

'SOROKAT A FEJLÉCBE BESZÚR -> ("szűkített_tvg")

Application.ScreenUpdating = False;
colNum = Range("B14").Value

'hány oszlop van > hány sor legyen
'+ lépés változó meghatározása a beszúrt soroktól függően

Select Case colNum

Case 1 To 4
rowInsert = 0
stepVar = 5

Case 5
rowInsert = 1
stepVar = 4

Case 6
rowInsert = 2
stepVar = 3

Case 7
rowInsert = 3
stepVar = 2

Case 8
rowInsert = 4
stepVar = 1

End Select


A következő for ciklus (3. kódrészlet) tehát annyi sort szúr be az eredménylap fejlécébe, amennyit az előző select case utasítás az oszlopok száma alapján megállapított (oszlopok száma: lásd segédmunkalap 1. kép) . Az itt bemutatandó példa esetében a beszúrandó sorok száma 4 db, mivel, ahogy az az 1. képen is látható, valamennyi fejléc adat (8 db) rendelkezésre áll. A 2. képen a fejléc már a hozzáadott sorokkal együtt látható.

3. kódrészlet: erlapoz_szuk()

For i = 1 To rowInsert

Sheets("szűkített-tvg").Select;
Range("D7:D7").Select
Selection.EntireRow.Insert
Range("A5").Select
Sheets("segédmunkalap").Select

Next i

'5-nél kisebb fejlécsor esetén rendezetté teszi az eredménylapot
'(sort szúr be)


pageItem = Range("B11").Value

If pageItem = -1 Then

Select Case colNum

Case 1 To 4
Sheets("szűkített-tvg").Select
Range("D28:D28").Select
Selection.EntireRow.Insert

Case 5
Sheets("szűkített-tvg").Select
Range("D29:D29").Select
Selection.EntireRow.Insert

End Select

End If


3. kódrészlet: erlapoz_szuk()

For i = 1 To rowInsert

Sheets("szűkített-tvg").Select;
Range("D7:D7").Select
Selection.EntireRow.Insert
Range("A5").Select
Sheets("segédmunkalap").Select

Next i

'5-nél kisebb fejlécsor esetén rendezetté teszi az eredménylapot (sort szúr be)

pageItem = Range("B11").Value

If pageItem = -1 Then

Select Case colNum

Case 1 To 4
Sheets("szűkített-tvg").Select
Range("D28:D28").Select
Selection.EntireRow.Insert

Case 5
Sheets("szűkített-tvg").Select
Range("D29:D29").Select
Selection.EntireRow.Insert

End Select

End If


Amennyiben a fejlécsorok száma öt vagy annál kisebb – minimálisan kettő – , a program akkor is beszúr egy-egy sort a fejlécbe, hiszen bizonyos azonosítók különös tekintettel a helységnevekre, hosszabbak lehetnek, vagyis esetenként két sort is igényelhetnek. Az alábbi case utasítás pedig az eredménylap sokszorosítást végző for ciklust látja el a megfelelő értékkel [rowNum], egész konkrétan az oldalakhoz szükséges sorok számával – egy lap esetén ez case 1 >> 34 sor (ilyen magas sorokban mérve az eredménylap) . Esetünkben ugyanakkor két eredménylapról beszélünk, ezért case 2 >> 67 sor. Azért kettőről, mert 14 mintaadat/oszlop csak 2 db 8 oszlopos eredménylapra fér el. 67 pedig a két eredménylap terjedelme (sor). (4. kódrészlet)

4. kódrészlet: erlapoz_szuk()

'EREDMÉNYLAPOKAT BESZÚR-> ("szűkített_tvg")

Sheets("szűkített-tvg").Select

Select Case pageItem

Case 1
rowNum = 34

Case 2
rowNum = 67

Case 3
rowNum = 100

Case 4
rowNum = 130

Case 5
rowNum = 163

Case 6
rowNum = 196

Case 7
rowNum = 229

Case 8
rowNum = 262

'...9...10...

End Select


4. kódrészlet: erlapoz_szuk()

'EREDMÉNYLAPOKAT BESZÚR-> ("szűkített_tvg")

Sheets("szűkített-tvg").Select

Select Case pageItem

Case 1
rowNum = 34

Case 2
rowNum = 67

Case 3
rowNum = 100

Case 4
rowNum = 130

Case 5
rowNum = 163

Case 6
rowNum = 196

Case 7
rowNum = 229

Case 8
rowNum = 262

'...9...10...

End Select


2.

Eredménylap feltöltés automatizálása

Miután megtörtént az eredménylapok számának és fejléc sorainak a kialakítása, a következő lépés a vizsgálati eredmények felvitele. Erre a feladatra a Sub eredmenyek_felvisz () szubrutint készítettem, amelynek erőssége volt az eredmények pontos rögzítése, míg a gyengesége, hogy maximum három oldalt tudott kezelni. Egy több oldalt is kezelni tudó program elkészítése egyébként tervben volt, azonban elkészítésére már nem került sor.

A szubrutint tulajdonképpen két fő részre bonthatjuk. Az első rész a paramétereket definiáló case utasításokból áll, míg a második rész az eredménylapokat feltöltő for ciklusokat tartalmazza. A program szűkített illetve bővített eredménylapok kezelésére is fel lett készítve, ugyanakkor a kódértelmezést a továbbiakban is a szűkített eredménylap példáján keresztül szemléltetem.

Amit a case utasításoknak meg kell határoznia, hogy a segédmunkalapon mettől-meddig (sorok és oszlopok) történjen az adatok másolása. Az első case utasítás (Select Case header) esetünkben (8 fejléc sor) az első eredménylapra a 13. [iloop_row] illetve a másodikra a 46. [kloop_row] sorban és a D(3+1) oszloptól kezdődően hajtja végre a másolást. Lásd az alábbi, 5. kódrészletet.

5. kódrészlet: eredmenyek_felvisz()

Sub eredmenyek_felvisz();

Application.ScreenUpdating = False

Dim i As Integer, j As Integer, k As Integer,
l As Integer, m As Integer, n As Integer,
iloop_row As Integer, kloop_row As Integer, mloop_row As Integer,
loop_col1 As Integer, loop_col2 As Integer,
from As Integer, incr As Integer, ws As Worksheet

header = Range("B14")
'fejléc sorok száma, amelyik cellában vannak

'eredménylap típusok megkülönböztetése és használata
For Each ws In ActiveWorkbook.Worksheets

If ws.Name = "szűkített-tvg" Then

loop_col1 = 12
loop_col2 = 20

'ide tér vissza ha a másik feltétel érvényes
returnTo:

'hány sort ugorjon a 2.3.stb... eredménylapok hozzáadásakor

Select Case header

Case 1 To 4 And ws.Name = "szűkített-tvg"
iloop_row = 9
kloop_row = 42
mloop_row = 75

Case 1 To 4 And ws.Name = "bővített-tvg"
iloop_row = 10
kloop_row = 48
mloop_row = 86

Case 5 And ws.Name = "szűkített-tvg"
iloop_row = 10
kloop_row = 43
mloop_row = 76

Case 5 And ws.Name = "bővített-tvg"
iloop_row = 11
kloop_row = 49
mloop_row = 87

Case 6 And ws.Name = "szűkített-tvg"
iloop_row = 11
kloop_row = 44
mloop_row = 77

Case 6 And ws.Name = "bővített-tvg"
iloop_row = 12
kloop_row = 50
mloop_row = 88

Case 7 And ws.Name = "szűkített-tvg"
iloop_row = 12
kloop_row = 45
mloop_row = 78

Case 7 And ws.Name = "bővített-tvg"
iloop_row = 13
kloop_row = 51
mloop_row = 89

Case 8 And ws.Name = "szűkített-tvg"
iloop_row = 13
kloop_row = 46
mloop_row = 79

Case 8 And ws.Name = "bővített-tvg"
iloop_row = 14
kloop_row = 52
mloop_row = 90

End Select


5. kódrészlet: eredmenyek_felvisz()

Sub eredmenyek_felvisz();

Application.ScreenUpdating = False

Dim i As Integer, j As Integer,
k As Integer, l As Integer,
m As Integer, n As Integer,
iloop_row As Integer,
kloop_row As Integer,
mloop_row As Integer,
loop_col1 As Integer,
loop_col2 As Integer,
from As Integer, incr As Integer,
ws As Worksheet

header = Range("B14")
'fejléc sorok száma, amelyik cellában vannak

'eredménylap típusok megkülönböztetése és használata
For Each ws In ActiveWorkbook.Worksheets

If ws.Name = "szűkített-tvg" Then

loop_col1 = 12
loop_col2 = 20

'ide tér vissza ha a másik feltétel érvényes
returnTo:

'hány sort ugorjon a 2.3.stb... eredménylapok hozzáadásakor

Select Case header

Case 1 To 4 And ws.Name = "szűkített-tvg"
iloop_row = 9
kloop_row = 42
mloop_row = 75

Case 1 To 4 And ws.Name = "bővített-tvg"
iloop_row = 10
kloop_row = 48
mloop_row = 86

Case 5 And ws.Name = "szűkített-tvg"
iloop_row = 10
kloop_row = 43
mloop_row = 76

Case 5 And ws.Name = "bővített-tvg"
iloop_row = 11
kloop_row = 49
mloop_row = 87

Case 6 And ws.Name = "szűkített-tvg"
iloop_row = 11
kloop_row = 44
mloop_row = 77

Case 6 And ws.Name = "bővített-tvg"
iloop_row = 12
kloop_row = 50
mloop_row = 88

Case 7 And ws.Name = "szűkített-tvg"
iloop_row = 12
kloop_row = 45
mloop_row = 78

Case 7 And ws.Name = "bővített-tvg"
iloop_row = 13
kloop_row = 51
mloop_row = 89

Case 8 And ws.Name = "szűkített-tvg"
iloop_row = 13
kloop_row = 46
mloop_row = 79

Case 8 And ws.Name = "bővített-tvg"
iloop_row = 14
kloop_row = 52
mloop_row = 90

End Select


A második case utasítás (Select Case colnms), az eredménylapok oszlopszámától függően azt határozza meg, hogy a segédmunkalapon hányasával (6,8,10) másolja vágólapra az adatokat. Példánkban a 8 oszlopos szűkített eredménylap szerepel, ezért a segédmunkalapról nyolcasával másolja a sorokat és transzponálással illeszti be az eredménylap oszlopaiba.

6. kódrészlet: eredmenyek_felvisz()

colnms = Range("B13") 'az eredménylap oszlopainak száma

from = 11 'innen(sorból) kezdi a másolást

'más oszlopszámú eredménylapok/hányasával másoljon
Select Case colnms

Case 6
incr = 6

Case 8
incr = 8

Case 10
incr = 10

End Select


6. kódrészlet: eredmenyek_felvisz()

colnms = Range("B13") 'az eredménylap oszlopainak száma

from = 11 'innen(sorból) kezdi a másolást

'más oszlopszámú eredménylapok/hányasával másoljon
Select Case colnms

Case 6
incr = 6

Case 8
incr = 8

Case 10
incr = 10

End Select


Mivel kettő 8 oszlopos eredménylapról van szó, akkor az első eredménylapra a 11. sortól a 11 + 8[incr] – 1 sorig, a másodikra a 11 + 2*8[incr] – 1 és a harmadikra a 11 + 2*8[incr] – 1 sorig másolja az értékeket a vágólapra. (lásd segédmunkalap 1. kép) A loop_col1 és loop_col2 változók pedig az oszlopszámot határozzák meg, ami szűkített eredménylap esetén 9 vizsgálati paramétert foglal magában, a segédmunkalapon a 12-20 oszlopokat. Az alábbi (7. kódrészlet) után a 3. illetve 4. képeken láthatóak a felvitt eredmények. A fejléc kitöltése ugyanakkor, a segédmunkalapon is látható mintaadatokkal a gyakran előforduló egyedi esetek miatt (nincs meg minden adat, eltérő hosszúságú vagy egyedi azonosítók stb…) manuálisan történt.

7. kódrészlet: eredmenyek_felvisz()

For i = from To (from + incr) - 1

j = j + 1

'segédmunkalapról eredményeket másol
Sheets("segédmunkalap").Select
Range(Cells(i, loop_col1), Cells(i, loop_col2)).Select
Selection.Copy

'Sheets("szűkített-tvg").Select
ws.Select
'eredménylapra beilleszt
Cells(iloop_row, 3 + j).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=True

Next i

For k = from + incr To from + (2 * incr) - 1

l = l + 1

Sheets("segédmunkalap").Select
Range(Cells(k, loop_col1), Cells(k, loop_col2)).Select
Selection.Copy

ws.Select
Cells(kloop_row, 3 + l).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=True

Next k

For m = from + (2 * incr) To from + (3 * incr) - 1

n = n + 1

Sheets("segédmunkalap").Select
Range(Cells(m, loop_col1), Cells(m, loop_col2)).Select
Selection.Copy

ws.Select
Cells(mloop_row, 3 + n).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=True

Next m

Application.CutCopyMode = False

''másik feltétel/bővített lap esetén
ElseIf ws.Name = "bővített-tvg" Then

loop_col1 = 12
loop_col2 = 25

'visszatér a másolási tartomány bővített lapnak megfelelő értékeivel
GoTo returnTo

End If

Next ws

Application.ScreenUpdating = True

End Sub


7. kódrészlet: eredmenyek_felvisz()

For i = from To (from + incr) - 1

j = j + 1

'segédmunkalapról eredményeket másol
Sheets("segédmunkalap").Select
Range(Cells(i, loop_col1), Cells(i, loop_col2)).Select
Selection.Copy

'Sheets("szűkített-tvg").Select
ws.Select
'eredménylapra beilleszt
Cells(iloop_row, 3 + j).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=True

Next i

For k = from + incr To from + (2 * incr) - 1

l = l + 1

Sheets("segédmunkalap").Select
Range(Cells(k, loop_col1), Cells(k, loop_col2)).Select
Selection.Copy

ws.Select
Cells(kloop_row, 3 + l).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=True

Next k

For m = from + (2 * incr) To from + (3 * incr) - 1

n = n + 1

Sheets("segédmunkalap").Select
Range(Cells(m, loop_col1), Cells(m, loop_col2)).Select
Selection.Copy

ws.Select
Cells(mloop_row, 3 + n).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=True

Next m

Application.CutCopyMode = False

''másik feltétel/bővített lap esetén
ElseIf ws.Name = "bővített-tvg" Then

loop_col1 = 12
loop_col2 = 25

'visszatér a másolási tartomány bővített lapnak megfelelő értékeivel
GoTo returnTo

End If

Next ws

Application.ScreenUpdating = True

End Sub


3. kép: Kitöltött szűkített eredménylap első oldala, nem valós, kitalált eredményekkel

3.

Színmegjelenítés RGB függvénnyel

A színmegjelenítő VBA szubrutint a képelemző feladathoz készítettem el. Az alább látható kód a következőképpen működik. Az aktív cellát, ahogy a képen is látható (5. kép: colour oszlopban), mindig úgy választom ki, hogy a három R-G-B cellaérték után következzen. A program ezt az aktív cellától visszafelé kezeli. Aktív cella -1, -2 illetve -3 lépés, rendre blue – green -red. A változók definiálása után a program először azt a cellát keresi meg, ahol már nincsenek RGB értékek (1. for ciklus), így a színek megjelenítése (2. for ciklus, RGB(,,) függvény) is csak eddig a celláig történik.

8. kódrészlet: rgb_func()

Sub rgb_func()

Dim col_A, row_A, dist, limit, red, green, blue As Integer

col_A = ActiveCell.Column
row_A = ActiveCell.Row
dist = 1
limit = 120

red = col_A - (dist + 2)
green = col_A - (dist + 1)
blue = col_A - dist

'utolso ures cella detektalasa

For i = row_A To limit

If Cells(i, col_A - dist) = "" Then
bound = i - 1
Exit For
End If

Next i

'RGB ertekek az utolso ures cellaig

For i = row_A To bound

If Cells(i, col_A - dist).Value <> "" Then
Cells(i, col_A).Interior.Color = RGB(Cells(i, red).Value, Cells(i, green).Value, Cells(i, blue).Value)
Else: Cells(i, col_A - dist).Value = ""
End If

Next i

End Sub


8. kódrészlet: rgb_func()

Sub rgb_func()

Dim col_A, row_A, dist, limit, red, green, blue As Integer

col_A = ActiveCell.Column
row_A = ActiveCell.Row
dist = 1
limit = 120

red = col_A - (dist + 2)
green = col_A - (dist + 1)
blue = col_A - dist

'utolso ures cella detektalasa

For i = row_A To limit

If Cells(i, col_A - dist) = "" Then
bound = i - 1
Exit For
End If

Next i

'RGB ertekek az utolso ures cellaig

For i = row_A To bound

If Cells(i, col_A - dist).Value <> "" Then
Cells(i, col_A).Interior.Color = RGB(Cells(i, red).Value, Cells(i, green).Value, Cells(i, blue).Value)
Else: Cells(i, col_A - dist).Value = ""
End If

Next i

End Sub


5. kép: RGB értékek és a színek megjelenítése

3.1.

Színmegjelenítés két irányban, egy cellából

Az előző példaprogramban a színmegjelenítés három egymás melleti cella számértékből került átadásra a függvénynek. A három érték a már említett R, G, és B, melyek rendre a piros, a zöld és a kék számkódoknak felelnek meg. Az alábbi feladatban az RGB kód egy cellában van és a számokat valamilyen elválasztó karakterrel, esetünkben ‘/’-vel választottuk el egymástól. A programban az elválasztó karaktert egy változó veszi fel, tehát megadhatunk pontot, vesszőt és más karaktereket is, attól függően hogy milyen formátumban kaptuk az RGB-ket. A másik újítás az előző kódhoz képest, hogy a program képes vízszintesen és függőlegesen is színezni. A példaprogram alapszintű hibakezelést is tartalmaz, olyan esetekre ha a szubrutint nem a megfelelő cellában akarjuk futtatni vagy helytelen színkód formátumot adunk meg.

9. kódrészlet: run_rgb()

Sub run_rgb()

Dim col_A, row_A, dist, limit, bound As Integer
Dim rgb_code As Integer

On Error GoTo esc

col_A = ActiveCell.Column
row_A = ActiveCell.Row
elvalaszto = "/"
limit = 200

If Cells(row_A - 1, col_A).Value <> "" Then
Call horizontal(col_A, row_A, elvalaszto, limit)
Exit Sub
End If

If Cells(row_A, col_A - 1).Value <> "" Then
Call vertical(col_A, row_A, elvalaszto, limit)
Exit Sub
End If

esc:
If Err.Number = 9 Then
MsgBox "Leheteséges, hogy rossz formátumot adtál meg!" & vbCr & "Helyes formátum: R/G/B" & vbCr & "Próbáld újra!"
ElseIf Err.Number = 1004 Then
MsgBox "Lehetséges, hogy a lapszélen vagy! Az RGB értékek az aktív cella fölött vagy tőle balra helyezkedhetnek el! Próbáld újra!"
ElseIf Err.Number <> 0 Then
MsgBox "Hiba történt! Próbáld újra!"
End If

End Sub


9. kódrészlet: run_rgb()

Sub run_rgb()

Dim col_A, row_A, dist, limit, bound As Integer
Dim rgb_code As Integer

On Error GoTo esc

col_A = ActiveCell.Column
row_A = ActiveCell.Row
elvalaszto = "/"
limit = 200

If Cells(row_A - 1, col_A).Value <> "" Then
Call horizontal(col_A, row_A, elvalaszto, limit)
Exit Sub
End If

If Cells(row_A, col_A - 1).Value <> "" Then
Call vertical(col_A, row_A, elvalaszto, limit)
Exit Sub
End If

esc:
If Err.Number = 9 Then
MsgBox "Leheteséges, hogy rossz formátumot adtál meg!" & vbCr & "Helyes formátum: R/G/B" & vbCr & "Próbáld újra!"
ElseIf Err.Number = 1004 Then
MsgBox "Lehetséges, hogy a lapszélen vagy! Az RGB értékek az aktív cella fölött vagy tőle balra helyezkedhetnek el! Próbáld újra!"
ElseIf Err.Number <> 0 Then
MsgBox "Hiba történt! Próbáld újra!"
End If

End Sub


A fenti kódrészletben a függvények úgy kerültek meghívásra, hogy előtte ellenőriztettük a bementi cella (RGB-t tartalmazó cella) pozícióját, azaz hogy az aktív cella fölött vagy attól balra helyezkedik-e el. A program ennek alapján tudja megállapítani, hogy a vízszintesen vagy a függőlegesen vizsgáló függvényt kell-e meghívni. Alább ezek a függvények láthatók. 

10. kódrészlet: horizontal(),vertical()

Sub horizontal(col_A, row_A, elvalaszto, limit)

'RGB ertekek az utolso ures cellaig

For j = col_A To limit

rgb_code = Split(Cells(row_A - 1, j).Value, elvalaszto)

If Cells(row_A - 1, j).Value <> "" Then
Cells(row_A, j).Interior.Color = RGB(rgb_code(0), rgb_code(1), rgb_code(2)) ' R,G,B
Else:
Exit For
End If

Next j

End Sub


Sub vertical(col_A, row_A, elvalaszto, limit)

'RGB ertekek az utolso ures cellaig

For i = row_A To limit

rgb_code = Split(Cells(i, col_A - 1).Value, elvalaszto)

If Cells(i, col_A - 1).Value <> "" Then
Cells(i, col_A).Interior.Color = RGB(rgb_code(0), rgb_code(1), rgb_code(2)) ' R,G,B
Else:
Exit For
End If

Next i

End Sub


10. kódrészlet: horizontal(),vertical()

Sub horizontal(col_A, row_A, elvalaszto, limit)

'RGB ertekek az utolso ures cellaig

For j = col_A To limit

rgb_code = Split(Cells(row_A - 1, j).Value, elvalaszto)

If Cells(row_A - 1, j).Value <> "" Then
Cells(row_A, j).Interior.Color = RGB(rgb_code(0), rgb_code(1), rgb_code(2)) ' R,G,B
Else:
Exit For
End If

Next j

End Sub


Sub vertical(col_A, row_A, elvalaszto, limit)

'RGB ertekek az utolso ures cellaig

For i = row_A To limit

rgb_code = Split(Cells(i, col_A - 1).Value, elvalaszto)

If Cells(i, col_A - 1).Value <> "" Then
Cells(i, col_A).Interior.Color = RGB(rgb_code(0), rgb_code(1), rgb_code(2)) ' R,G,B
Else:
Exit For
End If

Next i

End Sub


A fenti függvények az aktív oszlop, sor illetve az elválasztó karaktert és a vizsgálatra kijelölt maximális cellaszámot kérik be argumentumként. A vízszintesen vizsgáló függvény [Sub horizontal()] a limit oszlopig vizsgál és egy elválasztó [Split()] függvény segítségével olvassa ki az aktív cella fölötti RGB értékeket, majd amennyiben az egy nem üres cella, akkor az aktív cellát beszínezi a fenti színkód alapján. A ciklus egészen a megadott limit-ig folytatódik. A függőlegesen vizsgáló függvény [Sub vertical()] esetében ugyanez történik, csak függőleges irányban, illetve az aktív cellától balra lévő cellában keresi az elválasztó karakterektől lefejtett RGB színkódot.

Az alábbi képen az excelben lefutattott példakód eredménye látható, három-három vízszintes illetve függőleges vizsgálatra. 

6. kép: Vízszintes és függőleges színmegjelenítés RGB kód alapján
6. kép: Vízszintes és függőleges színmegjelenítés RGB kód alapján