- ベストアンサー
ノートパソコン マクロ 計算処理速度 Excel2
Excel2007でマクロを使って計算してますが、一回につき4~5秒の時間がかかります。 1000回繰り返すと66~80分かかりまして、もっと時間短縮できないものかと思ってます。 もっと早く出来るようにするには何か方法はありますか?
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
実行中にハードディスクが動くようならメインメモリが足りない合図です。 処理が時々止まるようならスタック領域が足りない合図です。 前者はOSの上限までのメモリを積んでいないなら、RAMを増やすことで解決します。 力業での解決なら、どちらも64ビット版のエクセルを使うことで解決する可能性が高いです。 スタック領域の不足の場合、それをエクセル自身を含めて食いつぶすアプリをなるべく起動しないようにしたり、スタックを積まないようにマクロを見直すことです。 CPUの稼働が100パーセント近くになるならパソコンの性能の問題なので、マクロをやめてプログラム化することを考えてもいいかもしれません。
その他の回答 (8)
- notnot
- ベストアンサー率47% (4900/10358)
VBAコードを変更しないで速くするには、 ・メモリが4GBとかであれば8GB以上に増設する。 ・CPUが非力な場合(Corei3とかPentiumとかCeleronとかAtomとか)はPCを買い換える。 VBAコードを見直してチューニングすればもっと速くなる可能性もあります。
- totoro_8681
- ベストアンサー率24% (275/1129)
パソコンの性能が低いのでは? ノートパソコンの拡張性に乏しいので メモリ追加 HDDからSSD交換が一般的です (パソコンが古いと恩赦が少ないからお勧めしません) 高負荷&長時間で使えば パソコンも無理をします 当然 ノートパソコン内に熱が溜まり 排気熱&排気音が大きくなりますね ハード的には 拡張性の多いパソコンショップ製のデスクトップに変えたらどうですか? ソフトを快適に使うには 追加パーツを組みやすいパソコンが良いと思います
お礼
ありがとうございました。
- kkkkkm
- ベストアンサー率66% (1719/2589)
> 早くなればなるほどパソコンは熱くなったりしますか? ごめんなさいそのあたりはよくわかりませんが、早くても遅くてもパソコンは同じだけ一生懸命やっていると思いますので同じかなぁと…思うだけですが…。 あと、たしか計算式があってその結果をコピーしていたと思います。その部分をコピーしたシートでするように計算式をマクロで入れて(マクロで計算をするのでも)コピーが全て終わって最後に計算をするようにすれば一段と早くなるとは思います。
お礼
ありがとうございました。
- unokwave
- ベストアンサー率58% (966/1654)
目的がわからないので的外れかも知れませんが、乱数を書き込むセルの代わりに二次元配列を使えないのですか? 他にはセルへの乱数書き込みが必要ならせめて dim cscreen as boolean cscreen = Application.ScreenUpdating dim cevents as boolean cevents = Application.EnableEvents dim ccalc as integer ccalc = Application.Calculation Application.ScreenUpdating = False Application.EnableEvents = False Application.Calculation = xlManual 処理 Application.ScreenUpdating = cscreen Application.EnableEvents = cevents Application.Calculation = ccalc くらいはやった方が良いでしょう。
お礼
すみません。まだまだ駆け出しなんでちょっと解らないです。でも、手の差し伸べ感謝します。ありがとうございました。
- kkkkkm
- ベストアンサー率66% (1719/2589)
CPUでも早くなると思いますが、以前の 1~10の数字を乱数で(U6:U15000)に表示 の一部を書き替えると c.Value = WorksheetFunction.RandBetween(1, 10) を Set Sh2 = Sheets("Sheet5") の後に Randomize を付けくわえて c.Value = Int((10 - 1 + 1) * Rnd + 1) 'Int((最大値 - 最小値 + 1) * Rnd + 最小値) なので c.Value = Int(10 * Rnd + 1) にすると乱数で表示にかかる時間が約60%になると思います。 コードを以下に書き換えると約15%になると思います。 どちらもこちらでのテスト値ですが… Typeが面倒ですよね…コピペとかできない環境なのでしょうか。 Dim buff() As Integer, LastColumn As Long, i As Long, MyCount As Long Dim minRnd As Integer, maxRnd As Integer Dim Sh1 As Worksheet, Sh2 As Worksheet Set Sh1 = Sheets("Sheet1") 'U6:U15000に乱数を表示するシート Set Sh2 = Sheets("Sheet5") MyCount = Sh1.Range("U15000").Row - Sh1.Range("U6").Row ReDim buff(MyCount) Randomize minRnd = 1 maxRnd = 10 For i = 0 To MyCount buff(i) = Int((maxRnd - minRnd + 1) * Rnd + minRnd) Next LastColumn = Sh2.Cells(6, Columns.Count).End(xlToLeft).Column + 1 If LastColumn < Columns("C").Column Then LastColumn = Columns("C").Column End If Sh1.Range(Sh1.Cells(6, "U"), Sh1.Cells(15000, "U")).Value = WorksheetFunction.Transpose(buff) Sh2.Range(Sh2.Cells(6, LastColumn), Sh2.Cells(15000, LastColumn)).Value = WorksheetFunction.Transpose(buff) Sh2.Cells(4, LastColumn).Value = Sh1.Cells(4, "AA").Value Set Sh1 = Nothing Set Sh2 = Nothing
お礼
18分も早くしあがりました。早くなればなるほどパソコンは熱くなったりしますか? 早くなった分パソコンの音が賑やかに感じます。
補足
凄い!一回2.5秒になりました。ちょっと600回試してみます。
- kon555
- ベストアンサー率51% (1842/3559)
計算の内容次第で回答が完全に変わるので、一律で『早くする方法』はありません。 例えば無駄な計算が多いとか、セルに頻繁に書き込んでいるとか、selectを多用しているとか、そうした原因を解明しない事には対策は不可能です。 ちなみにCPUやメモリといったPCスペック面での改善は、コードの内容次第ではさほど効果が出ない事も多いですよ。 (演算以外の部分で時間がかかっているコードなど)
お礼
やっぱり。色々聞いてからにした方が良さそうですね。ありがとうございました。
- kkkkkm
- ベストアンサー率66% (1719/2589)
セルに書き込むという動作を頻繁にしているのでしたら、そこのところを変更すす必要があります。
お礼
こんにちは、kkkkkmさん。この前はありがとうございます。 今はあまり合わさったマクロソースを色々触りたくない気がしますw もっと早く出来たら面白いのになぁと思いながら別のことをもしながら見守ってる状態です。 CPU等をかえたら早くなることってあるんですかね。 この前の乱数の件の続きで、10000回の計算をあっというまに出来たら良いのになぁと思ってます。
- emaxemax
- ベストアンサー率35% (44/124)
その時間がかかるコードを見せてもらえないと良いアドバイスはもらえないんじゃないかと思います。
お礼
それ以外はCPUの変換とかになりますか。
お礼
ありがとうございました。