2016-06-21 2 views
1

Ich habe eine Arbeitsmappe mit einigen Daten, die ich filtern und dann gefilterte Daten in neue Arbeitsmappe speichern möchte. Funktion sieht wie folgt aus:Schnellste (und sicherste) Möglichkeit 1300 Arbeitsmappen zu erstellen?

Sub bleh() 
    For Each i In Number 
     ~~ filter, copy, paste, save ~~ 
    Next i 
End Sub 

Neben Code zu optimieren, ist es schneller und sicherer zu

  1. jedes Arbeitsblatt als neue Arbeitsmappe speichern in jeder Iteration
  2. jedes Arbeitsblatt speichern in der aktuellen Arbeitsmappe und schneiden ganze Arbeitsmappe in separaten Arbeitsmappen am Ende?

Oder vielleicht noch etwas?

Vielen Dank für Ihre Eingabe.

+6

Sicherheit keine Möglichkeit, ich würde 1300 Arbeitsblätter vor dem Speichern erstellen. Außerdem würde ich die einzelnen Operationen auf einem separaten Untersystem farmieren, sodass die Variablen als Garbage Collected erfasst werden können. Z.B. Sub-Loop() Für i = 1 bis 1300 Call DoSave (Arbeitsmappe i) Next i End Sub. – Absinthe

+1

Zitat: * ... ganze Arbeitsmappe am Ende in separate Arbeitsmappen schneiden ... * das wäre das gleiche wie * ... jedes Arbeitsblatt als neue Arbeitsmappe speichern ... * nur ohne das Speichern zwischen ... nur durch Logik, Sie beantwortet bereits Ihre eigene Frage;) –

+0

Aber es schneller als das Arbeiten mit den Blättern und Spalten und was auch immer: Push-Werte in einer Variablen -> Ergebnis als eine lange Zeichenfolge berechnen -> in Textdatei schreiben (als csv speichern);) –

Antwort

5

1.300 Dateien? Vergessen Sie VBA, vergessen Sie sogar Excel-Interop.

ich mit einigem C# oder VB.NET gehen würde, und verwenden Sie OpenXML zu Arbeit mit der Struktur der Datei asynchron die 1300 OpenXML-Dokumente (dh Arbeitsmappe) im Speicher erzeugt (hoffentlich ist es nicht Hunderttausende von Zeilen Wenn Sie alles haben, was Sie wissen müssen, führen Sie alle diese Arbeitsmappenobjekte iterativ durch und speichern Sie sie nacheinander auf der Festplatte (möglicherweise mit einem Fortschrittsbalken oder etwas anderem). Die asynchrone E/A zu machen wird sowieso nichts helfen.

Jede Datei schreiben würde in einen try/catch Block gewickelt und jede Ausnahme in diesem Prozess würde durch Protokollieren genug Informationen zur späteren Identifizierung der fehlerhaften Blätter behandelt (könnte in einem gesperrten Textfeld unter dieser Fortschrittsleiste ausgegeben werden), und dann Weiter mit dem nächsten versuchen.


Dadurch in VBA läuft für immer: jeder Arbeitsmappe 4 Sekunden geben erstellt, gespeichert und geschlossen werden - Ihr Makro wird für mindestens 5200 Sekunden läuft, die so ziemlich eine Stunde und eine Hälfte.

+0

Meine Zeit ist auf die Zeit beschränkt, die ich für die manuelle Arbeit benötige. Ist es weit von VBA zu VB.NET? – Cezary

Verwandte Themen