Letzte Zeile mit sichtbarem Inhalt

Eigentlich ist es ganz ein­fach, per VBA die let­zte Zeile ein­er bes­timmten Spalte festzustellen. Den Stan­dard dafür kön­nen Sie hier im Blog nach­le­sen. Eigentlich, wie gesagt. Denn es gibt dur­chaus Fälle, wo diese Meth­o­d­en ver­sagen müssen. Näm­lich immer dann, wenn in min­destens ein­er Zelle unter­halb der let­zten sicht­baren Zelle eine Formel ste­ht, die als Ergeb­nis einen Leer­String ("") erzeugt. 

Um keine Unklarheit­en aufkom­men zu lassen: Es sind keine Zellen aus­ge­blendet oder der Inhalt durch For­matierung unsicht­bar gemacht wor­den. Machen Sie gerne fol­gen­den Ver­such: Füllen Sie A1:A30 mit (beispiel­sweise) dieser Formel, welche in jedem Fall einen Leer­String als Ergeb­nis zurück gibt: =WENN(ZEILE()>0; ""; "x"). Es ist logisch, dass dort kein x erscheinen wird, denn eine Zeilen­num­mer ist immer größer als 0. Und damit es einen Sinn ergibt, über­schreiben Sie eine oder mehrere Zellen in A1:A25 mit einem Text oder ein­er Zahl. Es bleiben also min­destens die unter­sten 5 Zellen mit der Formel.

Ver­suchen Sie jet­zt ein­mal mit Stan­dard-Mit­teln wie beispiel­sweise Strg oder per VBA die let­zte Zeile mit sicht­barem Inhalt her­auszufind­en. Es wir immer 30 her­aus kom­men. Bei Excelformeln.de gibt es eine Formel-Lösung, die auch funk­tion­iert. 

Es gibt von uns auch eine Lösung für VBA. Eigentlich sog­ar zwei, denn die eine ist „nur” eine Proze­dur, die zweite eine Funk­tion. Bei­de liefern das gewün­schte Ergeb­nis. Die Proze­dur soll­ten Sie in VBA-Edi­tor  in dem Blatt ein­fü­gen, wo die Berech­nung stat­tfind­en soll. Die Funk­tion gehört sin­nvoller­weise in ein all­ge­meines Mod­ul, damit sie von Proze­duren oder auch direkt inner­halb ein­er beliebi­gen Zelle der Mappe aufgerufen wer­den kann. Inner­halb ein­er Proze­dur kön­nte der Aufruf dann so ausse­hen:

LetzteSichtbare = Modul1.LastFilledCell("C")

oder falls Sie den numerischen Wert der Spalte ver­wen­den:

LetzteSichtbare = Modul1.LastFilledCell(3)

Ein Aufruf inner­halb der Arbeitsmappe erwartet nur den Funk­tion­sna­men und als Argu­ment eine gültige Spal­tenbeze­ich­nung. Hier nun (auch zum kopieren) den Code für die Proze­dur und die Funk­tion:

Sub LetzteZeileMitInhalt()
   Dim LetzteInhaltZeile As Long
   Dim Col As Range
   
   Application.ScreenUpdating = False
   With ActiveSheet
      Set Col = .Range("A:A")  'Anpassen
      Col.AutoFilter Field:=1, Criteria1:=">"
      LetzteInhaltZeile = Cells(1, Col.Column).End(xlDown).Row
      Col.AutoFilter
      MsgBox LetzteInhaltZeile
   End With
   Application.ScreenUpdating = True
End Sub
'---------------------------------------------------
Function LastFilledCell(Col As Variant) As Long
   Dim Rc As Long
   On Error GoTo ErrorHandler
   If WorksheetFunction.IsText(Col) Then Col = Columns(Col).Column
   
   Application.ScreenUpdating = False
   With ActiveSheet
      .Columns(Col).AutoFilter Field:=1, Criteria1:=">"
      Rc = Cells(1, 1).End(xlDown).Row
      Columns(Col).AutoFilter
      LastFilledCell = Rc
   End With

ErrorHandler:
   Application.ScreenUpdating = True
   If Err.Number > 0 Then
      If Err.Number = 13 Then
         MsgBox "Bitte eine gültige Spaltenbezeichnung" & vbCrLf _
          & "(Zeichen oder Zahl) statt  " & Col & "  eingeben."
      Else
         MsgBox "Fehler Nr.: " & Err.Number & vbCrLf _
          & Err.Description
         LastFilledCell = 0
      End If
   End If
End Function

Sie kön­nen diesen Code in dieser *.zip-Datei herunter laden und in Ihr VBA-Pro­jekt ein­binden, Änderun­gen sind selb­stre­dend erlaubt.

Ergänzung: Falls Sie mehrere Spal­ten auswerten wollen, dann bietet sich dieser Code an; allerd­ings ohne Fehler­prü­fung (kann natür­lich „nachgerüstet” wer­den):

Sub LetzteBeschreibeneZeile2()
   Dim LetzteInhaltZeile As Long
   With ActiveSheet.Range("C:AB") 'Anpassen
      LetzteInhaltZeile = .Find(What:="*", _
         After:=.Cells(1), _
         LookIn:=xlValues, _
         LookAt:=xlWhole, _
         SearchOrder:=xlByRows, _
         SearchDirection:=xlPrevious, _
         MatchCase:=False).Row
   End With
   MsgBox LetzteInhaltZeile
End Sub

Diese Zeilen ste­hen Ihnen hier nur per copy/paste zur Ver­fü­gung, sie sind nicht in der zip-Datei. Aber das sollte mach­bar sein …  😉 

[NachOben­Let­zte Verweis=„T&T: Let­zte sicht­bare Zelle”]
Dieser Beitrag wurde unter Mit VBA/Makro, Tabelle und Zelle abgelegt und mit , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.