Live-Forum - Die aktuellen Beiträge
Datum
Titel
16.10.2025 17:40:39
16.10.2025 17:25:38
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Makro erweitern

Forumthread: Makro erweitern

Makro erweitern
20.06.2024 08:14:09
tom
Hallo liebe Excel-Freunde,
ich habe hier ein wahrscheinlich kleines Problem…komme aber trotzdem nicht auf
die richtige Lösung. Wäre schön wenn mir hier jemand auf die Sprünge hilft.

Also…ich habe eine Datei die die beiden Tabellenblätter „aktuell“ und „archiv“ enthält.
In „aktuell“ wird momentan vorhandene Ware eingetragen.
Die Daten befinden sich in den Spalten a bis p…ab Zeile 11.
In Spalte A steht immer a für aktiv. Ist die Ware nicht mehr vorhanden wird in Spalte A ein i für inaktiv eingetragen. Am Tagesende werden alle Zeilen in denen in Spalte A ein i steht nach Blatt
„archiv“ kopiert und in „aktuell entsprechend gelöscht. Dazu habe ich das unten aufgeführte Makro geschrieben. Allerdings muss ich immer erst nach „i“ filtern, da sonst alle Datensätze rüberkopiert werden.
Wie muss ich das Makro abändern dass ohne Filterung nur die inaktiven Datensätze kopiert und
anschließend gelöscht werden?

Danke
Tom




Public Sub Archivierung()
Dim loLetzteQuelle As Long, loLetzteZiel As Long

Application.ScreenUpdating = False

With Worksheets("aktuell")
loLetzteQuelle = .Cells(.Rows.Count, "A").End(xlUp).Row
.Range(.Cells(11, "A"), .Cells(loLetzteQuelle, "P")).Copy
With Worksheets("archiv")
loLetzteZiel = .Cells(.Rows.Count, "A").End(xlUp).Offset(1).Row
If loLetzteZiel 11 Then loLetzteZiel = 11
.Paste Destination:=.Cells(loLetzteZiel, "A")
.Activate
.Range("A11").Select
End With
.Range(.Cells(11, "A"), .Cells(loLetzteQuelle, "P")).ClearContents
.Activate
.Range("A11").Select
End With

Application.CutCopyMode = False
End Sub
Anzeige

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Makro erweitern
20.06.2024 09:49:20
daniel
Hi
du könntest die inaktiven Datensätze mit einer 1 oder einem WAHR kennzeichen anstelle von "i".
Wichtig ist, dass des ein anderer Datentyp (Zahl, Text, Wahrheitswert) ist als das "a" (Text).
Wenn du beispielweise die 1 hast, könntest du die SpecialCells die Zeilen mit 1 (Zahl) direkt auswählen und kopieren.

if Worksheetfunction.Sum(.Columns(1)) > 0 Then  '--- erstmal prüfen, ob überhaupt inaktive Werte vorhanden sind

.Columns(1).SpecialCells(xlcelltypeconstants, 1).EntireRow.Copy


sollte die 1 per Formel erzeugt werden, dann müsstest du das xlcelltypecontants durch xlcelltypeformulas ersetzen

wenn das aktiv/inaktiv von Hand eingetragen wird, kannst du auch dabei bleiben und das i in einem ersten Schritt durch 1 erstzen

.Columns(1).Replace "i", 1, xlwhole

if Worksheetfunction.Sum(.Columns(1)) > 0 Then '--- erstmal prüfen, ob überhaupt inaktive Werte vorhanden sind
.Columns(1).SpecialCells(xlcelltypeconstants, 1).EntireRow.Copy


ansonsten kannst du ja auch einfach das Filtern nach "i" auch durch das Makro ausführen lassen (der Recorder ist dein Freund)

der 3. Weg, ohne zu filtern wäre folgender:
1. Liste nach Spalte A sortieren.
2. erste Zeile mit "i" ermitteln (.Find, Searchdirection:= xlnext)
3. letzte Zeile mit "i" ermitteln (.Find, Searchdirection:=xlprevious)
4. Zellbereich zwischen diesen beiden Zeilen (einschließlich) kopieren
sollte die Liste sehr lang sein (10.000 Zeilen und mehr), dann wäre dies der schnellste und zuverlässigste Weg.





Gruß Daniel
Anzeige
AW: Makro erweitern
20.06.2024 14:30:34
Yal
Hallo Tom,

wenn deine Liste sehr gross ist, ist die Suchmethode, wie Daniel vorgestellt hat, schneller.
Wenn unter 100 Zeilen, schlage ich eine Code vor, den ein "VBA nur mit MR" leichter beherrschen kann.

Public Sub Archivierung()

Dim Z As Long 'Z wie Zeile

Application.ScreenUpdating = False

With Worksheets("aktuell")
'Übertragen, von oben nach unten
For Z = 12 To .Cells(.Rows.Count, "A").End(xlUp).Row 'wenn End(xlUp) 12, wird nichts gemacht
If .Cells(Z, "A").Value = "i" Then .Rows(Z).Copy Worksheets("archiv").Cells(.Rows.Count, "A").End(xlUp).Offset(1)
Next
'löschen von unten nach oben
For Z = .Cells(.Rows.Count, "A").End(xlUp).Row To 12 Step -1
If .Cells(Z, "A").Value = "i" Then .Rows(Z).Delete
Next
End With

Application.CutCopyMode = False
End Sub

Ungetestet. Immer zuerst auf eine Kopie probieren.

VG
Yal
Anzeige
AW: Makro erweitern
20.06.2024 14:45:06
tom
Hallo Ihr Zwei,

erst einmal vielen Dank für Eure Lösungsbeiträge.
Ich werde die heute Abend mal ausprobieren. Groß ist die Liste schon...ca. 5.000 Zeilen.
Allerdings werden täglich höchstens 10 als inaktiv gekennzeichnet und sollen dann per Makro in das Archiv übertragen werden.

Mein Makro macht ja eigentlich das was ich brauche...nur das vorherige Filtern ist nervig.
Wenn man das mal vergisst...dann wird alles in's Archiv übertragen und das wäre blöd :-)

tom
Anzeige
AW: Makro erweitern
20.06.2024 16:02:33
daniel
dann erweitere doch einfach das Marko um die Aktivierung des Autofilters
dabei muss man die Überschriftenzeile "mitnehmen"

.Range(.Cells(10, "A"), .Cells(loLetzteQuelle, "P")).Autofilter Field:=1, criteria1:="i"
.Range(.Cells(11, "A"), .Cells(loLetzteQuelle, "P")).Copy

Gruß Daniel
Anzeige
;

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