[Excel, VBA] letzter Wert eines Zellbereiches (od Zeile, Spalte)
Gepostet am: May 24, 2011 8:42:18 AM
Ermitteln mittels Exel-Formel
Um den letzten Wert eines Zellbereiches der > 0 ist zu ermitteln, kann man die bekannte Frank-Kabel-Lösung verwenden.
> =VERWEIS(2;1/(ZELLBEREICH<>0);ZELLBEREICH)
bzw. für Werte ungleich ""
> =VERWEIS(2;1/(ZELLBEREICH<>"");ZELLBEREICH)
Das ganze hat jedoch folgende Einschränkung - man kann nicht festlegen, dass Zellbereich <> 0 und Zellbereich <> "" ausgewertet wird. (Jedenfalls habe ich noch keine Lösung dafür gefunden)
Ermitteln mittels VBA
letzter Wert eines Zellbereiches
Function letzterWert(myRange As Range) As Double Dim element As Range For Each element In myRange If element.Value <> 0 And element.Value <> "" Then Debug.Print element.AddressLocal & "-" & element.Value letzterWert = element.Value End If NextEnd Function
Bei einzelnen Spalten oder Zeilen ist die Vorgehensweise des Skripts logisch (von oben nach unten, von links nach recht). Aber wie sieht es bei Zellbereichen aus, die sowohl mehrer Zeilen als auch mehrere Spalten haben.
Das mag zwar praktisch sein, wirklich viel damit machen kann man aber noch nicht. Wie sieht es aus, wenn man statt horizontal vertikal auslesen möchte? Was ist wenn man den den 4.letzten Wert haben möchte usw.
Ausgangslage ist folgender Bereich:
Mit der erweiterten Formel kann man dann den Bereich auch folgendermaßen auslesen:
Die Formel dazu:
erweiterte Formel
Function letzterWert(myRange As range, Optional how As Integer = 1, Optional ignoreError As Boolean = True, Optional ignoreEmptyCells As Boolean = True, Optional ignorenull As Boolean = False, Optional Stelle As Integer = 1) As Variant
Dim element As range Dim i As Integer Dim j As Integer Dim counter As Integer counter = 0 Dim myArray() As Variant Dim bIgnore As Boolean Dim returnValue As Variant If how = 1 Then Debug.Print "Horizontal" For i = 1 To myRange.Rows.Count For j = 1 To myRange.Columns.Count bIgnore = False If IsEmpty(myRange.Cells(i, j).Value) And ignoreError = True Then bIgnore = True End If If IsError(myRange.Cells(i, j).Value) And ignoreEmptyCells = True Then bIgnore = True End If If IsNumeric(myRange.Cells(i, j).Value) Then If (myRange.Cells(i, j).Value = 0) And (ignorenull = True) Then bIgnore = True End If End If If bIgnore = False Then ReDim Preserve myArray(counter) myArray(counter) = myRange.Cells(i, j).Value returnValue = myRange.Cells(i, j).Value counter = counter + 1 End If Next Next ElseIf how = 2 Then Debug.Print "Vertikal" For i = 1 To myRange.Columns.Count For j = 1 To myRange.Rows.Count bIgnore = False If IsEmpty(myRange.Cells(j, i).Value) And ignoreError = True Then bIgnore = True End If If IsError(myRange.Cells(j, i).Value) And ignoreEmptyCells = True Then bIgnore = True End If If IsNumeric(myRange.Cells(j, i).Value) Then If (myRange.Cells(j, i).Value = 0) And (ignorenull = True) Then bIgnore = True End If End If If bIgnore = False Then ReDim Preserve myArray(counter) myArray(counter) = myRange.Cells(j, i).Value returnValue = myRange.Cells(j, i).Value counter = counter + 1 End If Next Next Else returnValue = CVErr(xlErrNA) End If If Stelle = 1 Then letzterWert = returnValue Else Dim number As Integer number = UBound(myArray) + 1 letzterWert = myArray(number - Stelle) End IfEnd Function
Damit kann man nun eine Menge anstellen. Hier ein paar Beispiele: