- 締切済み
ループマクロ起動時に他のエクセルファイルが起動できない
VBAでメインループをずっとループさせ、 データが送られてきたらそれを受け取り処理をするマクロを作っています。 Do DoEvents Sleep 1 データが送られてきていれば処理 Loop という風にしているのですが、このマクロを起動中だと他のエクセルファイルが開けないのです。 他のファイルをダブルクリックしても、起動中のこのマクロのエクセルが前面にくるだけです。 なにか特別な処理をループ中にいれなければならないのでしょうか?
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 #3 で書いていただいて、内容が分かりました。 >マクロの概要としましては、シリアルポートからのデータ受信を待って、 >データが送られてきたらワークシートの表上に受信した値を代入。を繰り返すものです。 やはり、DDE のようですね。その種のものは多いです。 >Do >DoEvents >Sleep 1 > >データが送られてきていれば処理 ←この部分をプロシージャとして取り出す >Loop [OnData]プロパティを使ってみてください。 DDE または OLE でリンクされたデータが、Microsoft Excel に届いたときに実行されます。 ActiveSheet.OnData = "マクロ名" または、 Application.OnData = "マクロ名" ただし、入力など待機状態になっていた場合は、マクロが止まってしまうことがあります。
- KenKen_SP
- ベストアンサー率62% (785/1258)
マクロ実行中に、普通に作業をしたいということですか? > データが送られてきたらそれを受け取り処理 の内容がよくわからないので不向きかもしれませんが、別プロセス の Excel.exe で実行してみるとか? 0. ご提示のコードを書いたブックを用意 Test.xls 1. Test.xls を開き、マクロ実行 2. 別プロセスの Excel を起動 -->例)スタートメニューから 以上で、ファイルのダブルクリックでブックは開けました。作業も できますし、Test.xls 側のマクロは実行され続けてます。 参考までに。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 >メインループをずっとループさせ、データが送られてきたらそれを受け取り処理をするマクロを作っています まず、今のコードでは、CPUの負荷が強すぎるはずです。なぜ、Sleep を選んだのか、その理由はお分かりだと思います。ただし、Sleep 1 というのは、負荷を軽減してはいません。 Sleep の引数の「1」は、 1/1000 sec ですから、Excelにおいて、そのタイミングをずらすのは、せいぜい、500 程度です。また、DoEvents は、CPUへの割り込みを許します。 その延長上に、APIタイマーがありますが、しかし、そんなに簡単ではなさそうです。 これは、特殊なイベントの種類だと思います。 >このマクロを起動中だと他のエクセルファイルが開けないのです。 >他のファイルをダブルクリックしても、起動中のこのマクロのエクセルが前面にくるだけです。 DoEvents を使う使わないは別として、そのマクロが動いている状態で、他のブックの作業をしようとして割り込みを入れることが出来たら、場合によっては、マクロ自体が、待機するかエラーを出してしまうような気がします。その前に、ワークシートが重くてしょうがないです。それで、バックグラウンド で動くのは、OnTimeメソッドぐらいしかありません。 もうひとつは、どのようにしてデータが送られてくるか、そのデータの入手方法にもよります。データの入ってくる方法が、私の知っている範囲ですと、DDEですが、その入ってきたときに、実際は、マクロ(COM)が働いていることがあります。そうすると、同時にマクロは動きませんので、片方が死んでしまいます。 そのデータの入手方法はどのようなものですか? RSS などを使っているのではありませんか? 同じような質問は、ここのカテゴリでずいぶんありますが、回答者側が、同じ環境で動かせないので、成功例は少ないようです。
補足
回答ありがとうございます。 マクロの概要としましては、シリアルポートからのデータ受信を待って、 データが送られてきたらワークシートの表上に受信した値を代入。を繰り返すものです。 Wendy02様とKenKenSP様の説明で、他のブックが開けない理由は大体理解できました。
テストするために DoEvent をレムしていました。 外して下さい。
お礼
回答ありがとうございます。 しかし、試してみましたが変化はありませんでした。
Option Explicit Dim StopNow As Boolean Private Sub CommandButton1_Click() Do DoEvents Pause 1 Loop Until StopNow End Sub Private Sub CommandButton2_Click() StopNow = True End Sub <標準モジュール> Public Sub Pause(ByVal PauseTime As Single) Dim Finish As Single Finish = Timer + PauseTime Do 'DoEvents Loop Until Timer > Finish End Sub Sleep を上の Pause 関数に変更したらどうなりますか? Pause 関数は、待機中も CPU にプロセスを渡しています。 多分、これで解決か・・・。
補足
回答ありがとうございます。 書き込み頂いた方法で、たしかに他のブックを開くことができました。 しかし、なるべくマクロを使用する側には特別な操作をさせないようにしたいのですが。 開発側でこの問題を解決するいい方法はないものでしょうか?