Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Datum kleiner als - Zeile löschen

Forumthread: Datum kleiner als - Zeile löschen

Datum kleiner als - Zeile löschen
23.08.2007 17:28:22
Larissa

Hallo,
ich möchte mit einem Makro alle Zeilen löschen, bei denen das Datum in dem markierten Bereich einer Spalte kleiner ist, als das vorher selektierte Datum (lastdate)
Ich kann das nicht so einfach erklären, deshalb habe ich mal die Mappe beigefügt mit einem Makro, mit dem es nicht funktioniert. Vielleicht weiß jemand, was da falsch läuft.
https://www.herber.de/bbs/user/45330.xls
Vielen Dank,
LArissa

Anzeige

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Datum kleiner als - Zeile löschen
23.08.2007 18:45:06
Daniel
hi
du arbeitest zuviel mit SELECT !!!!!
wenn du der Variable LastDate den Wert zuweist, hast du voher schon in deinem Makro das Datum in der Zeile selektiert, in der BALANCE steht, daher ist das LastDate immer der 18.06.07.
Wenn jetzt LastDate ein vom Anwender ausgewähltes Datum sein soll, muß die Zeile
lastdate = Selection
ganz am Anfang stehen (dh. direkt nach den Variablendeklarationen mit DIM, und auf jeden Fall, bevor du selber im Makro ein .Select verwendest.
Gruß, Daniel

Anzeige
AW: Datum kleiner als - Zeile löschen
23.08.2007 19:08:49
Larissa
Hallo Daniel,
Ich bin noch sehr unerfahren und muss noch lernen, wie man auf das "böse" SELECT verzichten kann ;-)
In etwa habe ich verstanden, was Du meinst und habe das Makro etwas abgeändert, so dass das erste Datum der Selection mit selektiert ist. Aber warum werden auch Daten gelöscht, die größer (also später) als der 18.06.07 sind? Wie z.B. der 14.07.07 ? Oder kann man das "kleiner als" Zeichen nicht für Datum nehmen?
https://www.herber.de/bbs/user/45336.xls
Vielen dank nochmal für Hilfe,
Lieben Gruß,
Larissa

Anzeige
AW: Datum kleiner als - Zeile löschen
23.08.2007 19:53:04
Daniel
Hi
das mit dem Grösser/Kleiner hat ja Harry schon geklärt.
als Datum kommt der 1.1.2007 natürlich NACH dem 2.1.2006, bei einem Stringvergleich (so,wie LastDate ursprünglich defniert hattest) kommt der 1.1.2007 VOR dem 2.1.2006 weil bei Strings zunächsteinmal das 1. Zeichen ausschlaggebend ist.
(Deswegen ist es bei uns in der Firma Vorgabe, das Datum immer so anzugeben: 2007-12-24, dann ist die Sortierung auch als String immer richtig (merkt man ganz Schnell, wenn man das Datum als Teil des Dateinamens verwendet.)
ich würde das ganze so umschreiben, denn die erste FOR-Schleife kannst du durch die FIND-Funktion ersetzten, man muß nur die Parameter richtig einstellen, so daß von unten nach oben gesucht wird:

Sub datum()
Dim lastdate As Date
Dim sel As Range
Columns(1).Find(what:="Balance", after:=Cells(Rows.Count, 1), searchdirection:=xlPrevious). _
Offset(0, 1).Select
lastdate = Selection
neu:
For Each sel In Range(ActiveCell, Cells(Rows.Count, 1).End(xlUp).Offset(0, 1))
If sel.Value  "" Then
sel.EntireRow.Delete
GoTo neu
Else
End If
Next
End Sub


je nach dem, ob jetzt LastDate das Datum bei "Balance" oder ein vom Anwender ausgewähltes Datum sein soll, muß jetzt die Zeile "lastDate = selection" NACH oder VOR der Zeile Columns(1).FIND... stehen.
Gruß, Daniel

Anzeige
AW: Datum kleiner als - Zeile löschen
23.08.2007 18:57:00
Harry
Hallo Larissa,
meinst Du vielleicht so?
Option Explicit

Sub datum()
Dim I As Long
For I = Cells(Rows.Count, 1).End(xlUp).Row To 1 Step -1
If Cells(I, 1).Value = "Balance" Then
Cells(I, 1).Select
Exit For
End If
Next I
ActiveCell.Offset(0, 1).Select
Dim lastdate As Date 'Wichtig: Datumskonstanten werden nach anderen Wertekriterien  _
sortiert als Zeichenfolgenkonstanten!
lastdate = Selection.Value
Range(ActiveCell.Offset(1, 0), Cells(Rows.Count, 1).End(xlUp).Offset(0, 1)).Select
Dim sel As Range
neu:
For Each sel In Selection
If sel.Value  "" Then
sel.EntireRow.Delete
GoTo neu
Else
End If
Next
End Sub


Gruß
Harry

Anzeige
AW: Datum kleiner als - Zeile löschen
23.08.2007 19:18:29
Larissa
Hallo Harry,
Richtig! So funktioniert es. "As Date" ist die Zauberformel ;-)
Wie stelle ich denn "Option Explicit" ein? Das ist doch dafür, dass die Variable genau definiert ist, oder?
Danke für die Hilfe.
Lieben Gruß, Larissa

AW: Datum kleiner als - Zeile löschen
23.08.2007 19:59:25
Harry
Hi Larissa,
ganz einfach:
"Option Explicit" im betreffenden Modul in die erste Zeile schreiben (ohne Anführungszeichen!).
Diese Anweisung zwingt die Programmierer, alle Variablen in diesem Modul zu deklarieren - ist 'ne
Grundlage für "sauberes" Programmieren.
Freut mich, wenn ich Dir helfen konnte :)
Liebe Grüsse
Harry

Anzeige
AW: Datum kleiner als - Zeile löschen
23.08.2007 20:03:00
Daniel
... und erleichtert einem auch selbst die Arbeit, weil man Befehle und Variablennamen nicht mehr vollständig eintippen muß, sondern nur die ersten Buchstaben und dann drückt man STRG+, dann bekommt man eine Auswahlliste mit den Möglichen Variablen oder Befehlen.
Gruß, Daniel

Anzeige
AW: @Daniel
23.08.2007 20:22:00
Harry
Hi Daniel,
das hab' ich noch gar nicht gewußt - Danke für den Tipp!
Bei mir funkt es zur Zeit leider nicht (vielleicht, da ich noch auf WinXP/Excel2002 arbeite?)
Gruß
Harry
P.S.: Man lernt immer mal wieder was Neues dazu...

AW: @Daniel
23.08.2007 20:54:00
Daniel
Hi
in der Version müsste das schon lange drin sein.
viellicht muß man den Extras Opitonen noch nen Schalter setzen, ich habe aber noch nicht rausgefunden, welchen.
Gruß, Daniel

Anzeige
AW: @Daniel
24.08.2007 10:52:00
Harry
Hi Daniel,
...werd also mal wieder recherchieren ;)
Grüsse
Harry

AW: Ein anderer Vorschlag - ganz ohne select
23.08.2007 20:08:00
Harry
Hi Larissa,
ein Beispiel:
'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
'In ein Standardmodul:
'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Option Explicit
Public lngZ As Long

Public Sub datum()
Dim lngI As Long ', lngN As Long
lngI = Cells(Rows.Count, 1).End(xlUp).Row
marke1:
If lastdate(lngI) = "01.01.2007" Then '(If no "Balance" exists...)
Exit Sub
End If
MsgBox "gesuchtes Datum: " & lastdate(lngI), vbInformation, _
"Addresse für Zellbereich: " & lastrange(lngI)
Dim sel As Range
neu:
For Each sel In Range(lastrange(lngI))
If sel.Value  "" Then
sel.EntireRow.Delete
GoTo neu
End If
Next
lngI = lngZ - 1
GoTo marke1
End Sub



Public Function lastdate(lngZeile As Long) As Date
Dim lngN As Long
For lngN = lngZeile To 1 Step -1
If Cells(lngN, 1).Value = "Balance" Then
lastdate = Cells(lngN, 2).Value
Exit Function
End If
Next lngN
lastdate = "01.01.2007" '(If no "Balance" exists...)
End Function



Public Function lastrange(lngZeile As Long) As Variant
Dim lngN As Long
For lngN = lngZeile To 1 Step -1
If Cells(lngN, 1).Value = "Balance" Then
lastrange = Range(Cells(lngN + 1, 2), Cells(lngZeile, 2)).Address
lngZ = lngN
Exit Function
End If
Next lngN
lastrange = Range(Cells(1, 2), Cells(lngZeile, 2)).Address '(If no "Balance" exists...)
End Function


Liebe Grüsse
Harry

Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige

Infobox / Tutorial

Zeilen basierend auf Datum in Excel löschen


Schritt-für-Schritt-Anleitung

  1. Makro erstellen: Öffne Excel und drücke ALT + F11, um den VBA-Editor zu starten. Wähle „Einfügen“ und dann „Modul“, um ein neues Modul zu erstellen.

  2. Code eingeben: Füge den folgenden Code in das Modul ein, um alle Zeilen zu löschen, bei denen das Datum kleiner ist als das ausgewählte Datum:

    Sub ZeilenLoeschen()
       Dim lastdate As Date
       Dim sel As Range
       lastdate = Application.InputBox("Bitte Datum eingeben:", Type:=1) ' Benutzer gibt Datum ein
    
       For Each sel In Range("A1:A" & Cells(Rows.Count, 1).End(xlUp).Row) ' Annahme: Daten in Spalte A
           If sel.Value < lastdate Then
               sel.EntireRow.Delete
           End If
       Next sel
    End Sub
  3. Makro ausführen: Schließe den VBA-Editor und gehe zurück zu Excel. Drücke ALT + F8, wähle das Makro „ZeilenLoeschen“ aus und klicke auf „Ausführen“.

  4. Datum eingeben: Gib das Datum ein, bevor das Programm die Zeilen löscht.


Häufige Fehler und Lösungen

  • Problem: Das Makro löscht auch Zeilen mit späteren Daten.

    • Lösung: Achte darauf, dass die Datumswerte in der richtigen Formatierung vorliegen. Excel vergleicht Datumswerte unterschiedlich, wenn sie als Text formatiert sind. Stelle sicher, dass die Zellen als Datum formatiert sind.
  • Problem: Fehler beim Ausführen des Makros.

    • Lösung: Überprüfe, ob „Option Explicit“ am Anfang des Moduls steht. Dies stellt sicher, dass alle Variablen korrekt deklariert sind.

Alternative Methoden

  • Filter verwenden: Anstatt ein Makro zu nutzen, kannst Du auch den Autofilter in Excel verwenden, um Zeilen mit bestimmten Datumswerten auszublenden. Wähle die Spalte mit den Daten aus, gehe zu „Daten“ > „Filter“ und wähle „Datumsfilter“ aus.

  • Bedingte Formatierung: Du kannst auch die bedingte Formatierung nutzen, um Zeilen hervorzuheben, die gelöscht werden sollen, und sie dann manuell zu entfernen.


Praktische Beispiele

Wenn Du beispielsweise eine Liste von Transaktionen hast und alle Transaktionen vor dem 01.01.2022 löschen möchtest, kannst Du das oben genannte Makro verwenden und das Datum entsprechend anpassen, das Du eingibst.

lastdate = #01/01/2022# 'Alternativ in Code festlegen

Tipps für Profis

  • Vermeide das SELECT-Statement: In VBA ist es besser, auf das SELECT-Statement zu verzichten, um die Ausführung schneller und effizienter zu gestalten. Arbeite direkt mit den Zellen, wie im oben stehenden Beispiel gezeigt.

  • Fehlerbehandlung einbauen: Füge Fehlerbehandlungsroutinen in Dein Makro ein, um sicherzustellen, dass das Programm nicht abstürzt, wenn unerwartete Daten auftreten.

On Error Resume Next
' Dein Code hier
On Error GoTo 0

FAQ: Häufige Fragen

1. Wie kann ich sicherstellen, dass das Datum korrekt eingegeben wird?
Verwende die Application.InputBox-Funktion mit dem Type:=1, um sicherzustellen, dass nur numerische Eingaben akzeptiert werden.

2. Kann ich das Makro so anpassen, dass es nur eine bestimmte Anzahl von Zeilen bearbeitet?
Ja, Du kannst die Range im For Each-Loop anpassen, um nur einen bestimmten Bereich zu durchlaufen, z.B. Range("A1:A10").

3. Was bedeutet „Option Explicit“?
„Option Explicit“ zwingt Dich, alle Variablen in Deinem Modul zu deklarieren. Dies hilft, Fehler zu vermeiden und den Code lesbarer zu machen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige