- ベストアンサー
自作プログラムが止まる
- 自作プログラムが稼動中に突然停止してしまう現象が発生しています。原因はXPのOS側の挙動によるものかもしれません。更新情報やウィルスチェックなどが影響している可能性があるため、停止させる方法を探しています。
- 自作のプログラムが稼動中に突然「応答なし」になってしまい、画面右下に「更新の準備ができました」といったバルーンが表示されることがあります。このようなOS側の挙動がプログラムに影響しているのか、それとも他の原因があるのかを知りたいと思っています。
- 自作のプログラムが繰り返し計算を行っている最中に突然停止してしまう問題に直面しています。XPのOSでは更新情報やウィルスチェックなどが自動的に行われるため、それがプログラムに影響している可能性が考えられます。停止させる方法を教えていただきたいです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>プログラムがへたくそなんで、やたらめったら変数宣言しています。 VBAのツール→オプション→「変数の宣言を強制する」にはチェックが入っていますか? モジュールの先頭に「Option Explicit」があれば大丈夫です。 もし、これをやらないとタイプミスで同じ変数だと思っていたものが違うものと解釈されてしまいます。 例えば、 >同じByte変数でもhensu1、hensu2、hensu3・・など。 とありますが、一箇所だけ「ensu1」(hensu1のつもり)としてしまったとした場合に全く別の変数と解釈されてしまうのです。 「Option Explicit」を先頭に書くと、変数を使う前に 必ずDim 変数名 ~といったように定義しないとエラーとなります。 >たとえば1から10の処理を100回繰り返すといった内容で(Do Loopです)、 有限回のループはFor~Nextを使いましょう。 Do...Loopは無限ループに陥る可能性があります。(ので、あまり使わないのが普通です) 「応答なし」で止まってしまう、と言うケースは殆どが無限ループのケースです。 なので、ループの中におまじない「DoEvents」を入れてみてください。 これで、速度は落ちてしまいますが中断が可能になります。 >このようなOS側の挙動が稼動プログラムに影響することはあるのでしょうか? ありますが、ExcelのVBAでは稀だと思います。
その他の回答 (3)
- nac03056
- ベストアンサー率48% (203/419)
アクティブなウインドウが移ることで影響を受けるような作り方をあえてすれば、更新情報の影響を受けるかもしれませんが、普通の内部処理ということであれば、まず関係ないと思います。 do~loop処理での動作回数について、すでにご指摘のあるように、繰り返し回数が決まっていない繰り返し処理に使うためのものですので、繰り返し回数の決まっている処理については、for~nextを使うべきです。また、途中で止まる件については、ループ処理の中でどこか未使用のセルに現在の疑わしい変数の値などを表示するようにしておくと、原因追及の手助けになります。(処理が重くなるので入れる場所には注意が必要です) 変数宣言について、必要ならいくつ使おうと構わないので気にすることはありません。ただ、揃える?ために類似の名前を使用するよう変更をしていますが、変数が見分けにくくなれば当然変数間違いなどのケアレスミスも招きます。紛らわしい名前にするのではなく、それぞれに本人が絶対間違えない名前を付けるべきです。 メモリに関して、VBAで作るプログラム程度で、そう簡単にメモリを2GBも搭載するマシンがパンクすることはないと思います。また、もしそうであれば、ほぼ特定の回数で止まることになると思いますがどうでしょう。何回か再起動後に実行して、「応答なし」の発生にばらつきがあるかどうか知りたいところです。(必ずしも「応答なし」が異常とは限らない点も要注意です) あと、すべて終わるのが2日後とのことで、かなり大規模な分析を行う処理なのかと想像しますが、こういった重い処理のプログラムであれば、架空の小規模なデータを作って動作確認をし、エラーを除いてから本稼働するのが普通です。2日がかりでラン、エラー、デバッグ、リトライは効率が悪いです。
お礼
丁寧なご回答、ありがとうございます。 現在、結果としまして、順調に稼動しております。 皆さんのご指摘を受けてプログラムの整理、Do LoopではなくFor Nextの使用、必要なデータが記載されたworkbookを開いたままで処理していたものを、bookから変数にデータを取り込んでbookは閉じるなどの変更を行いました。 皆さんありがとうございました。助かりました。
- a_lone_Bee
- ベストアンサー率30% (55/182)
メモリ容量は大丈夫ですか?
お礼
ご回答ありがとうございます。そーですよねー、私もメモリが怪しいかもと思っております(素人が生意気でごめんなさい)。 いわゆる「メモリーにごみが残る」という現象がおきているのではないかと・・ Win2000の頃はフリーの「メモリクリーナー」ソフトをDLして使っていたことがあります。XPになっても、そのへん解消されていないのでしょうか。今2G乗せています。 プログラムがへたくそなんで、やたらめったら変数宣言しています。同じByte変数でもhensu1、hensu2、hensu3・・など。できるだけまとめるように改良してみます。
- kokorone
- ベストアンサー率38% (417/1093)
そんな話、聞いてないですね。 バルーン表示が、既存の表示を隠してしまい、操作できない ということはありますが。 また、「更新の準備ができました」「危険にさらされています」 などを放置しているほうが問題で、いつ、外部からの攻撃をうける か、わかりません。 ExelVBAで、所要時間のかかる処理を行うと、マウスポインターは 砂時計になりますが、他の作業はできるはずです。 VBA実行中であれば、ESCキーを押せば、処理は中断します。 作成されたVBAが、間違っていて、終了判定できず、永久ループに なっている可能性が大ですね。 まずは、VBAそのものを確認してください。
お礼
早速のご回答、ありがとうございます。 ネット接続していませんので、更新もウイルスチェックも要らないと考えておりました。 プログラムは、たとえば1から10の処理を100回繰り返すといった内容で(Do Loopです)、これが100回まで到達しないで38回で止まったり53回で止まったりするのです。 やはりプログラム不具合ですかね。
お礼
丁寧なご回答ありがとうございます。 >Do...Loopは無限ループに陥る可能性があります。(ので、あまり使わないのが普通です) ソーなんですか。とりあえずFor Nextに変更して今稼動させています。まーすべて終わるのが2日後ぐらいなので、様子を見てみます。