Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1492to1496
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

vba gefilterte Zeilen einzeln kopieren

vba gefilterte Zeilen einzeln kopieren
13.05.2016 17:13:39
Bernhard
Hallo,
ich habe eine Excel Datei mit u.a. 2 Blättern, "Isogonen" und "gefiltert".
Gefilterte Daten aus "Isogonen" sollen per vba in "gefiltert" kopiert werden für eine Grafik, und zwar sequentiell, Zeile für Zeile... sodass sich die Kurve langsam aufbaut.
In "Isogonen" nimmt das vba nacheinander Filterungen vor, weswegen hernach stets neue Zeilen-Nr. angezeigt werden.
Nach der 1. Filterung ist in "Isogonen" die 1. Datensatzzeile Nr. 268, die 2. Nr.269 usw. bis 293.... dann gehts mit Nr.622 weiter, usw.
Nach der 2. Filterung ist in "Isogonen" die 1. Datensatzzeile Nr. 2898, die 2. Nr.2899 usw. bis 2909.... dann gehts mit Nr.3243 usw. fort. Nach jeder Filterung also andere Zeilen. Spalten-Nr. stets B bis E.
Die 4 Spaltenköpfe sollen mit kopiert werden. Sie stehen in "Isogonen" in Zeile 25, in "gefiltert" in Zeile 3. Die Datensätze stehen direkt unter den Köpfen (keine Leerzeilen dazwischen und zwischen Datensätzen).
In "gefiltert" beginnen die Datensätze stets mit Zeilen-Nr. 4 usw. fortlaufend, auch hier ohne Leerzeilen und direkt unter den Köpfen. Spalten Nr. in "gefiltert" nach der 1.Filterung B bis E, nach der 2.Filterung G bis J usw. (immer eine Leerspalte dazwischen).
Insgesamt gibt es 90 Filterungen.
Was muss ich ins vba schreiben, dass es beginnend mit der Kopfzeile alle Zeilen bis unten (= 1.Leerzeile) EINZELN, Datensatz für Datensatz, aus "Isogonen" kopiert und ebenso einzeln nacheinander in "gefiltert" unter die Kopfzeilen einfügt?
Bisher habe ich das vba händisch wie folgt beschrieben (Schnipsel):
Sheets("Isogonen").Range("B25:E25").Copy Sheets("gefiltert").Range("b3")
Sheets("Isogonen").Range("B268:E268").Copy Sheets("gefiltert").Range("b4")
Sheets("Isogonen").Range("B269:E269").Copy Sheets("gefiltert").Range("b5")
usw.
usw.
Aber bei 622 Zeilen bei einer einzigen Filterung werd ich dabei deppat... ;-)
Kennt wer da eine bessere Lösung?
Besten Dank und viele Grüsse,
Bernhard

19
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: vba gefilterte Zeilen einzeln kopieren
13.05.2016 17:21:29
Fennek
Hallo,
einige Verständnisfragen:
Ohne ein 'Wait' ist vba so schnell, dass für den Betrachter alle Zeilen sofort aufgebaut werden. Wäre da nicht eine Chart-Animation besser? (in Power-Point geht das, in Excel?)
Ohne diesen zeitlichen Effekt, kann man die Daten sicher besser kopieren.
mfg

AW: vba gefilterte Zeilen einzeln kopieren
13.05.2016 17:36:33
Daniel
Hi
im Prinzip so
dim Zelle as Range
dim Zeile als long
Zeile = 3
With Sheets("Isogonen")
for each Zelle In .Range(.Cells(25, 2), .cells(.Rows.count, 2).end(xlup)).speciaclCells( _
xlcelltypevisible)
Zelle.Resize(, 4).Copy Sheets("gefiltert").Cells(2, Zeile)
Zeile = Zeile + 1
'--- hier dann ggf deine Verzögerungsschleife
next
end with

Gruß Daniel

Anzeige
AW: vba gefilterte Zeilen einzeln kopieren
13.05.2016 17:45:28
Bernhard
Hallo Fennek,
du kennst meine alte XP Mühle aus anno 2005 A.D. nicht ;-)
Mit den handgeschriebenen Schnipseln braucht er auf meiner Mühle pro Datenpunkt gefühlte 0,8 Sekunden mit dem Einzeichnen in die Grafik...
Insofern keine Sorge... aber vielleicht mach ich 2 Versionen, eine mit einer applicationwait-Bremse o.ä. drinnen für schnellere Maschinen.
Als Excel Fan vermeide ich andere Office-Anwendungen, so gut es geht... ;-)
Alternativ greife ich auch auf gif mit Photoshop zurück...
Aber Danke für den hinweis!
LG, Bernhard

AW: vba gefilterte Zeilen einzeln kopieren
13.05.2016 19:47:57
Fennek
Hallo,
neben meinem neuen i7 Rechner nutze ich manchmal auch noch ein Laptop mit wenig Ram aus 2003. Für Excel ist der Unterschied gefühlt minimal. (Bei Bildbearbeitung, z.B. Lightroom aber sehr groß)
mfg

Anzeige
AW: vba gefilterte Zeilen einzeln kopieren
13.05.2016 19:57:52
Bernhard
Hallo Fennek,
wow, i7... Traum meiner schlaflosen Nächte ;-)
Mir kommt das 2010er Excel überhaupt EXTREM langsam vor, verglichen mit 2003 :-(
Beim 2003er musste ich in der Tat noch die "Spassbremse" einbauen, wie auch aus meinem Code ersichtlich...
Dennoch wunderts mich jetzt, dass dein schneller Rechner keine Performance Verbesserung gegenüber deinem alten Läppi bringt... genau diese Excel Beschleunigung wär für mich der Hauptgrund für eine Neuanschaffung... neben Photoshop.... hmmmm

AW: vba gefilterte Zeilen einzeln kopieren
13.05.2016 18:36:17
Bernhard
Hallo Daniel,
danke für den Code. Bei dim steht "als" statt "as" drinnen, ich habs mal geändert...
aber jetzt kommt "End ohne if" als Fehler, obwohl ich "end if" drinnen habe.
Ich poste mal den Code bis inkl. erste Filterung, vielleicht erkennst du es auf Anhieb:
Sub komplett_offen()
Dim Bereich As Range
Dim Variable As Long
Dim Anzahl As Long
Dim Start As Long
Dim i As Long
Dim x As Long
Dim Zelle As Range
Dim Zeile As Long
'1. Filterkriterien (aus alter Filterung) löschen
Sheets("Isogonen").Range("n4:n65536").ClearContents
'2. Neue Filterkriterien auflisten
Schritt = Cells(5, 2)
Start = Cells(4, 2) - Schritt
Ende = Cells(6, 2) - Schritt
For i = Start To Ende Step Schritt
x = x + 1
Cells(x + 3, 14) = i + Schritt
'3. Warten nach Listung jedes Filterkriteriums
Application.Wait Now + TimeSerial(0, 0, 1)
Next i
'4. gefilterte Daten (aus alter Filterung) löschen
Sheets("gefiltert").Cells.Clear
Sheets("grafik").Select
'4a. ohne auf "Isogonen" zu springen
Application.ScreenUpdating = False
'5. Warten nach Löschen
'Application.Wait Now + TimeSerial(0, 0, 2)
'6. Filterung aufheben (im Hintergrund)
Sheets("Isogonen").Activate
With ActiveSheet
If .AutoFilterMode Then
If .FilterMode Then .ShowAllData
End If
End With
'7. Falls Filterzelle nicht leer:
If Sheets("Isogonen").Range("n4").Value  "" Then
'7a. filtern
Sheets("Isogonen").Range("e25:E65533").Autofilter Field:=5, Criteria1:=Range("n4")
'7aa. "activate" in 6. lässt ihn auf "Isogonen" springen, deshalb:
Sheets("grafik").Activate
'7ab. Die Grafik soll fertig für die neue Kurve sein:
Application.ScreenUpdating = True
'7b. Filterergebnis ausgeben
'Sheets("Isogonen").Range("B25:E25").Copy Sheets("gefiltert").Range("b3")
'Sheets("Isogonen").Range("B268:E268").Copy Sheets("gefiltert").Range("b4")
'Sheets("Isogonen").Range("B269:E269").Copy Sheets("gefiltert").Range("b5")
'Sheets("Isogonen").Range("B270:E270").Copy Sheets("gefiltert").Range("b6")
'Sheets("Isogonen").Range("B271:E271").Copy Sheets("gefiltert").Range("b7")
'Sheets("Isogonen").Range("B272:E272").Copy Sheets("gefiltert").Range("b8")
'Sheets("Isogonen").Range("B273:E273").Copy Sheets("gefiltert").Range("b9")
'Sheets("Isogonen").Range("B274:E274").Copy Sheets("gefiltert").Range("b10")
'Sheets("Isogonen").Range("B275:E275").Copy Sheets("gefiltert").Range("b11")
'Sheets("Isogonen").Range("B276:E276").Copy Sheets("gefiltert").Range("b12")
'Sheets("Isogonen").Range("B277:E277").Copy Sheets("gefiltert").Range("b13")
Zeile = 3
With Sheets("Isogonen")
For Each Zelle In .Range(.Cells(25, 2), .Cells(.Rows.Count, 2).End(xlUp)).speciaclCells( _
xlCellTypeVisible)
Zelle.Resize(, 4).Copy Sheets("gefiltert").Cells(2, Zeile)
Zeile = Zeile + 1
'7c. andernfalls Programmende
Else: Sheets("grafik").Select
Exit Sub
'7d. Ende if Schleife
End If
'8. gefilterte Daten anzeigen
Sheets("grafik").Select
'9. Warten
Application.Wait Now + TimeSerial(0, 0, 2)
'9a. da wir im Modus screenupdating = true sind, muss ein Springen auf "Isogonen" verhindert  _
werden
Application.ScreenUpdating = False
'2.Filterung usw....
Application.ScreenUpdating = True
End Sub

Anzeige
AW: vba gefilterte Zeilen einzeln kopieren
13.05.2016 19:21:45
Daniel
Hi
bei einer For-Next-Schleife zum kopieren fehlt das NEXT.
die Fehlermeldung von VBA ist hier verwirrend.
Aber es liegt daran dass IF-THEN und FOR-NEXT immer ineinander geschachtelt werden müssen.
für den Edior ist die For-Schleife noch nicht abgeschlossen.
daher braucht jedes END-IF nach dem For auch sein dazugehöriges IF-THEN nach dem For.
btw deine Einrückungen sind nicht sauber.
sei da mal konsequent, dann fallen solche Fehler schneller auf.
gruß Daniel

AW: vba gefilterte Zeilen einzeln kopieren
13.05.2016 19:40:37
Bernhard
Hi Daniel,
was für Einrückungen? Dachte, alles wird als Code erkannt, wenn kein Apostroph davor steht....
Habe deinen Code jetzt ab "Zeile = 3" vor mein "7." verpflanzt.
Aus deinem "speciaclCells" das "c" entfernt, und mit "next Zelle" und mit "End with" abgeschlossen.
Jetzt kommt Laufzeitfehler 1004: "infos können nicht eingefügt werden, da Bereich Kopieren und Bereich zum Einfügen unterschiedliche Formen und Grössen haben.... markieren Sie..." aber dann brauch ich ja kein vba ;-)
Grüße,
Bernhard

Anzeige
AW: vba gefilterte Zeilen einzeln kopieren
13.05.2016 20:42:53
Daniel
Hi
dem Computer sind die Einrückungen egal.
aber du siehst schneller, wo deine WITH-, IF-THEN-, For-Next- und sonstigen Konstrukte anfangen und aufhören und bemerktst dann solche Fehler schneller.
zeig mal deinen Code, am besten mti einer Beispieldatei dazu.
Funktionierenden Code für deine Datei zu schreiben die man nicht kennt, ist wie blind auf eine Scheibe zu schießen.
Gruß Daniel

AW: vba gefilterte Zeilen einzeln kopieren
13.05.2016 20:53:44
Bernhard
Hi Daniel,
wie gross darf die Datei, die man hier uploaden kann, maximal sein?
Meine ist knapp 11 MB...
Grüße,
Bernhard

AW: vba gefilterte Zeilen einzeln kopieren
13.05.2016 21:13:00
Daniel
hi
steht doch alles auf der Uploadseite beschrieben: 300kb
du musst die Beispieldatei halt entsprechend abspecken.
im prinzip reichen ja ein paar Datenzeilen vom Quelldatenblatt und das Zieldatenblatt.
Gruß Daniel

Anzeige
AW: vba gefilterte Zeilen einzeln kopieren
13.05.2016 21:46:13
Bernhard
Hi,
oh Gott, ja, grad hab ichs gesehen... beim Versuch.
Hab schon auf 1,6 MB abgespeckt, aber immer noch viel zu gross... :-(
Ich versuche jetzt, es noch weiter abzuspecken... bitte um etwas Geduld noch.
Grüsse,
Bernhard

AW: vba gefilterte Zeilen einzeln kopieren
13.05.2016 22:54:59
Bernhard
Hi Daniel,
Testdatei wurde hoch geladen.
Die Filter in Spalte E gehen nicht in dieser Version, und das vba meldet hier auch Fehler 1004... warum auch immer... aber beides tut es in der Vollversion nicht.
Dein Code ist apostrophiert unter 7b., mit Ausnahme deiner "dims".
Für Filterwert "0" rechnet er die ersten 10 Werte so, wie es sein soll.
Zu sehen in der Grafik ganz links am y-Koordinatenkreuz über "30", die weissen Punkte, die senkrecht nach oben wandern...
Vorausgesetzt, dein Rechner ist langsam genug... andernfalls wohl ein senkrechtes weisses Stricherl "auf einen Schlag".... ;-)
Filter 2-4 NOCH in alter Version, also Zeichnung auf einen Schlag.... und das soll er künftig mit dem neuen Code langsam einzeichnen.
Danke für deine Unterstützung!
Grüsse,
Bernhard

Anzeige
AW: vba gefilterte Zeilen einzeln kopieren
14.05.2016 02:19:43
Daniel
Hi
sorry ich steige bei deinem Code nicht durch und hab auch keine Lust da viel zeit rein zu investieren.
wenn ich mir das nochmal anschauen soll, bereinige bitte folgende Punke:
1. verwende Option Explicit, warum und wieso steht hier:
http://www.online-excel.de/excel/singsel_vba.php?f=4
2. du arbeitest mit mehren Tabellenblättern, refrenziere bitte immer alle Tabellenblätter, beim Testen schaltet man schon mal zwischen den Tabellenblättern hin und her und dann sollte es nicht passieren, dass ein Programmschritt auf einem falschen Tabellenblatt ausgeführt wird.
http://www.online-excel.de/excel/singsel_vba.php?f=78
3. nutze die Einrückungen für For-Next-Schleifen, IF-Then-Blöcke und With-Blöcke konseqent. (auch für kommentare im Code)
man sieht dann schneller, wie dein Code aufgebaut ist und was zusammengehört (auch wenn es der Compiler nicht benötigt, aber es ist für den Leser des Codes übersichtlicher)
4. deine Tabelle, von der kopiert werden soll (Isogonen) enthält keine Daten. Warum?
5. der Button ist mit einem Makro in einer anderen Datei verlinkt. Warum?
6. deine Nummerierung ist nicht durchgängig. nach 9. kommt wieder 6. und das zwei mal
sieht so aus, als hättest du da irgendwas zusammenkopiert. Bitte hier durchgänging selber programmieren und nicht irgendwas zusammenkopieren.
Überarbeite bitte deinen Code nochmal nach diesen Punkten, wenns dann noch nicht funktioniert kannst du ihn wieder hochladen.
Gruß Daniel

Anzeige
AW: vba gefilterte Zeilen einzeln kopieren
18.05.2016 12:02:02
Bernhard
Hallo Daniel,
danke für deine Ausführungen.
Ich werde nochmal ein Testfile erstellen. Das vorliegende war ein schnell zusammen gekürztes, wo das makro noch auf das zu grosse, originale referenziert.
Die Tabelle Isogonen enthält Daten ab Zeile 268, die oberen habe ich wegen der Dateigrösse gelöscht, da andernfalls meine (durch den gewünschten, neuen code zu ändernden) händisch rein kopieren Makro-Zeilen (copy) falsch referenziert hätten und das Makro von vorn herein nicht gelaufen wäre (leider läufts jetzt dennoch nicht im Testfile, also hätt ich mir das schenken können).
Ich werde nochmal eine test-Version erstellen und hoch laden (so auf die Schnelle in der Nacht ist das eben nichts).
Besten Dank für deine Hilfe!

Anzeige
AW: vba gefilterte Zeilen einzeln kopieren
18.05.2016 18:54:04
Bernhard
Hi Daniel,
hier das hoffentlich nun funktionierende Test file mit vba.
Ich hoffe, Du kommst damit jetzt klar.
https://www.herber.de/bbs/user/105638.xlsm
Der zu verbessernde Code-Teil ist hervor gehoben, alles ausführlich dokumentiert.
Was mich noch wundert ist, dass das vba bei click auf das grüne Dreieck im Editor falsch läuft (im Sheet "Grafik" macht er dann lauter Nullen rein).
Besten Dank für Deine Hilfe!
LG, Bernhard

AW: vba gefilterte Zeilen einzeln kopieren
18.05.2016 20:08:35
Daniel
sorry, ich blicks nicht
in deinem Code ist sehr viel hervorgehoben.
wer trägt wo nullen ein und was sollte er stattdessen eintragen?
Gruß Daniel

Anzeige
AW: vba gefilterte Zeilen einzeln kopieren
19.05.2016 14:55:03
Bernhard
Hi Daniel,
das mit Nullen hat sich erledigt... durch .select am Code Anfang wird jetzt immer zuerst "Isogonen" angezeigt.
Das eigentliche Thema der Automatisierung des copy bis zur ersten Leerzeile und paste zwischen 2 Arbeitsblättern zeilenweise untereinander, von einem sheet ins andere, wär aber immer noch offen.
Ich hab im neuen Testfile nochmals ausführlich dokumentiert, dito im Code... ich lade es nochmal hoch:
https://www.herber.de/bbs/user/105665.xlsm
Danke für Deine Hilfe!
LG, Bernhard

334 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige