• ベストアンサー

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

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

  • kkbby
  • お礼率100% (3/3)

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

  • ベストアンサー
  • 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

  • Excel2010 イベントプロシージャが動かない

    VBAはほとんどいじったことのない初心者です。 イベントプロシージャをインターネットから探してきて、コピペして使おうとしてます。 Private Sub Worksheet_Change(ByVal Target As Range) On Error GoTo ERR_HANDLER If Target.Address(False, False) = "E2" Then ActiveSheet.Name = Range("E2").Value End If Exit Sub ERR_HANDLER: MsgBox "現在のE2セルの値はシート名にできません。" End Sub やりたいのは、セルE2の値に変更があったら、そのセルの値をシート名にしたいということです。 初心者には難しいでしょうか? ご教示いただけると幸いです。 よろしくお願いします。

  • VBAのイベントプロシージャについて

    VBAのイベントプロシージャについて VBAを勉強していますが、どうしても上手くいかないので質問させて頂ます。  ------------   Bookの中身    sheet1     A1:AA     A2:  ------------  【処理内容】  sheet1のA1には、AAという文字があり、ハイパーリンクが設定してあります。  sheet1のA1をクリックすると、sheet2が開かれます。 sheet2をを開くとsheet1のA2には、1を挿入するという処理を行いたい。  Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)      :  End Sub  を使用しましたが、上手くいきません。  ご教授の程、お願いします。  

  • EXCELVBAのイベントプロシージャ

    EXCELのVBAでダブルクリックイベントプロシージャについて質問です。 したいこと。 ある管理表がありその表の索引番号といくつかの項目が並んでいる表です、 その表を見て索引番号をダブルクリックするとその索引番号の表題部と明 細部を単票(カード)形式で表示するようなものをつくりたいと思っています。 困っているところ。 ダブルクリックのイベントプロシージャでこれを実現しようとしているのですが うまくいかなくて困っています。 ダブルクリックのイベントプロシージャでその値(ここでは索引番号)がTarget にはいるのですがその値は他のプロシージャに渡す方法がわかりません。 あるいは、イベントプロシージャの仕様としてTargetの値は当該プロシージャ内 でしか保持できないのでしょうか? 他のプロシージャでもその値を使いたいのですがダブルクリックイベントの値を 他のプロシージャで使う方法がありましたら教えてください。

  • Excel VBA イベントプロシージャを2つ記述する(基本です)

    基本的な事なのですが、Excelのイベントプロシージャで2つプログラムを作るにはどうやって記述すればよいのでしょうか? 具体的には、worksheetのchangeイベントで、セルC5の値を変えた時と、セルG7の値を変えた時の2通りのマクロを作成したいのです。 Private Sub Worksheet_Change(ByVal Target As Range) C5を変えた時の処理 End Sub Private Sub Worksheet_Change(ByVal Target As Range) G7を変えた時の処理 End Sub このように書けばよいのでしょうか?そうするとTargetがかぶっておかしくなる気がします。。 お願いします。

  • EXCEL VBAのイベント発生方法について

    EXCEL VBA でセルの値を変更したら、計算をするプログラムを作りたいのですが、入力を入力規則でリストから選択する方法をとると、選択項目を変更してもWorksheet_Changeのイベントが発生しません。発生させる方法は有りますか?

  • SelectionChangeとChangeの違い

    エクセルのシートイベントには、 ・Worksheet_Change ・Worksheet_SelectionChange がありますが、違いはなんでしょうか? ・Worksheet_Changeはセルの値が変わったら発動 ・Worksheet_SelectionChangeは、 セルの選択が変わったら発動なおかつセルの値が変わったら発動 と言うことでしょうか? ・セルの値が変わったら、Changeイベントの方が先に発動する。 であってますか?ご回答よろしくお願いします。

  • イベントプロシージャについて(エクセル)

    あるエクセルのブックの全てのシートに 適用されるようなイベントプロシージャを 作りたく思っています。 1、あるセルをダブルクリックする 2、そのセルが含まれている行を選択する 3、メッセージボックスで「現在の行を削除する」  旨の確認を求めて 「はい」ならば削除  「いいえ」なら何もしない 1、あるセルをシングルクリックする 2、そのセルが含まれている行を選択する 3、メッセージボックスで「現在の行をコピーして   自身の一つしたの行に挿入する」  旨の確認を求めて 「はい」ならば実行  「いいえ」なら何もしない という二つのモノを作りたく思っています 自分で色々HPを見たり 書籍も見てみたのですが なかなかわかりませんでした 「ブック上での全てのシートで適用される」 という記述はどうしたらよろしいのでしょうか? 皆様よろしくお願いします

  • Excel VBA Worksheet_Change イベントについて

    Excel VBA Worksheet_Change イベントについて質問です。 セルH8とI8を結合し、入力規則よりリストボックスを配置しました。 本シートにWorksheet_ChangeをVBAで作成しましたが、 セルH8:I8をDeleteすると実行時エラー13が発生します。 If Target = "" then exit sub end if や If Target.value = "" then exit sub end if や If Target <> "" then 処理 end if としても対処できませんでした。 よい対処方法のアドバイスよろしくお願いします。

  • イベントプロシージャ『 Worksheet_Change 』の対象セル

    イベントプロシージャ『 Worksheet_Change 』の対象セルを『 コピー貼付 』の際 どんな方法で貼り付けてもマクロがフリーズすることがなくなる方法をご存知の方が いらっしゃいましたら、是非その方法を教えて下さい。 『 Worksheet_Change 』対象セルの『 コピー貼付 』の際、ツールの『 編集 』から 『 貼り付け 』の手順で『 Worksheet_Change 』対象セル宛に情報を貼り付けてみた 場合は特に問題なく情報が貼り付いてくれます。 『 Ctrl+V 』で貼り付けた場合も問題なく情報が貼り付いてくれます。 しかし、コピー後に貼り付け先のセルを右クリックして『 形式を選択して貼り付け 』の手順での 貼り付けをしようとすると、必ず決まってマクロがフリーズしてしまいます。 そのため、その度にウィンドウ右上の閉じるボタン『 X 』をクリックして『 保存しますか? 』を 『 キャンセル 』してマクロのフリーズを解除している状況です。 コピー元のセルと貼り付け先のセルは共にセル結合されている状態ですが、この『 セル結合 』は マクロのフリーズとは無関係のことと思われます。 何か良い解決策をご存知の方、どうか宜しくお願いします。

  • 複数のワークシートのイベントプロシージャをまとめて変更できますか?

    すべてのシートのイベントプロシージャを一気に書き換える方法ってありますでしょうか? 現在、一つのブックに60枚のワークシートがあり、それぞれのシートに全く同じイベントプロシージャが書かれています。 その全てのプロシージャのセルの指定をrange("A1")→range("C1")というふうに変えたいのですが、60枚のシートをひとつづつ変えていくのはとても面倒なので、まとめてやる方法はないかと考えたのです。 よろしくお願いします。

専門家に質問してみよう