2

私はExcel用のマクロを持っていますが、あまりにも派手なものはなく、オブジェクトもありません。数式を使った単純な古いサイクルです。基本的にはこれです:

1 つの列の行を循環し、かなり大きな SUMPRODUCT 関数を実行せずにセルに割り当てます。行を循環したら、Range.Value = Range.Value を 2 回実行して数式を実行し、結果を値として保存します。それでは、次のコラムに進みます。

Excelで使用される各列のメモリが大幅に増加し、マクロが完了してファイルを保存した後も、メモリは引き続き使用されます(タスクマネージャーを信頼できる場合)。ファイルを閉じて再度開くと、もちろんすべてのメモリが解放され、作業を続行できます。メモリの制限により、32 ビット Excel で必要なすべての列を処理できないところまで来ました。

Excel が記憶している内容を忘れさせるために、列間に実装できるトリックがあるのではないかと思っていました。パフォーマンスが向上するかどうかはあまり気にしません (さらなる計算に役立つものがキャッシュされている場合)。メモリ使用量が大きくなりすぎて処理できないようにする必要があるだけです。私は少しグーグルで調べましたが、すべてのアドバイスは大きなオブジェクトを何も設定しないことに関連しています.

コードは次のようなものです (今は手元にありませんが、内容を簡略化した一般的なバージョンです):

for i = 1 to 12
    ThisWorkbook.ActiveWorksheet.Range(Cells(1,i),Cells(x,i)).Font.Color = vbWhite

    for m = 1 to x
        ThisWorkbook.ActiveWorksheet.Cells(m, i).Formula = "'=SUMPRODUCT(blah)"
    next m

    ThisWorkbook.ActiveWorksheet.Range(Cells(1,i),Cells(x,i)).Value = ThisWorkbook.ActiveWorksheet.Range(Cells(1,i),Cells(x,i)).Value
    ThisWorkbook.ActiveWorksheet.Range(Cells(1,i),Cells(x,i)).Value = ThisWorkbook.ActiveWorksheet.Range(Cells(1,i),Cells(x,i)).Value

    ThisWorkbook.ActiveWorksheet.Range(Cells(1,i),Cells(x,i)).Font.Color = vbBlack
next i

基本的に、乱雑な関数テキストが表示されないように白く色付けし、関数を追加して実行し、値として保存し、テキストを黒くします。 重要な追加: SUMPRODUCT を使用して、閉じたファイルからいくつかのセルを合計します。

4

2 に答える 2

6

これは、効率を改善するのに十分なコードではありません。ただし、いくつかのヒントを指摘できます。

最初に覚えておくべきことは、マクロの開始時にアプリケーション画面の更新を false に切り替えることです。

Application.ScreenUpdating = False

次に、マクロ コードの終了直前で元に戻します。

Application.ScreenUpdating = True

フォントの色を変更する必要はなくなりました。マクロの実行中は画面が更新のためにロックされるため、マクロの動作が完了するまで変更は表示されません。

イベントも無効にすることを検討してください。

Application.EnableEvents = False画面の更新とApplication.EnableEvents = true同じ考え方です。

2 つ目は、Evaluate() 関数を利用することです。それをググって、その機能がどれほど効率的であるかを読んでください。

関数をセルに入れてから実行する代わりに、式.Value = .ValueだけEvaluate()で結果をセルに直接返すことができます。これははるかに高速です!

だからあなたは次のようなことができます

for i = 1 to 12
    ThisWorkbook.ActiveWorksheet.Range(Cells(1,i),Cells(x,i)).Value = Evaluate("=SUM(blah)")
next i

理解していただければ幸いです。

マクロを高速化する方法に関するヒントを含むいくつかのリンクを次に示します。

于 2013-10-22T10:11:46.490 に答える
2

これは古い質問ですが、うまくいくように見える方法はワークブックを保存することです。時々実行ThisWorkbook.Saveし、タスク マネージャーで EXCEL を監視すると、かなりの量のメモリがクリアされることがわかります。

Excel が特定の関数呼び出しなどをキャッシュしている可能性があり、保存するとこのキャッシュがクリアされるようです。

于 2016-04-27T12:19:46.783 に答える