dポイントプレゼントキャンペーン実施中!

VBAでメインループをずっとループさせ、
データが送られてきたらそれを受け取り処理をするマクロを作っています。

Do
DoEvents
Sleep 1

データが送られてきていれば処理
Loop

という風にしているのですが、このマクロを起動中だと他のエクセルファイルが開けないのです。
他のファイルをダブルクリックしても、起動中のこのマクロのエクセルが前面にくるだけです。
なにか特別な処理をループ中にいれなければならないのでしょうか?

A 回答 (5件)

こんにちは。



#3 で書いていただいて、内容が分かりました。

>マクロの概要としましては、シリアルポートからのデータ受信を待って、
>データが送られてきたらワークシートの表上に受信した値を代入。を繰り返すものです。

やはり、DDE のようですね。その種のものは多いです。

>Do
>DoEvents
>Sleep 1
>
>データが送られてきていれば処理  ←この部分をプロシージャとして取り出す
>Loop


[OnData]プロパティを使ってみてください。

DDE または OLE でリンクされたデータが、Microsoft Excel に届いたときに実行されます。


ActiveSheet.OnData = "マクロ名"

  または、

Application.OnData = "マクロ名"

ただし、入力など待機状態になっていた場合は、マクロが止まってしまうことがあります。
    • good
    • 0

マクロ実行中に、普通に作業をしたいということですか?



> データが送られてきたらそれを受け取り処理

の内容がよくわからないので不向きかもしれませんが、別プロセス
の Excel.exe で実行してみるとか?

0. ご提示のコードを書いたブックを用意 Test.xls
1. Test.xls を開き、マクロ実行
2. 別プロセスの Excel を起動
  -->例)スタートメニューから

以上で、ファイルのダブルクリックでブックは開けました。作業も
できますし、Test.xls 側のマクロは実行され続けてます。

参考までに。

この回答への補足

回答ありがとうございます。
書き込み頂いた方法で、たしかに他のブックを開くことができました。
しかし、なるべくマクロを使用する側には特別な操作をさせないようにしたいのですが。
開発側でこの問題を解決するいい方法はないものでしょうか?

補足日時:2007/08/01 06:43
    • good
    • 0

こんにちは。



>メインループをずっとループさせ、データが送られてきたらそれを受け取り処理をするマクロを作っています

まず、今のコードでは、CPUの負荷が強すぎるはずです。なぜ、Sleep を選んだのか、その理由はお分かりだと思います。ただし、Sleep 1 というのは、負荷を軽減してはいません。
Sleep の引数の「1」は、 1/1000 sec ですから、Excelにおいて、そのタイミングをずらすのは、せいぜい、500 程度です。また、DoEvents は、CPUへの割り込みを許します。

その延長上に、APIタイマーがありますが、しかし、そんなに簡単ではなさそうです。

これは、特殊なイベントの種類だと思います。

>このマクロを起動中だと他のエクセルファイルが開けないのです。
>他のファイルをダブルクリックしても、起動中のこのマクロのエクセルが前面にくるだけです。

DoEvents を使う使わないは別として、そのマクロが動いている状態で、他のブックの作業をしようとして割り込みを入れることが出来たら、場合によっては、マクロ自体が、待機するかエラーを出してしまうような気がします。その前に、ワークシートが重くてしょうがないです。それで、バックグラウンド で動くのは、OnTimeメソッドぐらいしかありません。

もうひとつは、どのようにしてデータが送られてくるか、そのデータの入手方法にもよります。データの入ってくる方法が、私の知っている範囲ですと、DDEですが、その入ってきたときに、実際は、マクロ(COM)が働いていることがあります。そうすると、同時にマクロは動きませんので、片方が死んでしまいます。

そのデータの入手方法はどのようなものですか?
RSS などを使っているのではありませんか?

同じような質問は、ここのカテゴリでずいぶんありますが、回答者側が、同じ環境で動かせないので、成功例は少ないようです。

この回答への補足

回答ありがとうございます。
マクロの概要としましては、シリアルポートからのデータ受信を待って、
データが送られてきたらワークシートの表上に受信した値を代入。を繰り返すものです。
Wendy02様とKenKenSP様の説明で、他のブックが開けない理由は大体理解できました。

補足日時:2007/08/01 06:42
    • good
    • 0

テストするために DoEvent をレムしていました。


外して下さい。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
しかし、試してみましたが変化はありませんでした。

お礼日時:2007/08/01 06:50

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 にプロセスを渡しています。
多分、これで解決か・・・。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!