Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

feststellen letzter belegter Zeile
#1
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:
.xlsb   Letzte Zeile feststellen.xlsb (Größe: 1,41 MB / Downloads: 8)
Antworten Top
#2
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
[-] Folgende(r) 1 Nutzer sagt Danke an Gast 123 für diesen Beitrag:
  • Rabe
Antworten Top
#3
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
[-] Folgende(r) 1 Nutzer sagt Danke an Kuwer für diesen Beitrag:
  • Rabe
Antworten Top
#4
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
Zum übersetzen von Excel Formeln:

http://dolf.trieschnigg.nl/excel/index.p...gids=en+de
[-] Folgende(r) 1 Nutzer sagt Danke an snb für diesen Beitrag:
  • Rabe
Antworten Top
#5
Hallo,

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

Ok, jetzt teste ich mal die drei Lösungen aus.
Antworten Top
#6
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
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
[-] Folgende(r) 1 Nutzer sagt Danke an schauan für diesen Beitrag:
  • Rabe
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste