2.5k Aufrufe
Gefragt in Tabellenkalkulation von kurtl Mitglied (239 Punkte)
Hallo liebe Experten,
ich habe folgendes Problem mit der exel Autofilterfunktion:
Speziell geht es um ein Tagebuch. Ich möchte gern, dass per Makro am Ende eines jeden Tages der oberste Datensatz gelöscht wird.
Beispiel:
01.09.12 09:40 blablablablabla
01.09.12 10:20 blablablablabla
01.09.12 11:33 blablablablabla
02.09.12 06:15 blablablablabla
02.09.12 07:20 blablablablabla
u.s.w.
Jetzt sollen also alle alle Datensätze 01.09.12 heute Abend verschwinden u. morgen die Datensätze 02.09.12 u.s.w.
Also, Makro wie folgt aufgezeichnet:
Autofilter angklickt, ersten Datensatz (01.09.12) ausgewählt - alles schick.
So sieht das dann aus:
Sub Autofilter()
Selection.AutoFilter Field:=1, Criteria1:="01.09.2012"
Range("A2").Select
End Sub
Wenn ich dann das ganze über das aufgezeichnete Makro laufen lasse, wird zwar auch gefiltert, aber der gefilterte Datensatz wird nicht angezeigt.
Und noch ein Problem sehe ich. Im Makro wird speziell der 01.09.12 angezeigt.
Spätestens am 02.09.12 kommt da mit Sicherheit eine Fehlermeldung.
Ich möchte einfach immer den Datensatz löschen, der als erstes in der Liste steht, aber dazu müsste er eben nach dem filtern auch sichtbar sein.
Ich hoffe, es kann mir jemand helfen.
Vielen Dank für Eure Bemühungen im voraus!
Gruß Kurt

11 Antworten

0 Punkte
Beantwortet von saarbauer Profi (15.6k Punkte)
Hallo,

wenn ich es richtig verstehe willst du immer die 2.Zeile löschen.

Gruß

Helmut
0 Punkte
Beantwortet von kurtl Mitglied (239 Punkte)
Hallo Helmut,
ich weiß jetzt nicht genau was Du meinst mit immer die 2. Zeile löschen?
Wenn ich den Autofilter öffne, erscheint doch folgendes Menü:

(Alle)
(Top 10...)
Benutzerdefiniert
01.09.12
02.09.12
03.09.12
04.09.12

So sieht das bei mir im speziellen Fall aus.
Wenn ich jetzt 01.09.12 anklicke, werden alle Datensätze mit 01.09.12 herausgefiltert. Das sind jetzt bei mir z.B. 20 Datensätze und die sollen dann im weiteren Verlauf des Makros gelöscht werden.
Morgen wäre dann der 02.09.12 das oberste Kriterium, sollte dann entsprechend vom Makro herausgefiltert werden (das sind dann nur z.B. 5 Datensätze) u.s.w.
Das Problem ist eben, das nach dem Ablauf des in meiner Frage aufgezeigten Makros die Datensätze nicht angezeigt werden. Der Filterpfeil ist blau - also wurde gefiltert - aber die Datensätze bleiben verborgen.
Gruß Kurt
0 Punkte
Beantwortet von saarbauer Profi (15.6k Punkte)
Hallo,

mal ein Lösungsvorschlag

Sub Zellen_löschen()
Dim wert As Date
Selection.AutoFilter
wert = InputBox("Hinweis", , Range("A2").Value)
Range("A1").Select

Selection.AutoFilter Field:=1, Criteria1:=wert
Rows("2:" & Range("A" & Rows.Count).End(xlUp).Row).Select
Selection.Delete Shift:=xlUp
Selection.AutoFilter Field:=1
End Sub


als Makro.

Gruß

Helmut
0 Punkte
Beantwortet von beverly Experte (3.5k Punkte)
Hi Kurt,

welche Excel-Version verwendest du?

Bis später,
Karin
0 Punkte
Beantwortet von beverly Experte (3.5k Punkte)
Hi Kurt,

ich habe es gerade mal getestet. So sollte es in allen Versionen funktionieren - du musst nur das 2. Filterkriterium ergänzen:

Range("A1").AutoFilter Field:=1, Criteria1:="=01.09.2012", Criteria2:="=01.09.2012"


Hinweis: in VBA kann zu 99% aller Fälle auf Select/Activate verzichtet werden.

Bis später,
Karin
0 Punkte
Beantwortet von kurtl Mitglied (239 Punkte)
Hallo Karin und Helmut,
vielen Dank für Euer Interesse!
Ich hatte schon gar nicht mehr mit weiteren Lösungsvorschlägen gerechnet, selbst weiter probiert und mein Problem gelöst.
Allerdings mit einigen Kompromiss - Umwegen. Ich werde mir im laufe des Tages Eure Vorschläge vornehmen - vielleicht sind sie ja besser - und melde mich auf jeden Fall noch einmal.
Bis später also.

Gruß Kurt
0 Punkte
Beantwortet von kurtl Mitglied (239 Punkte)
Hallo zusammen,
hier noch mal der kurt. Mit dem Lösungsansatz von Helmut komme ich nicht klar.
Der löscht mit irgendwie nur die Zeile 1 weg.
Hier nun der Auszug aus meinem Makro. Noch mal zur Erläuterung:
Aus einem Tagebuch Zellen B8:I65000 sollen immer am Ende des Tages die obersten Datensätze gleichen Datums gelöscht werden. In der Spalte B steht das Datum:
01.09.12 09:40 blablablablabla
01.09.12 10:20 blablablablabla
01.09.12 11:33 blablablablabla
02.09.12 06:15 blablablablabla
02.09.12 07:20 blablablablabla
u.s.w.
Folgendes Problem baute sich auf: Das Makro hat irgenwie die Spalte B (Datum) zwar gefiltert,aber nicht angezeigt.
Lösung: Ich hab am Anfang des Makro`s Spalte B in Text formatiert, dann funktionierte es!
Damit immer der Inhalt der Zelle B9 (ist ja jeden Tag ein anderer) und nicht speziell der 01.09.12 als Suchkriterium im Makro steht, hab ich B9 in eckige Klammern gesetzt:
Liste.Autofilter field:=1, Criteria1:=[B9]
Hier nun mein Makro

Sub autofilter()

'selektiert Spalte B
Range(Selection, Selection.End(xlDown)).Select
'Ändert Formatierung von Datum aufText
Selection.NumberFormat = "@"
'Autofilter wird aktiviert und nach Zelle B9 wird gefiltert
Dim Liste As Range
Set Liste = ActiveSheet.Range("B8:B64999")
Liste.autofilter
'Wenn Criterial1:= in eckiger Klammer […] kann eine Zelle benannt werden.
Liste.autofilter field:=1, Criteria1:=[B9]
'Erweitert selektierten Bereich nach rechts
Range(Selection, Selection.End(xlToRight)).Select
'Löscht selektierten Bereich
Selection.ClearContents
ActiveWindow.ScrollColumn = 1
Range("B9").Select
'Stellt Autofilter wieder auf Null
Liste.autofilter field:=1
'Sortiert die Tabelle und bringt somit die leeren gelöschten Felder weg
Range("B8:I65000").Sort Key1:=Range("B8"), Order1:=xlAscending, Header:= _
xlYes, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
Range("B9").Select
'Bedeutung:Formatiert SpalteB wieder von Text in Datum
Range(Selection, Selection.End(xlDown)).Select
Selection.NumberFormat = "dd/mm/yy;@"
'geht in der Tabelle wieder nach oben
Selection.End(xlUp).Select
Range("B9").Select

End Sub

Danke noch einmal für Euer Interesse und Eure Bemühungen

Gruß Kurt
0 Punkte
Beantwortet von saarbauer Profi (15.6k Punkte)
Hallo,

meine Lösung kann nicht funktionieren, da ich vom Datum in Spalte A ausgegangen bin.

Sub Zellen_löschen()
Dim wert As Date
Selection.AutoFilter
wert = InputBox("Hinweis", , Range("B2").Value)
Range("B1").Select
Selection.AutoFilter Field:=2, Criteria1:=wert
Rows("2:" & Range("B" & Rows.Count).End(xlUp).Row).Select
Selection.Delete Shift:=xlUp
Selection.AutoFilter Field:=2
End Sub


so müsste es passen

Gruß

Helmut
0 Punkte
Beantwortet von saarbauer Profi (15.6k Punkte)
Hallo,

habe gerade festgestellt, deine Tabelle beginnt in Zeile 9, daher noch eine Ergänzung

Sub Zellen_löschen()
Dim wert As Date
Selection.AutoFilter
wert = InputBox("Hinweis", , Range("B9").Value)
Range("B1").Select
Selection.AutoFilter Field:=2, Criteria1:=wert
Rows("9:" & Range("B" & Rows.Count).End(xlUp).Row).Select
Selection.Delete Shift:=xlUp
Selection.AutoFilter Field:=2
End Sub


Gruß

Helmut
0 Punkte
Beantwortet von beverly Experte (3.5k Punkte)
Hi Kurt,

besser gewesen wäre es, wenn du deinen Tabellenaufbau mal genauer beschrieben hättest.
Wie schon gesagt: in VBA kann zu 99% aller Fälle auf Select verzichtet werden. Angenommen, dein Bezugsdatum (Datum!!, nicht Text!!) steht in B1:

Sub Filtern()
Range("B8").AutoFilter Field:=1, Criteria1:="=" & Range("B1"), Criteria2:="=" & Range("B1")
Range("B8:D250").SpecialCells(xlCellTypeVisible).EntireRow.Delete
End Sub


Deinen Bereich (im Beispieol B8:D250) sowie B1 musst du an deine bedingugnen anpassen.


Bis später,
Karin
...