Matrix per VBA generisch auslesen
Häufig gibt es (bei mir) die Anforderung, dass ich im Excel eine mehrspaltige Tabelle habe, aus der ich einen dynamischen Durchlauf durch die Einträge der Tabelle generieren möchte. Ich löse dies mit dem Einlesen der Tabelle in eine Matrix und dem anschließenden Durchlauf.
Hier ist ein Beispiel, mit dem eine mehrspaltige Tabelle auf Tabellenblatt „Tabelle1“,
die ab Spalte 3 und mit einer Überschrift in Zeile 1 beginnt, eingelesen und
hier die zweite Spalte pro Schleifendurchlauf in einer Messagebox ausgegeben wird:
Sub schleife()
arReporting = readMatrix("Tabelle1", 1, 3) 'Tabellenblatt, Zeile, Spalte)
For i = 2 To UBound(arReporting, 1)
MsgBox (arReporting(i, 2))
Next i
End Sub
Dies ist die Funktion, die in den VBA Code kopiert werden kann und dynamisch eine Tabelle einliest und in einer Matrix abspeichert.
Function readMatrix(Page As String, RowStart As Integer, ColumnStart As Integer)
Dim startRow, startColumn As Integer
Dim intZeile, intEndeZeile, intSpalte, intEndeSpalten As Long
Dim varValue, varÜberschrift As String
Dim Matrix() As String
varÜberschrift = "-"
Dim varID As String
varID = "-"
Dim intAnzahlSpalten As Long
intAnzahlSpalten = -1
Dim intAnzahlZeilen As Long
intAnzahlZeilen = -1
Worksheets(Page).Select
startRow = RowStart
startColumn = ColumnStart
'Ermittlung der Anzahl von Spalten - prüft die gefüllten Überschriften
Do While varÜberschrift <> ""
varÜberschrift = Cells(startRow, startColumn).Value
startColumn = startColumn + 1
intAnzahlSpalten = intAnzahlSpalten + 1
Loop
startRow = RowStart
startColumn = ColumnStart
'Ermittlung der Anzahl von Zeilen - prüft die gefüllten Zellen in Spalte 1
Do While varID <> ""
varID = Cells(startRow, startColumn).Value
startRow = startRow + 1
intAnzahlZeilen = intAnzahlZeilen + 1
Loop
'Mit der folgenden, auskommentierten Zeile kann die Größe der Matrix ausgegeben werden
'MsgBox (intAnzahlSpalten & " Spalten und " & intAnzahlZeilen & " Zeilen")
'Definition der leeren Matrix
ReDim Matrix(1 To intAnzahlZeilen, 1 To intAnzahlSpalten)
intEndeZeile = intAnzahlZeilen + RowStart - 1
intEndeSpalten = intAnzahlSpalten + startColumn - 1
'Schleife zum Füllen der Matrix
iZeile = 1
For intZeile = RowStart To (intEndeZeile) 'Zeile für Zeile
jSpalte = 1
For intSpalte = startColumn To intEndeSpalten 'Spalte für Spalte
varValue = Cells(intZeile, intSpalte).Value 'Lesen des Zellenwertes
Matrix(iZeile, jSpalte) = varValue 'Übertragen des Wertes in die Matrix
'MsgBox ("Zeile " & intZeile & " / Spalte " & intSpalte & " : " & varValue)
jSpalte = jSpalte + 1
Next intSpalte
iZeile = iZeile + 1
Next intZeile
'Übertragen an den Übergabewert
readMatrix = Matrix
End Function