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