• 締切済み

1つのVBAコードをすべてのコアを使って実行させたい

いつもお世話になっております。 クアッドコア搭載のPCを購入してVBAの処理速度の向上を期待していたんですが、1つのコアだけで処理されているようです。 EXCEL2000でVBAコードを実行したのが原因だと思いまして、試用版のEXCEL2007を使って同じVBAコードを実行してみたのですがダメでした。 VBAコードをすべてのコアを使って実行することはできないのでしょうか。 特別なコードを記述しなければならないのでしょうか。 よろしくお願いいたします。

みんなの回答

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。 >CPUとメモリの性能をアップさせれば処理速度が速くなると考えていたんですが、期待通りの結果が得られなかったことから今回のような質問をさせていただきました。 結論から言うと、私には答えがないというのか、それは、一種の時間のパラドックスだと思うのです。あまり、この話を詳しく書くのは、本題から外れてしまいますが、同じ話を、今から、20年ほど前にしているのを、まだ忘れていません。 今回のご質問も他のご質問を通してみても、具体的な内容はありませんから、それを、あれこれ指示を出すことは不可能だと思いますが、私には、やはり技術的な問題だと思います。ご質問者さんは、かなりVBAに自信がおありのようで、それでハード側のスペックを上げることに目を向けたのかもしれません。 ただ、私も、ある程度のMicrosoft の表計算の癖というのか、コツは心得ていますから、みなさんが不満を感じているようなことは、自分の表の中では一切起こらないのです。Excel 2003 で、今、優に4万行を越えていますが、その処理をまったく遅いとは思いません。 私が、パラドックスというのは、この問題で不毛の議論になった記憶があるのは、パソコンの前で、マクロの終わるのを待つ人には、どんなスピードでも、遅く感じるものだということです。(そうではない、物理的な時間が長いという反論は出るとは思いますが、それは、水掛け論で、今も昔も変わらないのです。) >VBAでマルチコアを有効に活用するためのテクニックなどご存知でしたらご教授いただければ幸いです。 残念ながら、そういう方向で求め続けても、私としては、不可能だと思います。使っているメモリ(キャッシュ)は、ひとつですから、マルチコアにしても、VBA自体は、ひとつのはずです。 それと、私の目からは、 >VBA高速化テクニック >http://officetanaka.net/excel/vba/speed/index.htm 少なくとも、こんなお茶を濁す程度の話では、解決しないでしょうね。

center69
質問者

お礼

Wendy02様、お礼が遅くなり申し訳ありません。 私の追加の質問(疑問)が今回の内容と違うために返事がいただけなかったのだと思い、回答を締め切ることにしました。 疑問は機会を見て質問してみたいと思います。 これからもよろしくお願いします。

center69
質問者

補足

Wendy02様、返事が遅くなり申し訳ありません。 私はVBA初心者です。 自分の書いたコードに自信なんてとてもありません。 私の現時点での技術力では処理速度の向上が見込めないと考えてクアッドコアのPCを購入したわけです(現実は私の誤解のために宝の持ち腐れとなりそうですが)。 >ただ、私も、ある程度のMicrosoft の表計算の癖というのか、コツは心得ていますから、みなさんが不満を感じているようなことは、自分の表の中では一切起こらないのです。 この部分を具体的に知りたいです。 今回の質問の本題からは外れますが、それを勉強すれば処理の遅さを感じない(物理的な時間は別として)ならぜひ教えていただきたいです。 私は「VBA高速化テクニック」によって処理速度が大幅に改善しました。しかし、Wendy02様にとってはこれでもお茶を濁す程度ということでしたら、なおさらWendy02様の技術力をご教授いただきたいです。 参考になる書籍、サイトなど、ご存知でしたらお教えいただけないでしょうか。 よろしくお願いいたします。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 まず、最初に、VBAは、逐次型のプログラムではありません。コンパイルされ、中間言語として、メモリの中に出力させてから実行されます。exeファイルが出力できないだけです。そうでなければ、実行した時に、その先のコンパイルエラーが発生するはずがありません。 そもそも、何のためにVBAがあるのか、という根本的なところから入らないといけないといけないかもしれませんね。たかが、VBAなのですが、そのVBAは、あくまでも、アプリケーション自体の機能で解決しない個別の問題を自動処理するためなのです。目の前でぱっと結果が出るというなら、Excelそのものを使わないようにすることでしょうね。 ご自身のプログラミングが、非の打ち所がないというなら、後は、C言語に切り替えることですね。それを、COMにすればよいです。そのやり方は、MSDN側ではなく、サポート側に出ていたように思います。 http://oshiete1.goo.ne.jp/qa4360042.html >タスクマネージャで確認したところ1つのコアしか使っていないようです。 何か勘違いされているようです。Excel Applicationの中に、VBAがあるわけで、それが分岐して使えるわけではありません。 速度の速い遅いは、マシン自体の問題ではなく、プログラミングを書いた人の技術的な問題と、Applicationの仕組みを知って、メモリの負荷のかかる部分の回避の仕方です。何に手間を取るか分かっていなければ、VBAは速くすることが出来ません。 同じような質問を過去に何度かしていますが、例えば、配列変数を使いこなせないとしたら、どうやっても、高速化は望めないようにも思います。

center69
質問者

補足

Wendy02様、いつもありがとうございます。 完全に私の勘違いのようですね。 VBAに対しても、Quad Coreに対してもすべてが私の勉強不足だと痛感しております。 複数のプログラム言語を使い分けるということをやっていかなければならないようですね。 たまたま最初に習得した言語がVBAだったので、できることならそれですべて処理できればと思っていたんですが、現実は甘くないようです。 配列変数を使った高速化はできる範囲でやったつもりです。 そのうえでCPUとメモリの性能をアップさせれば処理速度が速くなると考えていたんですが、期待通りの結果が得られなかったことから今回のような質問をさせていただきました。 #1zap35様にも同じことを聞いていますが、VBAでマルチコアを有効に活用するためのテクニックなどご存知でしたらご教授いただければ幸いです。 よろしくお願いいたします。

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.1

同じ質問をされていますね http://oshiete1.goo.ne.jp/kotaeru_reply.php3?q=4363576 >VBAコードをすべてのコアを使って実行することはできないのでしょうか エクセルのVBAは逐次実行型のプログラムです。前のステートメントが実行し終わらないと次のステートメントは実行できません。これではCPUがいくつあってもマルチスレッドで動作する(並列処理する)のは無理です。マルチスレッドを意識したプログラムを書かない限り基本的には無理だと思ってください ただし可能性はあります http://www.microsoft.com/japan/msdn/office/2007/aa730921.aspx VBAでEXCELの関数を使用する場合は、関数の部分はマルチスレッドで動作する可能性があります。 ですからVBAの処理の一部を「Application.ワークシート関数」に置き換えることができれば、多少は速くなるかもしれません。でも効果は限定的ではないかと思います。 また何万行のデータを処理するなら1万行単位に処理をするプログラムを複数起動し、後で各プログラムの実行結果を統合するようなプログラムを実行すればQuad Coreは生きてくると思います。 ともあれMulti CoreのパソコンであってもオプションのスイッチをONにすれば自動的に並列処理ができるものではないのです。処理速度を上げるためにQuad CoreのPCをお買いになったようですが、そこは過度な期待は抱かない方が良いと思いますよ。

center69
質問者

お礼

zap35様、お礼が遅くなり申し訳ありません。 プログラムを分割するという考え方はとても参考になりました。 また、ワークシート関数を用いると可能性があるというのもなるほどと思いました。 マルチスレッドをうまく利用できるように勉強を続けていこうと思います。 これからもよろしくお願いします。

center69
質問者

補足

zap35様、回答ありがとうございます。 Quad Coreに対する私の考え方がそもそも間違っていたようですね。 その点は勉強不足だったので仕方ありません。 >マルチスレッドを意識したプログラムを書かない限り基本的には無理だと思ってください VBAでマルチスレッドを意識したプログラムを記述することはどういうことでしょうか。 「何万行のデータを処理するなら1万行単位に処理をするプログラムを複数起動し、後で各プログラムの実行結果を統合するようなプログラム 」がすなわち、マルチスレッドを意識したプログラムということなのでしょうか。 たとえば、4万行のデータがあったとして、1万行ずつ分割して各1万行を処理するコードを4つ書き、EXCELを4つ起動してそれぞれのコードを実行すれば、4万行を処理する時間が1/4になるという考え方でよろしいのでしょうか。 「Application.ワークシート関数」に置き換えるという方法は検討してみたいと思います。 よろしくお願いいたします。

関連するQ&A

専門家に質問してみよう