• 締切済み

Excelのマクロエラーで警報を出す方法

お世話になります。Excelのマクロがなんらかの原因で停止した時、 警報を出すことができないでしょうか? マクロが止まるのですから、マクロでは無理なのだと思いますが、 マクロがエラーで停止していることを、なんらかの形で警告することはできないでしょうか。 自動運転させているExcelなので、止まったことに気付かないトラブルを回避する目的です。

みんなの回答

回答No.4

こんにちは。 すみません、ちょっと突っ込んだ内容になってしまいました。 >株のトレードシステムを作っています。 実は、昔は、つとめて、この質問に回答してきたのです。 こちらも事情は分かっていながら、私には力不足で、隔靴掻痒の思いが強いのです。 もう、この手の質問は、何度も回答してきているのですが、完璧な解決は見ていないのです。 そして、今は、ここの掲示板というよりも、Excel全体から遠ざかってしまいました。 ただ、状況は、想像通りだったと思っています。 そして、クラッシュ(開いたExcelが消えてしまう)場合は、Windowsのプログラムに割り込んだからだと思っていますので、そう簡単にことではありません。 ただ、状況的には、どういうものを使っているとかの仕組みは知っています。 >プロにお願いするにしても、どこに頼んだらいいのか、判断できないのもネックです。 もうずいぶん前で、私が掲示板に頻繁に書いていた頃、ネット内で、たまたま見た程度で、現在はどうなっているのか知りません。その手の専門家と称する人が、どの程度か分かりませんが、お金を取られるようでした。本来、RSSの元のシステムを作ったのが、日本人ではないようで、どうにも処置ができないものがあります。 Microsoft 本社の方も、Excel 97に、DDEの仕組みから説明しただけで、その後、何のコメントもしていません。DDEからについては、私は、VBAでは作ったことがあるし、DDEは、そもそもスピードが遅いので、解決も何もあるわけではありませんし、今は時代が違いますから、話にならないです。 >証券会社のRSS(リアルタイム・スプレッド・シート)データが「遅れる」のが、マクロが止まる原因です。 マクロ自体は、ご自身でお作りになりましたか? 簡単なおまじないの一つに、ループの中で、DoEvents というおまじないを入れることで、PCのCPUが100%になるのを防ぎます。たぶん、ご存知でしょうね。 もうひとつは、 Private Declare Sub Sleep Lib "kernel32" (ByVal dlliseconds As Long) とモジュールの先頭(プロシージャ外)に入れておいて、プロシージャの中で、 Sleep 1000 '1000/1000秒 = 1秒 と取得するタイミングを少しずらす方法があります。なぜ、Wait を使わないかというと、上記の方が、Excel 自体への負担が軽いからです。 それでダメなら、分岐させます。Error トラップやErr.Raised で、回避させる方法もあります。 たぶん、取得するプログラム(ActiveX コントロール等)にも、調べればコマンドが存在しているはずですが、分かりません。 >どうしても不確定なトラブルが残ってしまい、頭を抱えています。 一つの提案として、あまり値段の高いPCでなくて、PCの中には、ほとんどExcelだけで、他には基本システムぐらいしか入れていないものをお使いになったらどうでしょうか。セキュリティソフトも、MSのもの(Security Essentials)にします。私は、一応、民間のPCのインストラクターの資格を持っているのですが、その時からずっと教わってきたPCの師匠なら、たぶん、そんな発想をするような気がします。 直接の回答ではないので、申し訳ありません。 何かあれば、この先も考えてみます。これだけは、私も譲れないものがあります。

OTTO-TTO
質問者

補足

ありがとうございます。 >Excel全体から遠ざかって それは大変残念です。 >クラッシュ(開いたExcelが消えてしまう)場合 その症状は低スペックのPCで発生しましたが、 開発環境では発生したことがないので、 運用中にいじらなければOKな感じです。 >どういうものを使っているとかの仕組み はい。楽天と岡三ですね。 >日本人ではない それは初耳です。RSSの受信問題ではあるのですが、 証券側のシステム問題であろうと思われるので、 こちら側の対策がなかなか難しい気がしています。 >DDEは、そもそもスピードが遅い こちらのシステムが必要とするデータの送受信ぐらいでしたら、 遅延は感じていないのですが、あるはずのデータが送られてこないのは、 こちら側の問題なのでしょうか? 通常は2秒程度で返ってきますが、大量約定時に5秒程度かかるようです。 送られてこないわけではないのですが、この幅がややこしい。 >ご自身でお作りに 実は友人に頼んでいます。マクロ内部はわかっていません。 私自身はトレーダーとして様々なリクエストを出しています。 >CPUが100%になるのを防ぎ 開発中のシステムでCPUが100%になる問題は発生していません。 約定結果がない瞬間に決済注文を出そうとして、コロッと落ちてます。 >基本システムぐらいしか入れていないもの そうしています。Excelの単独運用です。 開発途中の古いバージョンや最新版などを様々な環境でテスト運用しています。 XP、7、8いずれの問題も、約定結果が返ってこない問題だけです。 >何かあれば、この先も考えて ありがとうございます。ここを友人に見てもらって、 解決方法が見つからなかったら、引き続きアドバイスをお願いいたします。

回答No.3

#2の回答者です。 >値を読み取って次のマクロを実行するのですが、 >値が瞬時に戻ってこない場合があるのです。 >ので、カラの値で実行するからエラーになるんだと思います。 もし、これが事実なら、簡単な処置で済むはずです。分岐するだけですから。 #2の補足で、「どこで、どういうエラー」で、直接、回答はしていないようですから、 はっきり特定されていないのではありませんか? 戻らない値なら、「0」になるはずです。何もないオブジェクトでしたら、 If objAA is Nothing Then 終了処理 でいいはずです。 また、On Error Goto や On Error Resume Next でもいいはずです。 以下は、私の推測が混じった回答です。 前回の質問内容: http://okwave.jp/qa/q8805651.html >リアルタイムでデータ受信するプログラムを動かしています。 私が、ActiveX コントロールで、リアルタイムのものは無料ではなかったので、試したことはありません。前の質問者さんたちも、経験はないようです。この手の質問は、その本体の存在を隠して、情報が小出しにされてしまう傾向があります。私の昔の記憶では、ネット内には、その手のツールの専門の人がいたはずですが、質問するにも有償だった覚えがあります。メーカーや代理店側が回答してくれればよいのですが、個別のマクロについての回答はすはずがありません。 要するに、リアルタイムでデータを受信する時に、割り込みが入るのではないでしょうか。 だから、割り込みの原因が分かればよいのですが、例えば、セキュリティ・ツールなどでは、万が一が発生しますから、無人でセキュリティなしで動かすことはやめたほうがよいでしょう。 >その範囲をまとめて移動させようとするとExcelが落ちます。再起動等しても必ず落ちます。 どうやら、内容は、外部のActiveX コントロールから、値を取得しているようです。だから、単純に、その値が返らないからクラッシュ(話の様子から、フリーズではない)というものではありません。ただし、前回の人の回答にもあったように、バイナリファイルのままで使うのは賛成できません。ハングやフリーズと、クラッシュでは、大きく原因が違います。 >低スペックPCでこの操作をすると、Excelが落ちるという症状は一般的にあるのでしょうか? 基本的には、外部ツールを使わない限りは、クラッシュすることはありえません。表面の値だけ取得して、中身の関数そのものを削除しないと、一端使用すると、すでに、コントロールとの間に関数の位置が決定されているので、移動するとハングまたはクラッシュするのだと思います。 >関数や条件付き書式が多く、マクロも常時動いている仕様で、けっこう重いファイルだと思います。 4×8セル程度で、重いファイルということ自体に、疑問を感じます。別の外部ツールから、関数を利用しているような気がします。ただ、条件付き書式は、意外に扱いにくいです。代わりにマクロでも可能なはずです。 今の段階の内容では、#2で回答したものと大きく変わりはありません。正常終了していないために、その出力が出来ていないというプログラムをタスクに置くのが手っ取り早いような気がします。

OTTO-TTO
質問者

補足

度々ありがとうございます。 >はっきり特定されていないのではありませんか? なにがカラなのかは特定できています。 カラのときとカラでないときがランダムで、しかも、 カラだったとしても処理を中断せず、 カラが埋まるまで待つ方法がわからないのです。たぶん。 >この手の質問は、その本体の存在を隠して、情報が小出しにされてしまう傾向があります。 申し訳ありません。仰る通りだと思います。株のトレードシステムを作っています。 金儲けのための質問をここで(無償で)することに躊躇しているのと、 公の場で中身を詳しく話しづらい、というのが原因だと思います。 有償でお願いしたいぐらいなのですが、ここでお金を払う方法もありませんし、 プロにお願いするにしても、どこに頼んだらいいのか、判断できないのもネックです。 >リアルタイムでデータを受信する時に、割り込みが入る 単に株価を受信するだけなら、トラブルはほとんどないのですが、 発注から決済までの全自動運転を目指しています。 具体的には、Excelで発生させたトリガーによって「新規発注」を出し、 それが市場で「約定」するわけですが、その「約定結果」をExcelに戻す、 証券会社のRSS(リアルタイム・スプレッド・シート)データが「遅れる」のが、 マクロが止まる原因です。 ほとんどの場合は遅れないのですが、市場での取引が大量になると、 戻りのRSSデータが遅れます。 そこで、マクロが止まったら警告を出したい。止まっても復帰させたい。 という質問になるのです。 ですから、約定結果をマクロが拾うとき、 遅れるのを見越してマクロを組めばいいのだと思いますが、 いつ新規発注になるか分からず、 従って常に約定結果を見に行っているマクロになってしまうため、 動作が重くなる問題があります。 全自動運転をしないということなら、ほとんど完成しているのですが、 大詰めのこの動作で挫折している方は多いのではないかと思います。 証券会社は環境だけは用意していますが、 「Excelから手動で発注が出せる」以外のサポートは一切してくれません。 申し訳ありません。長々と補足させていただきました。 かれこれ1年半もこのシステムに取り組んでいるのですが、 どうしても不確定なトラブルが残ってしまい、頭を抱えています。 要するに、「つきっきり」なら問題ではないのですが・・・

回答No.2

こんにちは。 #1の方とは、話が一部重複して申し訳ありません。 >起動も自動のExcelのため「別のインスタンスのExcel」 つまり、タスクで自動運転しているということですね。 一般的には、On Error Goto [ErrHander] で、その後に、ジャンプ先の ErrHandler の中に、MsgBox Err.Number &": " & Err.Description で、何が発生しているか見ていく方法ですね。それを、Textファイルに出す方法はあります。 しかし、そういう単純なことではなく、外部オブジェクトの中で、フリーズなどしたら、Excel側ではチェックは難しいでしょうね。どこで、どういうエラー(フリーズ)が発生するか、ということも加味されます。 つまり、ExcelのVBAのマクロ側が、外部オブジェクトの戻り値を待っている状態がずっと続いている間は、VBA側はエラーではありません。むろん、フリーズした信号が取れれば良いのですが、期待はできません。マクロが停止状態になったら、いわゆる「待機状態」といって、そのマクロをVBA側からは自動処理はできません。 結論 一つは、エラーがどこで発生しているかです。それによって対処法を考えるわけです。 二つ目は、回避できない場合、正常終了したファイル、また、マクロが終わっていないことを、VBSを使ったタスクで、定期的に監視させるようにするしかないと思います。できれば、タスク自体を、ExcelのVBA側から処理すればよいと思います。そうすれば、マクロが起動した時点で、別途 VBSのタスクが働き始めます。 以下は、VBSのコードではありませんが、WMIは、VBSは可能ですから、書き換えは可能はずです。 http://www.wmifun.net/sample/vb6/win32_scheduledjob_b.html 手順: マクロ起動時に、前回の作業Textファイル(もしくは、iniファイル)を削除 → 終了時に作業後Textファイルを生成 → 一定時間(タスクまたは、WSH側のSleepを使って)に、そのTextファイルが生成されているかチェック 具体例については、前のPC側にはタスクの使い方など実際のプログラムが残っていたように思いますが、今、故障していて、起動できるかも不安な状態ですし、最近、VBAなどは書いておりませんので、当面は、割愛させてください。

OTTO-TTO
質問者

補足

ありがとうございます。 >つまり、タスクで自動運転 はいそうです。 >どこで、どういうエラー はい。 >外部オブジェクトの戻り値を待っている たぶん、待ってないのが問題なんだと思います。 値を読み取って次のマクロを実行するのですが、 値が瞬時に戻ってこない場合があるのです。 ので、カラの値で実行するからエラーになるんだと思います。 ただこれ、瞬時に値が戻って来るのが通常なので、 どうしたもんか悩んでいます。

回答No.1

大半のエラーはエラートラップして対処できそうですけど? http://support.microsoft.com/kb/146864/ja Excelが固まったり落ちたり、トラッピング不可のエラーのことを考えてみました。 そのマクロ中にテキストファイルに書き込む処理を追加。 内容はテキトーに Now とか マクロ名とかにしときます。 で、 別途、VBS や別のインスタンスのExcelやWordのVBAで テキストファイルの更新具合を監視。 テキトーな時間が過ぎても更新されないなら Beep音を鳴らすとか、メールを送信するとか出来るのでは? アイディアだけでゴメン。

OTTO-TTO
質問者

補足

ありがとうございます。エラートラップを検討させていただきます。 起動も自動のExcelのため「別のインスタンスのExcel」を二重起動させるとデータ送受信に不具合が出ると思います。 「シフトを押しながらエクセル起動」で起動したエクセルでテキストを監視するなら問題ないのですが、これをタスクで実行する方法はあるでしょうか? 重ねての質問で申し訳ありません。

関連するQ&A

専門家に質問してみよう