Clever-Excel-Forum

Normale Version: feststellen letzter belegter Zeile
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo,

ich habe eine Wetterdatendatei, bei der ich seit Jahren die CSV-Daten einer Wetterstation importiere, umwandle, sortiere und dann in die Auswertedatei kopiere.

Nun habe ich neulich die Makros etwas aufgeräumt und (logisch?) umgestellt. Leider habe ich dabei irgendwas gemacht und steige nicht mehr durch mein eigenes VBA-Konstrukt durch.

Ich bekomme die Daten in die Spalten A - S eingefügt.
Nun will ich die letzte belegte Zeile feststellen in Spalte B und in Spalte X, um dann einen Teil der Spalten (=B, F, O-S) in X bis AD kopieren zu können.
In Spalte B ist die letzte belegte die 19277 und in X die 18840, trotzdem wird für beide die 19277 ausgelesen. Was ist da falsch?

Ich benutze dazu folgendes Makro:
Private Sub Daten_übertragen_Test()
  ' Zusammenfassung_erstellen_und_übertragen in Zieldatei
  ' von Ralf erstellt am 13.12.09
  '
  With Workbooks("Letzte Zeile feststellen.xlsb").Sheets(strWetter)
     loLetzte = .Cells(Rows.Count, 2).End(xlUp).Row     ' letzte belegte Zelle in Spalte B
     loLetzte24 = .Cells(Rows.Count, 24).End(xlUp).Row   ' letzte belegte Zelle in Spalte X
  End With
 
  MsgBox ("Letzte in Wetterdaten" & "vor Einfügen (Spalte X): " & loLetzte24 & Chr(10) & _
      "                                 nach Einfügen (Spalte B): " & loLetzte & Chr(10) & Chr(10))
  loNeueTarget = loLetzteTarget + 1
End Sub

Und hier die Test-Datei: [attachment=11911]
Hallo Rabe,

du hast es hier mit einem Problem zu tun das mit dieser -speziellen Tabellenart- zu tun hat.  Technisch kann ich es nicht erklaeren, aber ich kenne den Effekt aus der Praxis.  Sucht man die letzte Zelle von unten, dann zeigt er dir das Tabellen Ende an!  Das hat mich damals auch sehr verwirrt!

2. Problem, würdest du zwei End(xlUp) hintereinander setzen und die Tabelle ist bis zum Ende voll - dann zeigt er dir loLetzte = 1 an !!

Abhilfe:  suche von oben ab Zeile 3 nach unten, dann klappt es - wenn es keine Leerzeilen dazwischen gibt!!
      loLetzte = .Cells(3, 2).End(xlDown).Row     ' letzte belegte Zelle in Spalte B
      loLetzte24 = .Cells(3, 24).End(xlDown).Row   ' letzte belegte Zelle in Spalte X

mfg  Gast 123
Hi Ralf,

das ist eine intelligente Tabelle. Somit ergibt die letzte Zeile von unten das Tabellenende, egal ob leer oder nicht.
Man könnte den Code direkt auf das ListObject umstellen oder Deinen Code so erweitern:
Private Sub Daten_übertragen_Test()
  ' Zusammenfassung_erstellen_und_übertragen in Zieldatei
 
  With Workbooks("Letzte Zeile feststellen.xlsb").Sheets(strWetter)
     loLetzte = .Cells(Rows.Count, 2).End(xlUp).Row     ' letzte belegte Zelle in Spalte B
     If IsEmpty(.Cells(loLetzte, 2)) Then
       loLetzte = .Cells(loLetzte, 2).End(xlUp).Row
     End If
     loLetzte24 = .Cells(Rows.Count, 24).End(xlUp).Row   ' letzte belegte Zelle in Spalte X
     If IsEmpty(.Cells(loLetzte24, 24)) Then
       loLetzte24 = .Cells(loLetzte24, 24).End(xlUp).Row
     End If
  End With

 
  MsgBox (" Letzte in Wetterdaten" & " vor Einfügen (Spalte X): " & loLetzte24 & Chr(10) & _
      "                                 nach Einfügen (Spalte B): " & loLetzte & Chr(10) & Chr(10))
  loNeueTarget = loLetzteTarget + 1
End Sub
Gruß Uwe
Code:
Private Sub M_snb()
   With Tabelle1.ListObjects(1).DataBodyRange
      y02 = .Cells(.Rows.Count, 2).End(xlUp).Row     ' letzte belegte Zelle in Spalte B
      y02 = IIf(y02 < .Cells(1).Row, .Rows.Count, y02)
      y024 = .Cells(.Rows.Count, 24).End(xlUp).Row   ' letzte belegte Zelle in Spalte X
      y024 = IIf(y024 < .Cells(1).Row, .Rows.Count, y024)
   End With


   MsgBox "Spalte X: " & y024 & Chr(10) & "Spalte B: " & y02 & Chr(10) & Chr(10), , "Letzte in Wetterdaten"
End Sub
Hallo,

aaaha, dann habe ich in diesem Aufräumschritt die Tabelle intellifiziert!

Ok, jetzt teste ich mal die drei Lösungen aus.
Hallöchen,

oder so:

Code:
Private Sub M_snb_asc()
y02 = LaLiRow(ActiveSheet.ListObjects("Tabelle1"), 2) ' letzte belegte Zelle in Spalte 2
y024 = LaLiRow(ActiveSheet.ListObjects("Tabelle1"), 24) ' letzte belegte Zelle in Spalte 24
MsgBox "Spalte X: " & y024 & Chr(10) & "Spalte B: " & y02 & Chr(10) & Chr(10), , "Letzte in Wetterdaten"
End Sub

Function LaLiRow(objLiObj As ListObject, iLiCol As Integer) As Integer
With objLiObj.ListColumns(iLiCol).Range
  LaLiRow = .Find(What:="*", After:=.Cells(1), _
  Lookat:=xlPart, LookIn:=xlFormulas, _
  SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False).Row
End With
End Function