• ベストアンサー

EXCEL VBAマクロの実行優先度を下げたい

いつもお世話になっております。 EXCEL VBAであるマクロを実行させています。 このマクロは終了するのに丸1日以上掛かるもので、それを実行している間、EXCEL.EXEのCPU使用率が100%になってしまいます。 私の所有するPCパワーが乏しい&所有PCが1台だけのため、このマクロを実行している間、EXCEL以外の他の作業の動作がとても遅くて困っています。 例えば、テキストエディタで文字を打って変換するのに数秒かかったりします。 タスクマネージャでEXCEL.EXEのプロセス優先度を下げることができるのは知っていますが、以前別のマクロでそれを実行して他の作業をやっていた時にEXCELが強制終了された経験があり、私のPCではタスクマネージャによるプロセス優先度の変更はシステムが不安定になることに繋がるようです。 ですので、できることなら、実行中のVBAマクロのみ優先度を下げたいんですが、そのようなことは可能なのでしょうか。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • kenpon24
  • ベストアンサー率64% (66/102)
回答No.4

#2です。 Sleepはループの先頭などに入れます。 確かにSleepを入れることで多少処理に時間はかかるようになるかもしれません。 発行間隔にもよりますが、Sleep(10)とかにすれば一回あたり10ms程度の休止ですから100回コールすれば1秒遅くなることになります。 100万回コールすれば3時間近く遅くなってしまいますね。 設定変更して何回同じ処理を繰り返すのかはわかりませんが、 Sleep(1)でも1000万回も呼べばそれだけ遅くなります。 その意味でIDLE状態のときにはずーと動いてくれるSetPriorityClassのほうがいいかもしれません。安定性については分かりかねますが。 SetPriorityClassについてはここに解説が。 http://yokohama.cool.ne.jp/chokuto/urawaza/api/SetPriorityClass.html 通常に戻すにはこれでOKなはずです。 Call SetPriorityClass(GetCurrentProcess, NORMAL_PRIORITY_CLASS) ただ、1つのPCで長い処理をしながら割りこみで別の処理をしようっていうんだからどちらにしても多少の遅れは発生すると考えられます。 あとは処理を見直すこと。1日流しっぱなしというのは相当な処理量です。 現段階では完璧とは思っているでしょうけど、理解が深まれば削れるところも出てくるかもしれないし、そもそも計算の一部が必要なくなることもありえますので。

center69
質問者

お礼

kenpon24様、丁寧な解説、ありがとうございます。 今回はSetPriorityClassの方でやってみようと思います。 Sleepの方も場合によっては有効な手段だと思いますので、参考にさせて頂きます。 処理の見直しは私も必須だと考えております。 ただ、現時点ではいいアイデアが出てこないので、このままのプログラムでやっていこうと思います。 その間に理解を深めていきたいと考えています。 本当にありがとうございました。

その他の回答 (3)

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.3

直接の回答ではないですが。 >このマクロは終了するのに丸1日以上掛かるもので、 ここの見直しはもう出来ないのかな?と感じました。

center69
質問者

補足

n-jun様、回答ありがとうございます。 残念ながら、これ以上の高速化は難しいようです。 No.2のkenpon24様への補足でも書きましたが、あるプロシージャ内のパラメータ3つを変化させてfor分で繰り返し処理を行わせるマクロでして、あるプロシージャというのはパラメータが決まっていれば、1秒足らずで終了するものです。 パラメータの最適化に丸1日は掛かると言うことです。 VBAの高速化に関しては以前OKWaveで質問をさせて頂いて、回答頂いた内容はすべてやり尽くしたと思っています。

  • kenpon24
  • ベストアンサー率64% (66/102)
回答No.2

おそらく外部からプロセスの優先度を下げると処理が中断されたりして不安定になるんだと思います。 それよりも処理中に適度にSLEEPを入れてみましょう。 CPU使用率100%を回避する方法 http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=35231&forum=7 SLEEPの使い方 http://www.asahi-net.or.jp/~ef2o-inue/api/sub08_01_060.html

center69
質問者

補足

kenpon24様、回答ありがとうございます。 参照URLを見たところ、私のマクロとは違う処理に対してCPU使用率100%を回避しているようです。 私の説明不足でした。 私のマクロは1つのプロシージャ(これ自体は1秒程度で終了)に対して、パラメータが3つ存在して、それらパラメータをfor文で順に変化させて処理をさせるマクロですので、いったんマクロを実行するとずーっと処理を続けていることになります。 定期的にある処理をさせるマクロのCPU使用率とは意味合いが異なるように理解しています。 ですので、ただでさえ時間が掛かるのにSLEEPの分だけ処理時間が増えるという風に理解しましたが、どうでしょうか。 No.1のyuji0401様に提案頂いた方法が私のやりたいことに即しているのではないかと考えております。

  • yuji0401
  • ベストアンサー率9% (28/284)
回答No.1

Private Const IDLE_PRIORITY_CLASS = &H40 Private Declare Function GetCurrentProcess Lib "kernel32" () As Long Private Declare Function SetPriorityClass Lib "kernel32" (ByVal hProcess As Long, ByVal dwPriorityClass As Long) As Long Sub ボタン1_Click() Call SetPriorityClass(GetCurrentProcess, IDLE_PRIORITY_CLASS) '1日かかる処理 End Sub これじゃダメ?

center69
質問者

補足

yuji0401様、回答ありがとうございます。 お恥ずかしい限りですが、上記の内容がさっぱり理解できません。 よろしければ詳しい説明を頂ければと思います。 とりあえず私の理解は別にして、そのままコピペで優先度が「低」になったのはタスクマネージャで確認できましたが、タスクマネージャを使って優先度を「低」にするのと何が違うのでしょうか。 上記コードを追加することでシステムの不安定さを回避しつつ、優先度を下げることができるということなのでしょうか。 試しに処理の繰り返し回数を減らしてすぐに終わるように設定してマクロを実行、終了させたところ、優先度が「低」のままになっているんですが、これを「通常」に戻すにはどうすればいいのでしょうか。 よろしくお願いいたします。

関連するQ&A

  • エクセル マクロ たまに固まる!

    超初心者です。よろしくお願いします。 最近マクロに興味を持ち始めたのですが、たまに実行するとエクセルが固まって閉じられなくなるときがあります。確か「なんとかの情報をなんとかしています。この処理には数分かかります。」みたいなメッセージが出ていたような気がします。 タスクマネージャのアプリケーションからも終了できず、プロセスから終了すると閉じることができました。これは防ぐことのできないトラブルですか?

  • プロセスの優先度設定が戻る

    タスクマネージャのプロセスのタブから、起動しているゲームのexeが 2種類あるのですが、優先度を高めても、再起動後元に戻ってしまいます。わかる方いらっしゃいますでしょうか? 宜しくお願いします。

  • Access2000のVBAでエクセルマクロ実行

    お世話になります。 Access2000のVBAでエクセルのマクロとアクセルのマクロを 交互に実行したいと思っております。 (1)エクセルのマクロ1を実行 (2)アクセスのマクロAを実行 (3)エクセルのマクロ2を実行 と交互に実行したいのです。 下記のサイトなどを参考に試みたのですが、 http://www.nurs.or.jp/~ppoy/access/access/acX005.html (1)を実行している途中に (2)が進んでしまいます。 どのようにすれば、(1)が終わってから(2)と、前の処理が 終わってから次の処理に進むことが出来るのでしょうか? Access2000のVBAから指示をかけたいので、 Access2000のVBAのコードで教えて頂ければと 思います。

  • Windowsのタスク機能からExcelを開きマクロを実行しようと思っても、Excelがアクティブにならず、マクロが実行されない。

    仕事で、指定の時間にExcelで作ったマクロを実行し、帳票を作らなくてはなりません。 PCの前にいない時間に、自動的に実行される必要があります。 マクロはExcelを開くと同時に実行されるよう、「Auto_Open」を使いました。 あとは自動にこのExcelが開けばいいので、こちらで検索したところ、タスク機能を使うとExcelを指定の時間に開くことができると知り、試してみました。 http://oshiete1.goo.ne.jp/qa4146028.html しかし、Excelは開くのですが、アクティブの状態にはならず、マクロが実行されません。 タスク機能ではExcelを開いてマクロを実行することはできないのでしょうか? タスク機能は、ウィザードに従って設定してます。プロパティからは特に設定していません。 どなたか教えてください。 宜しくお願いします。

  • EXCELのマクロとVBAの連続実行について

    EXCELを鋭意勉強中です。 それぞれ独立したマクロとVBAのコードがあるとして これらを組み合わせ自在に連続して実行することは可能でしょうか? マクロの連続実行は Call マクロ() で出来ることは判ったのですが ここにVBAが組み合わさると、どう記述してよいのかさっぱり判りません。 わかる方、よろしくご指導をお願い致します。

  • EXCEL2000 VBA マクロ実行中に他の作業ができないか

    いつもお世話になっております。 EXCEL2000 VBAでマクロ実行中にEXCELで別の作業(表計算したり、別のマクロを実行したり)がやりたいんですが、可能でしょうか。 よろしくお願いいたします。

  • VBAとマクロの違い

    こんばんは。エクセル初心者です。 VBAとマクロの違いについて教えてください。 VBAというのは、プログラミング言語のことで よろしいのでしょうか? そのVBAで記述されたものをマクロとよぶ といったイメージでよろしいのでしょうか? たとえば、あるエクセルにはいってるマクロを 実行する、ということを作業マニュアルに記述 する場合 「○○マクロを実行する」というのが 正しいのでしょうか?それとも 「VBAを実行する」というのが正しいのでしょうか? まったく見当違いのご質問だったら申し訳ありません。 教えてください。

  • エクセルのVBAでマクロ実行中メッセージを表示させたいのです

    たとえばファイルを保存させている間、または、ちょっと時間がかかる(十秒程度ですが)作業を自動実行させている間、「少々お待ちください」のようなメッセージを表示し、終了すれば自動的にメッセージも終了するような表示方法はありますでしょうか?マクロの作業の進み具合(割合など)が表示されるともっといいのですが。 よろしくお願いします。 使用しているエクセルは97、OSはWindows95です。

  • エクセルVBAを実行するとフリーズします。

    タスクマネージャーの数値なのですが異常ですか? コアi7メモリ8Gですが ウィンドウズアップデートをしてから、エクセルVBAを実行するとフリーズします。

  • Excel VBAからAccessマクロを実行したい

    Excel VBAからAccessマクロを実行する方法を知っている人がいましたら 教えてください。 よろしくおねがいしまっす!

専門家に質問してみよう