Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1908to1912
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Filtern / in neue Datei kopieren

Filtern / in neue Datei kopieren
06.12.2022 16:32:53
Mat
Hallo Forum,
leider sind meine VBA Kenntnisse nicht ausreichend, herauszufinden warum dieser Code nicht das tut, was er soll. Wenn ich den Code debugge, wird eine neue, leere Datei erstellt, aber Filtern und kopieren funktioniert nicht :-(
Ich habe noch einmal eine neue, vereinfachte Beispiel-Datei angehängt und wäre für jede Hilfe dankbar...
https://www.herber.de/bbs/user/156559.xlsx
Ziel ist es, die Tabelle für alle Zahlen in der Filterspalte nacheinander zu filtern und das Ergebnis dann in eine neue Datei zu schreiben. Für das Beispiel sollten also drei neue Dateien erstellt werden: 2019, 2020 und 2021 Es sollen allerdings nicht alle Spalten kopiert werden, daher beispielhaft Spalte 5 > "das kann weg"
Mat

Sub xxx()
Dim Jahr As Long
Dim wb As Workbook
Dim shQ As Worksheet
Dim shZ As Worksheet
Set shQ = ActiveSheet
Set wb = Workbooks.Add(xlWBATWorksheet)
Set shZ = wb.Sheets(1)
For Jahr = 2015 To 2025 'alle jahre, die theoretisch in Frage kommen
If WorksheetFunction.CountIf(sh.Columns(1), "*" & Jahr & "*") > 0 Then
'--- alles als Wert mit Format übertragen
shQ.UsedRange.Copy
shZ.Cells(1, 1).PasteSpecial xlPasteValues
shZ.Cells(1, 1).Pastespeical xlPasteFormats
shZ.Cells(1, 1).PasteSpecial xlPasteColumnWidths
'--- nicht benötigte Zeilen löschen
With shZ.UsedRange
With .Columns(.Columns.Count + 1)
.FormulaR1C1 = "=IF(Countif(RC1,""*""&Jahr&""*""),Row(),0)"
.Cells(1, 1).Value = 0
.EntireRow.RemoveDuplicates .Column, xlNo
.ClearContents
End With
End With
'--- nicht benötigte Spalten löschen
shZ.Range("B1,D1,F1:I1,Z1").EntireColumn.Delete
'--- speichern
wb.SaveAs ThisWorkbook.Path & "\xxx_" & Jahr, FileFormat:=xlOpenXMLWorkbook
End If
Next
wb.Close False
End Sub

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Filtern / in neue Datei kopieren
06.12.2022 16:46:28
ralf_b

CountIf(sh.Columns(1),   ?

AW: Filtern / in neue Datei kopieren
07.12.2022 09:14:35
Yal
Hallo Mat,
verwende dafür den Power Query:
_ positioniere dein Zeiger auf eine der Zelle der zu behandelnde Liste
_ gehe auf Menü "Daten", "Aus Tabelle",
_ es wird die Gesamtheit der Tabelle erkannt. Hat Überschrift: ja.
_ dann bist Du in Power Query Editor
_ Rechtklick auf der Überschirft vom 5te Spalte, "Entfernen".
_ filtere die Spalte Jahr mit enthält "2019"
_ Menü "Datei", "Schliessen und laden"
_ auf dem Reiter des neuen Blattes, Rechtklick und "Verschieben oder Kopieren...", kopieren in einer neuen Mappe.
_ Mappe speichern und schliessen
_ auf der Abfrage, Rechtklick und "Bearbeiten"
_ in den Schritte auf das Zahnrädchen von Filter gehen
_ den "2019" in "2020" ändern
_ "Schliessen & laden"
_ usw...
VG
Yal
Anzeige
AW: Filtern / in neue Datei kopieren
07.12.2022 10:02:21
Mat
Hallo Yal,
danke für Dein Feedback - aber ich muss das i.d.R. zwei mal pro Woche machen. und bei ca. 20 bis 30 Jahren (=einzelnen Dateien) ist das manuell ziemlich aufwendig. Daher die Hoffnung, das per Makro zu machen.
In dem Code habe ich ein paar Typos gefunden - das Makro läuft jetzt durch und kopiert alle Werte aus der Quell-Datei in je eine neue.

Sub copy_()
Dim Jahr As Long
Dim wb As Workbook
Dim shQ As Worksheet
Dim shZ As Worksheet
Set shQ = ActiveSheet
Set wb = Workbooks.Add(xlWBATWorksheet)
Set shZ = wb.Sheets(1)
For Jahr = 2015 To 2025 'alle jahre, die theoretisch in Frage kommen
If WorksheetFunction.CountIf(shQ.Columns(1), "*" & Jahr & "*") > 0 Then
'--- alles als Wert mit Format übertragen
shQ.UsedRange.copy
shZ.Cells(1, 1).PasteSpecial xlPasteValues
shZ.Cells(1, 1).PasteSpecial xlPasteFormats
shZ.Cells(1, 1).PasteSpecial xlPasteColumnWidths
'--- nicht benötigte Zeilen löschen
With shZ.UsedRange
With .Columns(.Columns.Count + 1)
.FormulaR1C1 = "=IF(Countif(RC1,""*""&Jahr&""*""),Row(),0)"
.Cells(1, 1).Value = 0
.EntireRow.RemoveDuplicates .Column, xlNo
.ClearContents
End With
End With
'--- nicht benötigte Spalten löschen
shZ.Range("B1").EntireColumn.Delete
'--- speichern
wb.SaveAs ThisWorkbook.Path & "\xxx_" & Jahr, FileFormat:=xlOpenXMLWorkbook
End If
Next
wb.Close False
End Sub
Auch werden wie erwartet die nicht benötigten spalten gelöscht...

'--- nicht benötigte Spalten löschen
shZ.Range("B1").EntireColumn.Delete
Was richtig blöd ist, dass dieser Teil alle Zeilen abgesehen von der Überschrift löscht. Im Ergebnis habe ich also lauter leere Dateien mit dem "richtigen" Dateinamen.

'--- nicht benötigte Zeilen löschen
With shZ.UsedRange
With .Columns(.Columns.Count + 1)
.FormulaR1C1 = "=IF(Countif(RC1,""*""&Jahr&""*""),Row(),0)"
.Cells(1, 1).Value = 0
.EntireRow.RemoveDuplicates .Column, xlNo
.ClearContents
End With
End With
Wie muss ich das Makro umschreiben, damit ggf. einfach "nur" alle Zeilen mit der entsprechenden Jahreszahl in der Filterspalte kopiert werden?
Anzeige
AW: Filtern / in neue Datei kopieren
07.12.2022 10:32:01
Yal
Hallo Mat,
Du arbeitest mit einer "intelligenten" Tabelle ("Einfügen", "Tabelle") in VBA als "ListObject"-Objekt benannt. Sie haben einige Sonderverhalten.
Löschen der Spalte B:

shZ.Range("B:B").Delete Shift:=xlToLeft
Löschen der nicht zutreffende Zeilen:
Filtern, sichtbare Zeilen löschen, Filter zurücksetzen. Hier am Bsp. 2019 in Spalte 3:

    Application.DisplayAlerts = False 'Sonst verlangt DataBodyRange. .. .Delete eine Bestätigung
With Tabelle1.ListObjects("Tabelle1")
.Range.AutoFilter Field:=3, Criteria1:="*2019*", Operator:=xlAnd
.DataBodyRange.Cells.SpecialCells(xlCellTypeVisible).Delete
.Range.AutoFilter Field:=3 'Filter-Reset
End With
Application.DisplayAlerts = True
VG
Yal
Anzeige
AW: Filtern / in neue Datei kopieren
07.12.2022 14:33:57
Mat
Hi Yal,
super - vielen Dank... ich definiere nach dem kopieren die intelligente Tabelle in der neuen Mappe und das Filtern, Löschen und Filter-Reset funktioniert jetzt.

Sub copy_()
Dim Jahr As Long
Dim wb As Workbook
Dim shQ As Worksheet
Dim shZ As Worksheet
Set shQ = ActiveSheet
Set wb = Workbooks.Add(xlWBATWorksheet)
Set shZ = wb.Sheets(1)
For Jahr = 2015 To 2025 'alle jahre, die theoretisch in Frage kommen
If WorksheetFunction.CountIf(shQ.Columns(1), "*" & Jahr & "*") > 0 Then
'--- alles als Wert mit Format übertragen
shQ.UsedRange.copy
shZ.Cells(1, 1).PasteSpecial xlPasteValues
shZ.Cells(1, 1).PasteSpecial xlPasteFormats
shZ.Cells(1, 1).PasteSpecial xlPasteColumnWidths
'--- nicht benötigte Zeilen löschen
Application.DisplayAlerts = False 'Sonst verlangt DataBodyRange. .. .Delete eine Bestätigung
With Sheets("Sheet1")
With .ListObjects.Add(xlSrcRange, .Cells(1, 2).CurrentRegion, , xlYes)
.Name = "Table1"
'         .ShowTotals = True
.Range.AutoFilter Field:=1, Criteria1:="*" & Jahr & "*", Operator:=xlAnd
.DataBodyRange.Cells.SpecialCells(xlCellTypeVisible).Delete
.Range.AutoFilter Field:=1 'Filter-Reset
End With
End With
Application.DisplayAlerts = True
'--- nicht benötigte Spalten löschen
shZ.Range("B:B").Delete Shift:=xlToLeft
'--- speichern
wb.SaveAs ThisWorkbook.Path & "\xxx_" & Jahr, FileFormat:=xlOpenXMLWorkbook
End If
Next
wb.Close False
End Sub
Allerdings springt das Makro nach dem Speichern der Datei jetzt nicht zur nächsten Jahreszahl... es fehlt also noch was :-(
Anzeige
AW: Filtern / in neue Datei kopieren
07.12.2022 15:27:43
Yal
Natürlich nicht, weil nicht zuerst eine Kopie und dann das Überflüssiges löscht, sondern löscht direkt auf das original.
Also wenn auf 2019 gefiltert/gelöscht, bleibt es kaum 2020 und 2021...
Zumindest: Du machst am Ende einen "SaveAs", aber Du bleibst in der Kopie. Damit wird nicht auf das orignal zurückgekehrt.
VG
Yal
AW: Filtern / in neue Datei kopieren
07.12.2022 15:49:45
Mat
hmm... danke für's Feedback - mein VBA reicht leider nicht entfernt dafür, das zu lösen :-(
was muss ich umbauen? Kannst Du ggf. helfen?
AW: Filtern / in neue Datei kopieren
08.12.2022 18:24:03
Yal
Hallo Mat,
mache es umgekehrt:
_ definiere die Quelle als aktive/intelligente Tabelle
_ baue darauf eine Power Query Abfrage ("Daten", "aus Tabelle")
_ schliesse ohne weitere Verarbeitung mit "Schliessen & Laden in ...", "nur Verbindung herstellen"
Benutze dann diese Code:

Sub copy_()
Dim Jahr As Long
Dim wbZ As Workbook
Dim ws As Worksheet
Const cAbfrage = "so_hiesst_meine_Abfrage" 'Anpassen
For Jahr = 2015 To 2025 'alle jahre, die theoretisch in Frage kommen
'Neues Blatt herstellen
Sheets.Add After:=ActiveSheet
Set ws = ActiveSheet
'Abfrage in das Blatt herausgeben
With ws.ListObjects.Add(SourceType:=0, _
Source:="OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=" & cAbfrage & ";Extended Properties=""""", Destination:=Range("$A$1")).QueryTable
.CommandType = xlCmdSql
.CommandText = Array("SELECT * FROM [" & cAbfrage & "] Where [Jahr] = " & Jahr) 'Achtung: ev. Spaltename anpassen
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
'Aktualisieren
.Refresh BackgroundQuery:=False
End With
'Link zu Abfrage lösen
ws.ListObjects(1).Unlink
'Blatt in einer neue Arbeitsmappe versetzen
ws.Move
Set wbZ = ws.Parent
'Speichern unter Name+Jahr und schliessen
wbZ.SaveAs ThisWorkbook.Path & "\xxx_" & Jahr, FileFormat:=xlOpenXMLWorkbook
wbZ.Close
Next
End Sub
Was wird gemacht? Aus der Abfrage wird je nur das "For"-Jahr zurückgeben, versetzt, gespeichert, nächste.
VG
Yal
Anzeige
AW: Filtern / in neue Datei kopieren
09.12.2022 10:13:43
Mat
Hi Yal,
vielen Dank - grundsätzlich verstehe ich, wie das funktionieren soll. Die Schritte kann ich auch alle nachvollziehen - alleine das Script läuft nicht :-(
Wenn das Script diese Stelle erreicht, wirft es Fehler 1004...

With ws.ListObjects.Add(SourceType:=0, _
Hast Du eine Idee, was falsch sein könnte?!
AW: Filtern / in neue Datei kopieren
09.12.2022 10:15:50
Steffen
Hallo Mat,
bei der Kopieraktion in Zeile 17 und 18 musst du die Variable shZ verwenden, statt sh. Stattdessen wird derzeit der aktive Tabellenblatt verwendet.
Ich habe deinen Code etwas angepasst und jetzt sollte er funktionieren:

Sub xxx()
Dim Jahr As Long
Dim wb As Workbook
Dim shQ As Worksheet
Dim shZ As Worksheet
Set shQ = ActiveSheet
Set wb = Workbooks.Add(xlWBATWorksheet)
Set shZ = wb.Sheets(1)
For Jahr = 2015 To 2025 'alle jahre, die theoretisch in Frage kommen
If WorksheetFunction.CountIf(shQ.Columns(1), "*" & Jahr & "*") > 0 Then
'--- alles als Wert mit Format übertragen
shQ.UsedRange.Copy
shZ.Cells(1, 1).PasteSpecial xlPasteValues
shZ.Cells(1, 1).Pastespeical xlPasteFormats
shZ.Cells(1, 1).PasteSpecial xlPasteColumnWidths
'--- nicht benötigte Zeilen löschen
With shZ.UsedRange
With .Columns(.Columns.Count + 1)
.FormulaR1C1 = "=IF(Countif(RC1,""*""&Jahr&""*""),Row(),0)"
.Cells(1, 1).Value = 0
.EntireRow.RemoveDuplicates .Column, xlNo
.ClearContents
End With
End With
'--- nicht benötigte Spalten löschen
shZ.Range("B1,D1,F1:I1,Z1").EntireColumn.Delete
'--- speichern
wb.SaveAs ThisWorkbook.Path & "\xxx_" & Jahr, FileFormat:=xlOpenXMLWorkbook
End If
Next
wb.Close False
End Sub

Anzeige
AW: Filtern / in neue Datei kopieren
09.12.2022 10:37:16
Mat
Hi Steffen,
vielen Dank - das läuft jetzt insofern, dass für jedes Jahr tatsächlich eine neue Datei erzeugt wird.
Allerdings löscht das hier dann den gesamten Inhalt :-(

             With shZ.UsedRange
With .Columns(.Columns.Count + 1)
.FormulaR1C1 = "=IF(Countif(RC1,""*""&Jahr&""*""),Row(),0)"
.Cells(1, 1).Value = 0
.EntireRow.RemoveDuplicates .Column, xlNo
.ClearContents
End With
End With
Wie muss ich das umschreiben, wenn ich möchte, dass alle Zeilen "enthält nicht *Jahr*" gelöscht werden?
AW: Filtern / in neue Datei kopieren
09.12.2022 13:18:02
Yal
Hallo Mat,
versuche mal den Code auf Deutsch zu lesen, am besten laut, so dass Du selbst hören kannst (kein Scherz)
"mit dem Tabelle sh", "davon die Spalte xx" mache irgendwas aber dann als letzte "lösche den Inhalt". Klingelt es?
VBA mag für Dich was neues sein, aber es ist gewiss kein Klingonisch. Mit dem passenden Willen kommt man auch ohne Lehrer schnell voran.
Für alle VBA-Idiomen, die Du nicht verstehst, Cursor drauf poistionieren und Strg+F1. Da gelangst Du zur Online-Hilfe. Am Anfang genau lesen und Beispiel genau anschauen.
VG
Yal
Anzeige

303 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige