クアッドコアの Acer Aspire S3 Ultrabook で VBA プログラムを実行しています。問題は、CPU の 25% しか使用していないことです (他のプロセスは合わせて約 1% 使用)。ラップトップは Windows 8.0 を実行しています。Excel エディションは 2013 (32 ビット) です。システム RAM の 55% しか使用されておらず、Excel は 55% の半分を使用しています。
Excel が使用するコアは 1 つだけなので、おそらく 25% しか使用されていないと思います。ただし、この理論を裏付けるものはありません。プログラムを高速化するにはどうすればよいですか?
ありがとう。
答え1
使用しようとしているプログラムはシングル スレッドであるように思われます。つまり、1 つのコアしか使用できず、他のコアの存在を認識しません。より高速なシングル コア クロック速度のプロセッサを購入するか、マルチスレッドをサポートするプログラムを使用する以外に、これを高速化する具体的な方法は実際にはありません。
答え2
以下の内容はすべてExcel 2007以前に適用されます。リンク@Ƭᴇcʜιᴇ007 が上記のコメントに投稿したように、Excel 2013 にはマルチスレッドのネイティブ サポートがあります。とはいえ、経験豊富なプログラマーでない限り、それを忘れるようにという警告は依然として適用されます。
残念ながら、VBA はマルチスレッドをサポートしていないため、VBA の計算はプロセッサの 1 つのコアに制限されます。
ただし、VBscript ファイルを生成して同時に実行することで、VBA を騙して複数のスレッドを実行させる高度な方法があります。この方法では、コードを Excel プロセスの外部で実行することで問題を回避し、さまざまなスレッドに割り当てられたリソースを Windows が管理できるようにします。
とはいえ、これを機能させるには、コードのロジックを完全に再検討する必要がある可能性が高くなります (つまり、タスクを分割して同時に実行できるようにする方法を考え出す必要があります)。これは、プロジェクトでは実現不可能である可能性があります。私は自分でこれを実装したことがないので、すでに説明したことを伝えること以外に、これに関して実際にお手伝いすることはできません。
もしあなたがウサギの穴に足を踏み入れたいなら、ここに興味深いブログ記事これは、これが実行される例を示しています。警告: 熟練したプログラマーでない限り、このアイデアは忘れて、VBA が単一のスレッドで実行されることを受け入れるほうがよいでしょう。
勇気のある人のための Stack Overflow のその他のリソース:
https://stackoverflow.com/q/19159025/657668
https://stackoverflow.com/q/5721564/657668
もちろん、複数のスレッドを使用せずに VBA コードを最適化する方法は他にもあります。コードを見なければ、的確な提案をすることはできませんが、よくある方法をいくつか挙げます。
- 処理を高速化するために、シートから配列にデータを読み込みます。ワークシートとのやり取りは VBA 実行における大きなボトルネックであり、配列を操作することで最小限に抑えることができます。
- 関連する問題として、セルに変更が加えられるたびに Excel がブックを再計算するという問題があります。 を設定することでこれを回避できます
Application.Calculation = xlManual
。Sub を終了する前に、必ず に設定し直すようにしてくださいApplication.Calculation = xlAutomatic
。
答え3
他の人が言ったように、VBA はネイティブではマルチスレッドではありません。速度を上げたい場合は、別の言語でユーザー定義関数 (UDF) を記述することを検討してください。
ExcelDNA と C# または VB.Net の使用をお勧めします。C# の記述方法をすでに知っていて、UDF 内でマルチスレッドを制御できる場合は、非常に簡単に使用できます。
答え4
他の人が言ったように、スレッド化が答えですが、それは実際には実現可能な解決策ではなく、64ビットにアップグレードしてもほとんど違いはありません。試すことができることの1つは、プロセスの優先度を上げることです。その方法を確認してください。ここ。
プログラムの他の場所に別のボトルネック (ディスクからの読み取り/書き込みなど) がある可能性があるため、スクリプトが高速化されるかどうかはわかりませんが、少なくとも他のプロセスよりも優先度が高いことを Windows に知らせることができます。