クアッドコアAcerAspire S3UltrabookでVBAプログラムを実行しています。問題は、CPUの25%しか使用しないことです(他のプロセスを合わせて最大1%を使用します)。ラップトップはWindows8.0を実行します。 Excelエディションは2013(32ビット)です。システムRAMの55%のみが使用され、Excelは55%の半分を使用します。
Excelではコアが1つしか使用されていないため、25%しか使用されていないと思います。しかし、私にはこの理論を裏付けるものは何もありません。プログラムを高速化するにはどうすればよいですか?
ありがとう。
あなたが使用しようとしているプログラムはシングルスレッドのようです。つまり、単一のコアしか使用できず、他のコアが存在することを認識していません。より高速なシングルコアクロック速度のプロセッサを購入するか、マルチスレッドをサポートするプログラムを使用する以外に、これを高速化する具体的な方法は実際にはありません。
以下のすべてがExcel2007以前に適用されます。上記のコメントに投稿された link @Ƭᴇcʜιᴇ007によると、Excel 2013ではマルチスレッドのネイティブサポートがいくつかあります。とはいえ、経験豊富なプログラマーでない限り、マルチスレッドを忘れるという警告が引き続き適用されます。
残念ながら、VBAはマルチスレッドをサポートしていないため、VBAの計算はプロセッサの1つのコアに制限されます。
ただし、VBscriptファイルを生成して同時に実行することにより、VBAをだまして複数のスレッドを実行させる高度な方法があります。これは、Excelプロセスの外部でコードを実行することで問題を回避し、Windowsがさまざまなスレッドに割り当てられたリソースを管理できるようにします。
とは言うものの、これを機能させることは、コードのロジックを完全に再考することを意味する可能性が高いです(つまり、タスクを同時に実行するのに意味のある方法でタスクを分割する方法を理解する必要があります)。あなたのプロジェクトにとって非常に実行不可能です。私はこれを自分で実装したことがないので、私がすでにあなたに言ったことをあなたに話すこと以外に、これであなたを本当に助けることはできません。
ただし、うさぎの穴に足を踏み入れたい場合は、これが行われている例を示す 興味深いブログ投稿 があります。警告:熟練したプログラマーでない限り、このアイデアを忘れて、VBAが単一のスレッドで実行されることを受け入れることもできます。
大胆なスタックオーバーフローに関するその他のリソース:
https://stackoverflow.com/q/19159025/657668
https://stackoverflow.com/q/5721564/657668
もちろん、複数のスレッドを使用せずにVBAコードを最適化する方法は他にもあります。あなたのコードを見ずに、先のとがった提案をすることは不可能ですが、ここにいくつかの通常の容疑者がいます:
Application.Calculation = xlManual
を設定することで回避できます。 Subを終了する前に、必ずApplication.Calculation = xlAutomatic
に戻してください。免責事項:これは適切な答えではありませんが、1つのコアのみの使用に関する他の回答と一緒にこの種のヒンディー語を見つける必要があるユーザーが多く、私の評判は低すぎて投稿できませんコメント。
VBAスクリプトが1つのコアのみを使用しているように見えますが、それは非常に良いことかもしれません!
他の人がすでに良い答えで述べているように、私はあなたが適切な解決策を見つけるのを助けるためにこの質問の他の側面を知ることが重要だと思います。では、どのようにプログラムをスピードアップしますか?
他の人が言ったように、ネイティブのVBAはマルチスレッドではありません。速度を上げたい場合は、別の言語でユーザー定義関数(UDF)を作成することを検討してください。
ExcelDNAを使用し、C#またはVB.Netを使用することをお勧めします。 C#の記述方法をすでに知っていて、UDF内でマルチスレッドを制御できる場合は、非常に使いやすいです。
上記の他の人が言ったように、スレッド化が答えになるでしょうが、それは実際には実行可能な解決策ではなく、64ビットにアップグレードしても無視できるほどの違いがあります。あなたがやってみることができる一つのことは、プロセスの優先順位を上げることです、あなたはそれをする方法を見ることができます ここ 。
プログラムの他の場所(ディスクからの読み取り/書き込みなど)に別のボトルネックがある可能性があるため、スクリプトが高速になるかどうかを判断するのは難しいですが、少なくともWindowsにそれがあなたよりも優先度が高いことを知らせます他のプロセス。