web-dev-qa-db-ja.com

25%の速度でのみ実行されているExcel VBAプログラム

クアッドコアAcerAspire S3UltrabookでVBAプログラムを実行しています。問題は、CPUの25%しか使用しないことです(他のプロセスを合わせて最大1%を使用します)。ラップトップはWindows8.0を実行します。 Excelエディションは2013(32ビット)です。システムRAMの55%のみが使用され、Excelは55%の半分を使用します。

Excelではコアが1つしか使用されていないため、25%しか使用されていないと思います。しかし、私にはこの理論を裏付けるものは何もありません。プログラムを高速化するにはどうすればよいですか?

ありがとう。

5
tropical

あなたが使用しようとしているプログラムはシングルスレッドのようです。つまり、単一のコアしか使用できず、他のコアが存在することを認識していません。より高速なシングルコアクロック速度のプロセッサを購入するか、マルチスレッドをサポートするプログラムを使用する以外に、これを高速化する具体的な方法は実際にはありません。

6
YetiFiasco

以下のすべてが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コードを最適化する方法は他にもあります。あなたのコードを見ずに、先のとがった提案をすることは不可能ですが、ここにいくつかの通常の容疑者がいます:

  • シートから配列にデータをロードして、処理を高速化します。ワークシートとの相互作用は、VBA実行の主要なボトルネックであり、配列を操作することで最小限に抑えることができます。
  • 関連する問題は、セルに変更が加えられるたびにExcelがブックを再計算することです。これは、Application.Calculation = xlManualを設定することで回避できます。 Subを終了する前に、必ずApplication.Calculation = xlAutomaticに戻してください。
11
Excellll

免責事項:これは適切な答えではありませんが、1つのコアのみの使用に関する他の回答と一緒にこの種のヒンディー語を見つける必要があるユーザーが多く、私の評判は低すぎて投稿できませんコメント。

VBAスクリプトが1つのコアのみを使用しているように見えますが、それは非常に良いことかもしれません!

他の人がすでに良い答えで述べているように、私はあなたが適切な解決策を見つけるのを助けるためにこの質問の他の側面を知ることが重要だと思います。では、どのようにプログラムをスピードアップしますか?

  • システム概要の100%CPU使用率は、プログラムが可能な限り高速になることを意味しません:多くの役に立たないことが行われている可能性があります。検索してみてください「速度のためにVBAを最適化する」。優れた検索エンジンであれば、StackExchangeネットワークからいくつかの有用な回答が得られます。 CPU使用率ではなく、計算に費やした時間を考慮してください。
  • ExcelのVBAは必ずしも仕事を成し遂げるための最良のツールではありません:長時間実行される数値計算の計算では、からデータをエクスポートすると便利な場合がありますプログラミングスキルに応じて、Excelを使用して他のプラットフォームを使用します。選択できるものは非常に多く、Microsoftプラットフォームとうまく統合され、達成可能なパフォーマンス(役に立たないことをする)がかなり優れているものもあります。ここにも適用されます)。
  • 100%CPUを実行しても、25%のみを実行した場合の4倍の速度ブーストはおそらく得られません:計算をどれだけうまく分割するかによって、達成できる場合があります4コアでわずか2倍のブースト。ただし、4つのコアでほぼ4倍のブーストが行われる場合もあります。たとえば、各行で実行される計算がスプレッドシート内の他のデータから完全に独立している場合などです。 。ウィキペディアの アムダールの法則 を参照してください。
  • より多くのコアを使用しようとする価値はないかもしれません:場合によっては役立つかもしれませんが、計算で複数のコアを使用することは可能です(そして通常は)タスクが桁違いに難しく、プログラミング技術の完全な専門知識が必要です(一般的な概要については この質問 を参照してください)。
  • ボーナス:プログラムを高速化する必要はまったくないかもしれません。計算に3分かかり、1回だけ実行する場合一日、椅子から少し立ち上がって硬い骨を伸ばしてみませんか?プログラムを2分30秒で実行できるように調整するのに何日も費やすリスクがあります。これは非常に長い実行でのみ効果があります。優れたプログラマーは、本当に価値がある場合にのみ最適化に時間を費やすので、優れたプログラマーからインスピレーションを得ましょう:)
2
Pavel

他の人が言ったように、ネイティブのVBAはマルチスレッドではありません。速度を上げたい場合は、別の言語でユーザー定義関数(UDF)を作成することを検討してください。

ExcelDNAを使用し、C#またはVB.Netを使用することをお勧めします。 C#の記述方法をすでに知っていて、UDF内でマルチスレッドを制御できる場合は、非常に使いやすいです。

http://exceldna.codeplex.com/

2
BlueTrin

上記の他の人が言ったように、スレッド化が答えになるでしょうが、それは実際には実行可能な解決策ではなく、64ビットにアップグレードしても無視できるほどの違いがあります。あなたがやってみることができる一つのことは、プロセスの優先順位を上げることです、あなたはそれをする方法を見ることができます ここ

プログラムの他の場所(ディスクからの読み取り/書き込みなど)に別のボトルネックがある可能性があるため、スクリプトが高速になるかどうかを判断するのは難しいですが、少なくともWindowsにそれがあなたよりも優先度が高いことを知らせます他のプロセス。

0
Adam