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ó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
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
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.