
No.1ベストアンサー
- 回答日時:
同じ質問をされていますね
http://oshiete1.goo.ne.jp/kotaeru_reply.php3?q=4 …
>VBAコードをすべてのコアを使って実行することはできないのでしょうか
エクセルのVBAは逐次実行型のプログラムです。前のステートメントが実行し終わらないと次のステートメントは実行できません。これではCPUがいくつあってもマルチスレッドで動作する(並列処理する)のは無理です。マルチスレッドを意識したプログラムを書かない限り基本的には無理だと思ってください
ただし可能性はあります
http://www.microsoft.com/japan/msdn/office/2007/ …
VBAでEXCELの関数を使用する場合は、関数の部分はマルチスレッドで動作する可能性があります。
ですからVBAの処理の一部を「Application.ワークシート関数」に置き換えることができれば、多少は速くなるかもしれません。でも効果は限定的ではないかと思います。
また何万行のデータを処理するなら1万行単位に処理をするプログラムを複数起動し、後で各プログラムの実行結果を統合するようなプログラムを実行すればQuad Coreは生きてくると思います。
ともあれMulti CoreのパソコンであってもオプションのスイッチをONにすれば自動的に並列処理ができるものではないのです。処理速度を上げるためにQuad CoreのPCをお買いになったようですが、そこは過度な期待は抱かない方が良いと思いますよ。
この回答への補足
zap35様、回答ありがとうございます。
Quad Coreに対する私の考え方がそもそも間違っていたようですね。
その点は勉強不足だったので仕方ありません。
>マルチスレッドを意識したプログラムを書かない限り基本的には無理だと思ってください
VBAでマルチスレッドを意識したプログラムを記述することはどういうことでしょうか。
「何万行のデータを処理するなら1万行単位に処理をするプログラムを複数起動し、後で各プログラムの実行結果を統合するようなプログラム
」がすなわち、マルチスレッドを意識したプログラムということなのでしょうか。
たとえば、4万行のデータがあったとして、1万行ずつ分割して各1万行を処理するコードを4つ書き、EXCELを4つ起動してそれぞれのコードを実行すれば、4万行を処理する時間が1/4になるという考え方でよろしいのでしょうか。
「Application.ワークシート関数」に置き換えるという方法は検討してみたいと思います。
よろしくお願いいたします。
zap35様、お礼が遅くなり申し訳ありません。
プログラムを分割するという考え方はとても参考になりました。
また、ワークシート関数を用いると可能性があるというのもなるほどと思いました。
マルチスレッドをうまく利用できるように勉強を続けていこうと思います。
これからもよろしくお願いします。
No.3
- 回答日時:
こんばんは。
>CPUとメモリの性能をアップさせれば処理速度が速くなると考えていたんですが、期待通りの結果が得られなかったことから今回のような質問をさせていただきました。
結論から言うと、私には答えがないというのか、それは、一種の時間のパラドックスだと思うのです。あまり、この話を詳しく書くのは、本題から外れてしまいますが、同じ話を、今から、20年ほど前にしているのを、まだ忘れていません。
今回のご質問も他のご質問を通してみても、具体的な内容はありませんから、それを、あれこれ指示を出すことは不可能だと思いますが、私には、やはり技術的な問題だと思います。ご質問者さんは、かなりVBAに自信がおありのようで、それでハード側のスペックを上げることに目を向けたのかもしれません。
ただ、私も、ある程度のMicrosoft の表計算の癖というのか、コツは心得ていますから、みなさんが不満を感じているようなことは、自分の表の中では一切起こらないのです。Excel 2003 で、今、優に4万行を越えていますが、その処理をまったく遅いとは思いません。
私が、パラドックスというのは、この問題で不毛の議論になった記憶があるのは、パソコンの前で、マクロの終わるのを待つ人には、どんなスピードでも、遅く感じるものだということです。(そうではない、物理的な時間が長いという反論は出るとは思いますが、それは、水掛け論で、今も昔も変わらないのです。)
>VBAでマルチコアを有効に活用するためのテクニックなどご存知でしたらご教授いただければ幸いです。
残念ながら、そういう方向で求め続けても、私としては、不可能だと思います。使っているメモリ(キャッシュ)は、ひとつですから、マルチコアにしても、VBA自体は、ひとつのはずです。
それと、私の目からは、
>VBA高速化テクニック
>http://officetanaka.net/excel/vba/speed/index.htm
少なくとも、こんなお茶を濁す程度の話では、解決しないでしょうね。
この回答への補足
Wendy02様、返事が遅くなり申し訳ありません。
私はVBA初心者です。
自分の書いたコードに自信なんてとてもありません。
私の現時点での技術力では処理速度の向上が見込めないと考えてクアッドコアのPCを購入したわけです(現実は私の誤解のために宝の持ち腐れとなりそうですが)。
>ただ、私も、ある程度のMicrosoft の表計算の癖というのか、コツは心得ていますから、みなさんが不満を感じているようなことは、自分の表の中では一切起こらないのです。
この部分を具体的に知りたいです。
今回の質問の本題からは外れますが、それを勉強すれば処理の遅さを感じない(物理的な時間は別として)ならぜひ教えていただきたいです。
私は「VBA高速化テクニック」によって処理速度が大幅に改善しました。しかし、Wendy02様にとってはこれでもお茶を濁す程度ということでしたら、なおさらWendy02様の技術力をご教授いただきたいです。
参考になる書籍、サイトなど、ご存知でしたらお教えいただけないでしょうか。
よろしくお願いいたします。
Wendy02様、お礼が遅くなり申し訳ありません。
私の追加の質問(疑問)が今回の内容と違うために返事がいただけなかったのだと思い、回答を締め切ることにしました。
疑問は機会を見て質問してみたいと思います。
これからもよろしくお願いします。
No.2
- 回答日時:
こんばんは。
まず、最初に、VBAは、逐次型のプログラムではありません。コンパイルされ、中間言語として、メモリの中に出力させてから実行されます。exeファイルが出力できないだけです。そうでなければ、実行した時に、その先のコンパイルエラーが発生するはずがありません。
そもそも、何のためにVBAがあるのか、という根本的なところから入らないといけないといけないかもしれませんね。たかが、VBAなのですが、そのVBAは、あくまでも、アプリケーション自体の機能で解決しない個別の問題を自動処理するためなのです。目の前でぱっと結果が出るというなら、Excelそのものを使わないようにすることでしょうね。
ご自身のプログラミングが、非の打ち所がないというなら、後は、C言語に切り替えることですね。それを、COMにすればよいです。そのやり方は、MSDN側ではなく、サポート側に出ていたように思います。
http://oshiete1.goo.ne.jp/qa4360042.html
>タスクマネージャで確認したところ1つのコアしか使っていないようです。
何か勘違いされているようです。Excel Applicationの中に、VBAがあるわけで、それが分岐して使えるわけではありません。
速度の速い遅いは、マシン自体の問題ではなく、プログラミングを書いた人の技術的な問題と、Applicationの仕組みを知って、メモリの負荷のかかる部分の回避の仕方です。何に手間を取るか分かっていなければ、VBAは速くすることが出来ません。
同じような質問を過去に何度かしていますが、例えば、配列変数を使いこなせないとしたら、どうやっても、高速化は望めないようにも思います。
この回答への補足
Wendy02様、いつもありがとうございます。
完全に私の勘違いのようですね。
VBAに対しても、Quad Coreに対してもすべてが私の勉強不足だと痛感しております。
複数のプログラム言語を使い分けるということをやっていかなければならないようですね。
たまたま最初に習得した言語がVBAだったので、できることならそれですべて処理できればと思っていたんですが、現実は甘くないようです。
配列変数を使った高速化はできる範囲でやったつもりです。
そのうえでCPUとメモリの性能をアップさせれば処理速度が速くなると考えていたんですが、期待通りの結果が得られなかったことから今回のような質問をさせていただきました。
#1zap35様にも同じことを聞いていますが、VBAでマルチコアを有効に活用するためのテクニックなどご存知でしたらご教授いただければ幸いです。
よろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(Microsoft Office) VBA メール送信済で実行されるはずが、実行されない時があります。 2 2023/02/02 14:05
- Visual Basic(VBA) excel vbaでselenium basic 3 2022/10/02 12:35
- Visual Basic(VBA) VBAコードを張り付け後のエクセルの進め方 2 2023/02/07 18:24
- Excel(エクセル) エクセルのイベントVBAを複数のシートで動かしたい 1 2022/12/07 16:55
- Visual Basic(VBA) VBA For Each 〜 複数条件について 3 2022/10/20 20:05
- Excel(エクセル) vba コンパイル 4 2022/10/27 10:01
- Visual Basic(VBA) エクセルVBA コードが同じでもファイルによって処理速度が大きく変わるのはなぜ 5 2022/11/06 21:34
- Excel(エクセル) エクセルVBA 作業後に選択範囲を解除する方法 5 2023/02/17 07:13
- Visual Basic(VBA) 転記するVBAコードを教えて下さい。 1 2023/03/31 17:22
- Visual Basic(VBA) Outlook VBAについて 1 2023/07/10 12:41
このQ&Aを見た人はこんなQ&Aも見ています
-
VBAの配列サイズとメモリに関して
Visual Basic(VBA)
-
パソコンについて GPUをCPUの代わりに処理出来ないのはなぜですか?GPUにしたら処理か爆速化する
CPU・メモリ・マザーボード
-
VBAのコマンドボタンの文字列の改行方法は?
Visual Basic(VBA)
-
-
4
実行時のCPU使用率を増やしたい
Visual Basic(VBA)
-
5
エクセル 強化するならcpuかメモりか?
CPU・メモリ・マザーボード
-
6
OnTime 使用時のプロシージャへの引数の与え方、その記述方法を教えて下さい。
Visual Basic(VBA)
-
7
array関数で格納した配列の型を変更する
Visual Basic(VBA)
-
8
EXCEL VBA マクロ 実行する度に処理速度がどんどん遅くなる原因が知りたい
Excel(エクセル)
-
9
エクセルVBA コードが同じでもファイルによって処理速度が大きく変わるのはなぜ
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
javascriptで最初のところに戻...
-
JSPの処理の途中で、JavaScript...
-
Excelのマクロ一括実行ができな...
-
VBA SORT Applyでエラー
-
JavaScriptでショートカットキ...
-
onbeforeunload と aタグの hre...
-
JavaScriptで初めてOOPを試した...
-
リクエスト結果が一瞬しか表示...
-
1つのVBAコードをすべてのコア...
-
初心者です。gulpでコンパイル...
-
デザイン時のVisible=Falseは実...
-
条件に一致しない行を全て削除...
-
VBSかVBAでIE操作をする場合、...
-
jspで、javaを呼び出すときの引...
-
VB.Net Imagelistにイメージを...
-
ラベルの色がかわってくれない
-
VBAマクロ、パスがありませんで...
-
if(1){...}とはどういうことで...
-
setTimeoutを使って・・・・。
-
JavaScriptのsetTimeoutについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
JSPの処理の途中で、JavaScript...
-
以下のコードを実行しても、オ...
-
PowerPointで時計表示
-
〔Excel:VBA〕マクロの実行が異...
-
デザイン時のVisible=Falseは実...
-
C#でボタン名を変更しても動く
-
if(1){...}とはどういうことで...
-
1つのVBAコードをすべてのコア...
-
リクエスト結果が一瞬しか表示...
-
VBA ステータスバー DoEvents
-
JavaScriptでショートカットキ...
-
VBA SORT Applyでエラー
-
既存のwebサイトで、ローカルの...
-
innerHTMLなどの反映タイミング
-
VB.netでタイマーがスタートし...
-
JavaScriptで、実行するたび値...
-
ラベルの色がかわってくれない
-
CreateFile、CloseHandleの繰り...
-
初心者です。gulpでコンパイル...
-
jQuery ui Datepicker 明日以降...
おすすめ情報