PDA

Vollständige Version anzeigen : Jede Zeile mit Inhalt in Spalte X kopieren


gorgel
19.09.2011, 09:51
Hallo zusammen,

wie in der Überschrift beschrieben, versuche ich, jede Zeile des aktiven Arbeitsblattes in ein neues Arbeitsblatt zu kopieren, wenn die Zeile einen x-beliebigen Wert in Spalte "K" hat.

Vom Programmieraufwand und von der Performance her ist es wohl besser, wenn ich die Zeilen, die über den entsprechenden Inhalt verfügen, erst in ein Array zwischenspeichere, dann das neue Arbeitsblatt anlege und letztendlich die Zeilen aus dem Array hineinkopiere.

Ich habe (wie man vielleicht merkt) keine Ahnung von VBA. Deshalb hoffe ich auf kompetente Hilfe! :)

Danke im Voraus und Gruß
gorgel

EarlFred
19.09.2011, 10:10
Hallo gorgel,

Makrorekorder anwerfen, Autofilter setzen, Filtern nach Spalte K und alles kopieren ins neue Blatt. Code anschließend noch säubern und "hübsch" machen.

Besser bekommst Du es von der Performance auch mit Arrays nicht hin.

Wenn Du Codebeispiele brauchst: Such mal nach "Kopieren wenn" und ähnlichen Begriffen - dann wirst Du zugehagelt mit Fundstellen.

Grüße
EarlFred

gorgel
19.09.2011, 11:17
Hallo EarlFred,

danke für deine Tipps. Allerdings funktioniert die Makroaufzeichnung inkl. Autofilter nicht, wie gewünscht.

Wenn ich so vorgehe, also Makroaufzeichnung starte, Spalte K auswähle, Autofilter auf "nicht leere" einstelle und dann als .csv-Datei abspeichere, enthält diese Datei trotzdem alle Zeilen, egal ob ich filtere oder nicht. Die Darstellung in Excel selbst ist richtig, aber abgespeichert werden trotzdem alle Daten.

EarlFred
19.09.2011, 11:20
Hallo gorgel,

hilf mir mal: Wo genau stand denn in der Problembeschreibung, dass Du eine Datenauswahl in eine csv-Datei speichern willst? Habe ich das überlesen?

Das wäre eine ganz anderes Thema, wobei die von Dir beschriebene Aufgabe ein möglicher Zwischenschritt wäre, um die gewünschten Daten zu filtern und diese (auf einem neuen Blatt eingefügte, gefilterte Liste) dann in eine csv zu speichern.

Auch zum Thema "Daten als csv speichern" sollten zahlreiche Beispiele zu finden sein.

Grüße
EarlFred

gorgel
19.09.2011, 11:39
Ich denke, ich muss dir nicht helfen, da du weißt, dass ich den Export als CSV nicht erwähnt habe.

Nichtsdestoweniger habe ich nichts von einem Autofilter, wenn dabei nur der View geändert wird, nicht jedoch die Daten. Ich denke, ich begrabe mein Vorhaben und schreibe anstatt eines Makros ein "ordentliches" Programm, dass die CSV direkt verarbeitet. Mit solchen Problemen habe ich bei einer Skriptsprache nicht gerechnet.

EarlFred
19.09.2011, 11:49
Hallo gprgel,

Nichtsdestoweniger habe ich nichts von einem Autofilter, wenn dabei nur der View geändert wird, nicht jedoch die Daten.
Schlimm, wenn der Filter Daten ändern würde...

Also nochmal: Der Filter an sich hilft Dir beim Auswählen der gewünschten Datensätze (und das sehr, sehr schnell). Soweit bist Du doch schon. Wenn Du diese gefilterte Liste, wie ursprünglich angedacht, in eine neue Tabelle kopierst, stehen da nur die gefilterten Daten (das ist dann nicht nur eine "Optik", sondern "harte" Daten!). Diese kannst Du nutzen für Deinen Export.

Ich denke, ich begrabe mein Vorhaben und schreibe anstatt eines Makros ein "ordentliches" Programm, dass die CSV direkt verarbeitet
Auch in VBA sind "ordentliche" Lösungen möglich. Ich verstehe (zumindest in diesem Zusammenhang) den Einwand nicht.

Grüße
EarlFred

gorgel
19.09.2011, 14:37
Hallo EarlFred,

ich habe den Ansatz mal weiterverfolgt und tatsächlich etwas zusammengefrickelt, das einigermaßen läuft. Folgende Probleme habe ich noch:
1) Dynamik
Wenn ich per Autofilter die entsprechenden Daten sehe und diese nun per Strg+A und Strg+C kopiere, macht mir die Makroaufzeichnung ein [Range("A1:M243").Select] daraus. Und was, wenn es plötzlich bis M244 geht?

2) Zwischenablage
Nach der Filterung kopiere ich die Daten in ein neues "Workbook". Von da aus muss ich sie nochmals bearbeiten, habe aber eigentlich keine Lust, eine dritte Datei zu öffnen um dort die Ergebnisse hineinzukopieren. Also dachte ich mir, ich kopiere die Einträge, die ich benötige, lösche den Inhalt der zweiten Datei und paste die Kopien wieder hinein -> Fehlermeldung.

Ich kann unseren Excel-Usern wirklich nicht zumuten, nach dem Makrodurchlauf 3 Dateien offen zu haben, von denen die zweite nur ein Zwischenschritt ist, der sie gar nichts angeht. Gibt es da keine bessere Lösung? Per Namen kann ich die Datei nicht ansprechen (und schließen), weil ich keine festen Namen vergeben, da so etwas per se Fehler provoziert ("Datei schon vorhanden" o.ä.).

Gruß
gorgel

EarlFred
19.09.2011, 16:14
Hallo gorgel,

Von da aus muss ich sie nochmals bearbeiten
Wie? Was ist zu tun?

Also dachte ich mir, ich kopiere die Einträge, die ich benötige, lösche den Inhalt der zweiten Datei und paste die Kopien wieder hinein -> Fehlermeldung.
Solange wir den Code nicht sehen, kann Dir nicht geholfen werden.

Ich kann unseren Excel-Usern wirklich nicht zumuten, nach dem Makrodurchlauf 3 Dateien offen zu haben, von denen die zweite nur ein Zwischenschritt ist, der sie gar nichts angeht. Gibt es da keine bessere Lösung? Per Namen kann ich die Datei nicht ansprechen (und schließen), weil ich keine festen Namen vergeben, da so etwas per se Fehler provoziert ("Datei schon vorhanden" o.ä.).
Mappen können ohne großes Aufsehen erstellt werden und wieder verschwinden. Namen sind nicht notwendig - arbeite mit Objekten, auf die Du referenzierst. (VBA ist schon eine ziemlich ordentliche "unordentliche" Skriptsprache... ;))

Mal ein Makro, wie es aussehen könnte (es kommt ohne zusätzliche Tabellen / Mappen aus):
Option Explicit
Sub ExportCSV()
Dim rngZeile As Range, rngZelle As Range
Dim lngFree As Long, strAusgabe As String
Const cstrTrenner As String = ";"

'Ausgabedatei öffnen
lngFree = FreeFile
Open "C:\DeinPfad\Ausgabe.csv" For Output As #lngFree

With Worksheets("Datenquelle").UsedRange
If .Worksheet.AutoFilterMode Then .AutoFilter
.AutoFilter Field:=11, Criteria1:="<>"
For Each rngZeile In .SpecialCells(xlCellTypeVisible).Rows
For Each rngZelle In rngZeile.Cells
strAusgabe = strAusgabe & cstrTrenner & rngZelle
Next rngZelle
strAusgabe = Replace(strAusgabe, cstrTrenner, vbNullString, 1, 1)
Print #lngFree, strAusgabe
strAusgabe = vbNullString
Next rngZeile
.AutoFilter
End With

'Ausgabedatei schließen
Close #lngFree
End Sub

Nur ein Beispiel. Freilich ist kann der Code auch umgeschrieben werden, wenn Du es anders haben willst.

Den Ausgabepfad bitte anpassen.

Grüße
EarlFred

gorgel
20.09.2011, 09:32
Hallo EarlFred,

dein Codebeispiel löst alle meine Probleme, vielen Dank!
"Worksheets("Datenquelle").UsedRange" habe ich zwar in "ActiveSheet.UsedRange" geändert, aber der Teil ".UsedRange" war mir unbekannt, ist aber sehr hilfreich.

Auch die Verarbeitung des Ergebnisses des Autofilters per ".SpecialCells(xlCellTypeVisible).Rows" ist super. Dadurch entfällt das lästige Wegkopieren in eine andere Datei, die nur als Zwischenablage fungiert.

Die Umsetzung meines weiteren Arbeitsschrittes war in den ForEach-Schleifen auch kein Problem mehr.
Die Aufgabe ist gelöst und dafür danke ich dir vielmals!

Gruß
gorgel

EarlFred
20.09.2011, 09:36
Hallo gorgel,

freut mich, wenn ich helfen konnte!
Danke für die umfangreiche Rückmeldung.

Grüße
EarlFred