- ベストアンサー
Excelの処理速度が上がらない?CPUを変えても改善されない問題
- Excelでマクロを組んでいるが、CPUを変えても処理速度が上がらない問題に直面している。
- 以前はWindows7 32bitのCore 2 DUOでExcel2010を使用していたが、現在はWindows10 64bitのCore i-5 8500でExcel2019を使用している。
- しかし、新しい環境でも処理速度に変化がなく、逆に遅くなっているように感じる。マクロの組み方に問題があるのかもしれない。皆さんの意見を聞かせてほしい。
- みんなの回答 (15)
- 専門家の回答
質問者が選んだベストアンサー
多分ですが、記述に問題があるかと思います。 CPU速度や最新版(改良版)の恩恵で「Excelの起動速度は飛躍的に変わります」。計算速度とか処理速度ですが、残念ですが、思った通りにはいきません。 CPUは知っての通り1コアより2コア4コアとコア数分効果がある場合もあります。その分ハードウェアでの排熱などがなされないといけませんが、、。またスレッドも同じでマルチタスク環境では複数スレッドに分けた方が効率は良いです。 起動時間も、アドインを追加して起動してみればCPUの差は歴然と思います。 同じExcelバージョンでないので比較になりませんが、同じなら差は出ます。 ※Excel2019/オプション/アドイン/設定/ExcelアドインやCOMアドインなど、、 1000行~10000行くらいなら問題ないはずですが、記述の際に何か間違いとか何かしらが問題になっているかもしれません。※コピペしたら、エラーになったとか、または逆も。 何がと言われると困りますが、見た目では分からないこともあります。 1度ご確認を。
その他の回答 (14)
- nemo3
- ベストアンサー率75% (235/312)
MFFマクロの超絶低速度動作を改善しました http://takobutsu.cocolog-nifty.com/blog/2018/08/mff-a53d.html というブログがあるんですが、これによると「Excel2013以降はVBAが超絶に遅い」らしいですね。 Excel2007では「極めて迅速に」動いていたマクロがExcel2013では2時間掛かったそうで。 で、「Copyメソッドでの処理をやめて、式の代入でデータを移すようにした」ところ「1分程度で終わる」ようになったらしいんですがExcelも、ましてやマクロなどチンプンカンプンな自分にはなんの事やらさっぱりわかりません。(^_^; ですが何かの参考になるかもしれないと思ったので紹介しておきます。
お礼
ご回答いただきありがとうございます。 さすがに2時間から1分の差は拘束時間のコストを考えても認められない範囲ですね。。 ありがとうございます。参考になります。
- TOMONARI SEIJI(@seijiadb07)
- ベストアンサー率21% (119/543)
お役には立てる情報量はないですが、記述に問題があるか、検索範囲みたいなのが異様に長いとか沢山あるとかの場合、やたらと時間だけかかる場合があります。そういう場合やっつけですが、、検索範囲を短いしたり限定的にしてみたりします。原因が分かるかもしれません。
お礼
ご回答いただきありがとうございます。 やはり記述に問題がある可能性は考えられますよね、、、検索範囲を短くしたり、内容を変えられる事が出来れば試してみようと思います。 ただ、今回 CPUの処理速度が上がったところと関係あるかは不透明になりますよね。
- yakan9
- ベストアンサー率54% (2247/4134)
いろいろなことが考えられます。 リソース不足、搭載メモリ量が少ないとか、ディスクの空き容量が少ないとか、 下記の悪戯でないことをまず調べてみるとか、 まだいろいろありますがまずはこの2点を調査され、補足されたし。 下記の悪戯の可能性はないかです。 「高速スタートアップ モード」に設定していないかです。 既定値で、設定されていますので外すことをお勧めします。 もしそうであれば、ただちに無効にしてください。 確認手順は、下記の通りです。 コントロールパネル→電源オプション→電源ボタンの動作の選択→ 現在利用可能ではない設定を変更します→「高速スタートアップを有効にする(推奨)」 のチェックを外す。 シャットダウンか、再起動をします。 もし再現しなければ、下記の理由で、このままの状態で運用されることを強くお勧めします。 この、「高速スタートアップ」にチェックを入れていると、「シャットダウン」で終わらせても、 パソコンを完全にクローズ処理しないためにいろいろなとんでもないことが発生します。 この高速スタートアップ指定は、「百害あって一利なし」ということで、 外しておくことを強くお勧めします。 現象的には、たくさんの事例があり、何が不具合として出てくるのか分かりません。 今回とよく似た現象は下記があります。 エクセルのマクロの動きが鈍いです https://okwave.jp/qa/q9714394.html
- masnoske
- ベストアンサー率35% (67/190)
どのような動作をしているマクロでしょうか。 時間がかかる処理 1. 計算結果やコピペでセルに大量に書き込む処理では、画面の更新に時間が掛かるので、 処理開始直後に Application.ScreenUpdating = False 処理終了直前に Application.ScreenUpdating = True を入れる。 時間がかかる処理 2. セルに大量の計算式や条件付き書式が設定されている場合は、セルの値が変更される度に再計算が行われるので、 処理前に計算方法を手動にしてから処理を行い、処理後に計算方法を自動に戻す事で再計算の時間を減らせる。 ただし、計算式の結果を使ってさらに処理をするような場合は、間違った結果になってしまうので、コードの適切な場所でマクロで手動・自動を切り替える。 この場合は再計算が都度入るので、思うほど速度向上しないかも知れません。 その場合は、セルに計算式を入れるのではなく、マクロ側で計算して値を返すように変更する必要があります。 ちなみに、同じ計算処理をするのなら、VBA関数よりもワークシート関数ほうが圧倒的に速いので Application.WorksheetFunction を使ったほうが良いです。 時間がかかる処理 3. For~Next のネストが深いと、ループを回すだけで10分ぐらい掛かる場合もある。 マシンのスペックに依存しますが、スペックを上げたところで、そもそも時間が掛かる処理なので体感的には変化がないかも知れません。
- 回答 お願い(@74te)
- ベストアンサー率43% (369/858)
以前のパソコンは処分されましたか? あるのなら、両方のパソコンに同じベンチマークソフトを入れてチェックして、比べてみたらいかがでしょうか? ないなら今あるパソコンだけに入れて。 ベンチマークソフトは使った事がないので、オススメはありませんが、ちょっと検索したら沢山出てきました。 以下から良さげなものを見繕って使ってみてはいかがでしょうか? https://search.vector.co.jp/vsearch/vsearch.php?key=%A5%D9%A5%F3%A5%C1%A5%DE%A1%BC%A5%AF%A5%BD%A5%D5%A5%C8&kanji=euc
お礼
ご回答いただきありがとうございます。 以前のパソコンは処分してしまいました。ただ、ベンチマークですとCPU勝負になるのかなと思っていますので、やはりCore i-5に軍配が上がるのかなと思いました。。おっしゃるとおり、以前のパソコンがないので、切り離しながら原因追及というものが出来ないのです。
- Eureka_
- ベストアンサー率41% (5083/12280)
>確認は難しいです いや、タスクバーで右クリック→「タスクマネージャー」→「パフォーマンス」タブを開いてExcelのウインドウの隣に置いておく(なんなら処理中に起動したっていい)だけなんですけども…
お礼
回答ありがとうございます。 人間のパワーバランスというところです、使っている者は別の者ですので、パソコンを借りて確認する事は控えたいのです。 今回は 検証が難しく皆さんの考えを伺いたい質問になりました。よろしくお願いいたします。
- m5048172715
- ベストアンサー率16% (860/5261)
エクセルVBAはマルチスレッドによる並列処理をサポートしていない。 そこに以下のウェブログが登場しました。 https://excel-ubara.com/vba_class/VBA_CLASS_06.html そうなってしまうのか。
お礼
ご回答いただきありがとうございます。 VBAで並列処理させるのは、こんなにもハードルの高い事なのですね。。 参考になりました、ありがとうございます。
- f272
- ベストアンサー率46% (8526/18248)
#4です。 > 計算時間が数十分かかるようなのです。 > Excelの計算結果だすマクロのようなのですが その程度のマクロで数十分ですか?にわかには信じられません。 以下のマクロで処理1と2,処理3と4と5でどの程度処理時間が違うと思いますか?マクロの作り方次第では速度は数十倍になりますよ。 Declare Function timeGetTime Lib "winmm.dll" () As Long Sub aaa() n = 100000 t1 = timeGetTime '処理1:A列に代入 For i = 1 To n Cells(i, 1) = i Next i t2 = timeGetTime '処理2:配列を使ってB列に代入 ReDim bb(1 To n, 1 To 1) For i = 1 To n bb(i, 1) = i Next i Range("B1:B" & n) = bb t3 = timeGetTime '処理3:A列からC列に代入 For i = 1 To n Cells(i, 3) = Cells(i, 1) Next i t4 = timeGetTime '処理4:A列から配列を使ってD列に代入 ReDim dd(1 To n, 1 To 1) For i = 1 To n dd(i, 1) = Cells(i, 1) Next i Range("D1:D" & n) = dd t5 = timeGetTime '処理5:A列から配列を使ってE列に代入 ReDim ee(1 To n, 1 To 1) ee = Range("A1:A" & n) Range("E1:E" & n) = ee t6 = timeGetTime Debug.Print t2 - t1, t3 - t2, t4 - t3, t5 - t4, t6 - t5 End Sub
お礼
ご回答いただきありがとうございます。 VBAを書いているわけではなく、「マクロの記録」で作成されたマクロかと思います。 処理1 から 処理5 までがひとつのマクロに組まれているようなのですが。ごめんなさい、こういった所は素人でf272さんの想定外のご質問かもしれませんが。 マクロの作られ方によって時間がすごく変わることはニュアンスとして承知はしております。
- m5048172715
- ベストアンサー率16% (860/5261)
他の条件が同じだったら、1コアの処理能力が大きくなった方がVBA速くなりそうです。 もしVBAを本気で早く終わらせたかったら、スレッドを複数に別けるようにコーディングするかなあ。
お礼
ご回答いただきありがとうございます。 追加のご質問で申し訳ございませんが、スレッドを複数に分けるようにコーディング との事ですが、「マクロの記録」でやるようなマクロですと ほぼ単一のスレッドでしょうか。 VBAですら、そんなに詳しくありません。なんとなくニュアンスでイメージを捉えている感じですので、教えて頂けると助かります。
- Eureka_
- ベストアンサー率41% (5083/12280)
>HDDも遅いという事は無いかと思っています。 この10年、あんまり速くもなっていませんけどね。こと細かいデータの読み書きにおいては特に。 タスクマネージャーのパフォーマンスタブでCPU、メモリの使用率を見てみては? おそらくデータ待ちで全然動いてないと思いますが。いくらCPUが速かろうと、処理すべきデータがきちんと供給されないでは何もできません。
お礼
ご回答いただきありがとうございます。 使用時のCPU、メモリ使用率ですが 確認は難しいです。(人間のパワーバランスとして捉えて頂けると嬉しいです) CPUが上がっている分、キャッシュも上がっているので、全体的な処理速度は上がっているのでは無いかなと思っていました。 離れたところから状況をみてみると、メモリ使用率はそんなに高くないのではないかなと思っておりました。
- 1
- 2
お礼
ご回答を頂きありがとうございます。 丁寧に説明頂きありがとうございます。複数スレッドに分けるVBAとした方が良い事や、起動時に差が発揮される事など改めて知ることもあり助かりました。