Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
  • ベストアンサー

ExcelにおけるDDEデータのイベントプロシージャについて

DEEをつかって、Excelのセルにデータを出力しています。 そのセルのデータが変更された時に、自動でそのデータをコピーし別のシートにペーストしたいのですが、よろしければ助言をお願い致します。 イベントプロシージャの(worksheet_change)で試してみたのですが、任意でセルの値を変えないとプロシージャが動かず行き詰りました。 VBAも超初心者なのですが、よろしくお願い致します。

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。Wendy02です。 返事が遅くなりました。あれから、折に触れて考えてみました。 以下のサイトにある方法が出来るのではないか、と思いました。(ドイツ語ですから、マクロだけをみてください) http://www.herber.de/forum/archiv/24to28/t24099.htm Auto_Open で、Activeなシートを、OnData で監視させます。(お分かりだと思いますが、全部、標準モジュールにおきます)そこに、DDEのデータが入ってくると、その設定された、マクロが動くという仕掛けです。(まだ、このメソッドは生きていると思います) ActiveSheet.OnData = "Update"  一応、OnDataのHelpを置いておきます。 # 機能 Ver5 マクロヘルプより DDE または OLE でリンクされたデータが、Microsoft Excel に届いたときに実行されるプロシージャの名前を返します。ここで設定したプロシージャが実行されるのは、他のアプリケーションからデータが届いたときだけです。値の取得および設定ともに可能です。

kkbby
質問者

お礼

Wendy様、こんばんは 初めに、時間を割いての検討に心から感謝します。 この度ご指摘いただきました”OnData"メッソドですが、見事にマッチいたしました。 隠しメッソドとしてこんなものがあるなんて、まったくわかりませんでした。 これで先に進むことができます。本当にありがとうございました。 また何かの機会にお会いできるのを、楽しみにしています。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんにちは。Wendy02です。 >DDEは他のjavaアプリケーションから、データを取り込んでいます。 そういう方法もあるのですね。知りませんでした。 Javaからなら、OLEもできるような気がしますが・・・。 以前の方の話を聞くと、DDEで、そんなに速度低下はしない、といわれたのですが、実際に見たわけではないので、はっきりと言えないです。(私が試したのは、旧式の方法でExcelで実現しただけなので、話にならないほど遅かったです) >上記ご指摘いただいたマクロの5秒を1秒ごとにすれば、問題解決なのです。 >処理速度の低下により○秒ごとにマクロを実行するということが崩れてしまったりはしないでしょうか。 かなり厳しいですね。OnTime メソッド自体では、それほどのロスは発生しませんが、DDE自体のタイムロスは存在しませんか?また、マクロは、スクリプト言語ですから、やはり遅いです。ただ、それは、そのデータの捕まえ方(イベント)にもよるような気がします。 Excelのワークシート上は、だいたい、どんなに遅くても、100ms 程度と見てよいと思いますが、もう一度、振り出しに戻ってみても良いような気がします。 >想定される範囲でご回答いただけましたら幸いです。 出来る限りのことはさせていただきます。それは、この話は、私自身では、もう2年以上、うまくいかない質問として残っているからです。もしも、この人はダメだなって思ったら、すぐにダメダシしていただいてもよいです。 <私の現在の計画> ・そのまま1秒ごとでロスを計る(ロスの計り方はあります) ・Win32 API関数を使用する ・Worksheet_Calculate イベントとNow()関数による連携(解決には至っていない) ・Java の出力を直接、DDE関数で取る(仕様書が必要かもしれません) (ことごとく失敗する可能性もあります) この後は、まだ、勉強が足りませんが、VB6 で別途ツールを作成する、というところがあります。そのために、本を購入したのですが、まだ、ちゃんと読んでいません。 今、ちょっと忙しいので、一つずつ、私の考えを展開したいと思っております。至らないとは思いますが、こちらこそ、よろしくお願いします。

kkbby
質問者

お礼

多忙な中での回答、本当に感謝いたします。 まさかこうも親切に解説していただけるとは思っておりませんでした。 私はプログラミングは実にCOBOL以来ですので、ご提示いただいた内容をすぐに理解できず、ご迷惑をおかけするかもしれませんが一生懸命理解に勤めますので、よろしくお願い致します。 私の質問の仕方にも問題があるかもしれませんので、その点何かございましたらご指摘いただきたく存じ上げます。

すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんばんは。 それは、何かの測定器ですか?逆に、もしよろしかったら、どんな機械で、どんな風に設定するとか教えていただきたいと思っております。この種の回答は、まだ、実験が出来ないので、これで、4回目になりますが、まだ、想像の範囲なんです。(すみません、勝手なことを言って) DDE は、DDE関数はあり、やり方は分かるのですが、実際の試すための道具がないということで、やったことがありません。 >イベントプロシージャの(worksheet_change)で試してみたのですが、 やっぱりそうなんですね。前回の質問の時には、ここら辺りが曖昧になってしまいました。 手前勝手な話はここまでにして、私の知る範囲では、OnTime メソッドを使用します。 TimerStart で、マクロを動かします。以下は、A1 にデータが入ってくるものとして、5秒ごとにチェックし、A1 のデータが変更あったら、2列目に、その変更のデータを書き写すというマクロです。付録として、解除用のマクロがついています。ただし、別のマクロが動いている場合は、たぶん、出来ないと思います。 '------------------------------------------- '標準モジュールが最適 Private myOnTime As Date 'OnTime 用の時間データ Private BackData As Variant '前回のセルのデータ Sub TimerStart()   'タイマー   'ここにチェックマクロを置く   If BackData = Empty Then     BackData = Cells(1, 1).Value     Cells(65536, 2).End(xlUp).Offset(1).Value = Cells(1, 1).Value   ElseIf BackData <> Cells(1, 1).Value Then     Cells(65536, 2).End(xlUp).Offset(1).Value = Cells(1, 1).Value     BackData = Cells(1, 1).Value   End If   '次のチェック時間 (以下は5秒後)   myOnTime = Now() + TimeValue("00:00:05")   Application.OnTime myOnTime, "TimerStart" End Sub Sub TimerStop() 'タイマー停止   On Error Resume Next   Application.OnTime myOnTime, "TimerStart", , False   On Error GoTo 0   If Err.Number > 0 Then    MsgBox "設定が残っていません。"   Else    MsgBox "設定が解除されました。"   End If End Sub

kkbby
質問者

お礼

早々のご回答ありがとうございました。 DDEは他のjavaアプリケーションから、データを取り込んでいます。 その取り込んでいるデータが”A1"だったとして、データのの更新頻度はランダムであり、例えば1秒ごとであったり、5秒間更新がなかったりします。 上記ご指摘いただいたマクロの5秒を1秒ごとにすれば、問題解決なのです。 が、同時にいくつかのマクロを走らせるような使用になると想定しているため、処理速度の低下により○秒ごとにマクロを実行するということが崩れてしまったりはしないでしょうか。 この点は自分で試してみれば良いのでしょうが、まだその段階まで作業が進んでおらず、想定される範囲でご回答いただけましたら幸いです。 よろしくお願い致します。

すると、全ての回答が全文表示されます。

関連するQ&A