2016-06-21 8 views
1

私はいくつかのデータを含むワークブックを持っています。これをフィルタリングし、フィルタリングしたデータを新しいブックに保存します。関数は次のようになります。コードの最適化から1300のブッ​​クを作成する最速(そして最も安全な)方法は?

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

、それは現在のワークブックとカット全体で各ワークシートを保存し、各反復

  • に新しいブックとして各ワークシートを保存し、より速く、より安全な

    1. にありますブック 最後に個別のワークブックに?

    ありがとうございます。

  • +6

    保存する前に1300枚のワークシートを作成するのは安全ではありません。また、変数をガベージコレクションできるように、個々の操作を別のサブにファーム化します。例えば。 Sub Loop()i = 1〜1300の場合Call DoSave(ワークブックi)Next i End Sub – Absinthe

    +1

    引用:* ...最後に別のワークブックに全体のブックをカットする* *同じように* ...新しいワークブックとして各ワークシートを保存する... *間にセーブしないで...ちょうどあなたはすでにあなた自身の質問に答えていました;) –

    +0

    しかし、シートを使って作業するよりも速くそれを実行するには、変数内の値をプッシュします - 結果を1つの長い文字列として計算する - >テキストファイルに書き込む(csvとして保存する) ) –

    答えて

    5

    1,300件? VBAは忘れて、Excel interopでも忘れてください。

    私はいくつかのC#やVB.NETで行く、およびファイルの構造と仕事にOpenXMLのを使用して、非同期的に、メモリ1300枚のOpenXML文書(すなわちワークブック)を生成したいが(うまくいけば、行の数十万人がそこにはありません1つのシートにつき1つのデータが必要です。)次に、すべてのワークブックオブジェクトを繰り返し、ディスクに順番に保存します(おそらくプログレスバーなどが表示されます)。 I/Oを非同期にすることは、とにかく何の助けにもなりません。

    各ファイル書き込みはtry/catchブロック内にラップされ、処理中にスローされた例外は、後で失敗したシートを識別するための十分な情報を記録することによって処理されます(プログレスバーのロックされたテキストボックスに出力できます)。次のものを試してみる。


    VBAでこれを行うことは永遠に実行されます:、作成し保存して閉じられるように、各ワークブックに4秒を与える - あなたのマクロはかなり時間半である、少なくとも5200秒間に実行されます。

    +0

    私の時間は仕事を手作業で過ごすのに費やされる時間に限られています。 VBAからVB.NETには遠いですか? – Cezary

    関連する問題