ウォーターサーバーとコーヒーマシンが一体化した画期的マシン >>

エクセルで、DDEを利用して表1のようなデータがリアルタイムで
取れることが判っています。
これを表2のように時間ごとに履歴をつけられるようにしたいと思っております。(できれば、60分、30分などの時間別に)

これは、関数でできるものなのでしょうか、
それともVBで行わなければならないものでしょうか。
判りましたらば、是非その方法をご教示頂ければと思っております。

宜しく御願いいたします。

表1
通貨  OPEN HIGHLOWCLOSETIME
GBPJPY 199.20199.23199.20199.23 2008/08/08 20:56


表2
OPEN HIGH LOW CLOSE TIME
199.20 199.23 199.20 199.23 2008/04/14 07:22:45
199.22 199.22 199.20 199.20 2008/04/14 07:23:45
199.23 199.27 199.20 199.27 2008/04/14 07:24:45
199.25 199.25 199.18 199.18 2008/04/14 07:25:45
199.10 199.10 199.07 199.07 2008/04/14 07:26:45
199.07 199.12 199.07 199.12 2008/04/14 07:27:45
199.13 199.13 199.09 199.09 2008/04/14 07:28:45
199.06 199.06 199.00 199.01 2008/04/14 07:29:45
198.97 198.97 198.90 198.90 2008/04/14 07:30:45
198.90 198.93 198.90 198.91 2008/04/14 07:31:45
198.92 198.94 198.88 198.94 2008/04/14 07:32:45
198.96 199.00 198.95 199.00 2008/04/14 07:33:45
198.94 198.94 198.86 198.89 2008/04/14 07:34:45
198.92 198.92 198.92 198.92 2008/04/14 07:35:00
198.95 198.95 198.94 198.95 2008/04/14 07:36:45

このQ&Aに関連する最新のQ&A

A 回答 (7件)

補足:


ダミーの数式は、

G列以降に、

=COUNT(A:F)

ということでもよいと思います。
(F列ですと、循環参照になります)
時間の区切りは、07:36:45 を判定しても可能です。
なお、2008/04/14 07:36:45 が1セルに入っているなら、1列減らしてお読みください。
    • good
    • 0

こんにちは。



もう一度、私の以前の開発上のログを読んでみました。

Microsoft 側のサポートは、古すぎてダメだったのですが、こちらでは、DDEインポートでExcelのイベントを発生して成功しています。しかし、こちらは、質問者さんと同じ環境で開発していないので、元の段階で違っているか、何か別の原因があるとは思います。

たぶん、私は、この問題は必ず開発は可能だと思いますが、同じ環境を持たないと、掲示板上でのやり取りでは難しいかもしれません。
    • good
    • 0

>解決しました。


どうも返事ありがとうございます。もう、ここでも、何度も同じ質問が出ているし、海外の有名な掲示板でも、これという確信のもてる解決策が出ませんでした。もしかしたら、知っている人は、公開しないのかもしれません。

今回は、DDEの発生-出力プログラムを作って、Office2003でしたが、こちらでは成功していましたので、たぶん、間違いはないと思っていました。しかし、今後、バージョンが上がると、これも変わるかもしれません。下位バージョン(97以下)なら、OnData イベントです。
    • good
    • 0

質問者様へ



出来れば、この結果を知りたいです。私は、同じような質問に対処してきましたが、今回、初めて違うコードの試みをしました。

Microsoft サポートを信じきっていましたが、サポート資料は、95(5),97 だけで、実際に、DDEインポートでは、うまく成功しませんでした。今回のコードは、前からずっと暖めていたもので、単純ですが、あまり類を見ない方法です。

他の掲示板も別案は出ているのかもしれませんが、あまり検索ではヒットしません。今回、私は、初めての試みなので、その結果が、また、次につながると思います。

よろしくお願いします。
(出来れば、お礼側でお願いします。お礼側には、メールされますので、ここを見なくても結果が読めます)
    • good
    • 0
この回答へのお礼

リクエストを頂いて有難う御座いました。

解決はされていないのですが、そろそろ一旦質問を締め切ります。
同様のことをされているのではないかとおもいますので、ぜひ、
OKWaveで色々とやり取りをさせていただければと思っております。

現在、為替のバックテストツールを作成しています。
自分なりの仮説があるのですが、これまで関数でテストを行っていました。あまりに重くなってしまいましたので、VBAで試みている次第です。
宜しく御願いいたします。

お礼日時:2009/01/18 00:56

こんにちは。



>1分ごとに履歴が記録されていますが、
>これを、30分や、60分などを指定すれば、その単位で、履歴を記録させるという意でした。

簡単に行うなら、フラグを、OnTimeメソッドで送ってあげて、それを、イベントの中に、フラグで判定させればよいです。イベント自体は生きていますが、Sheet2 にはデータが送られません。

再度、記録するためには、もう一度、「セット・タイマー」のマクロを実行します。mMIN は、分を入れます。1分ごとの流入でしたら、まず、間違いはないと思います。頻繁(例:1/sec)にデータが入るようでしたら、イベント側に、割り込みのDoEvents を適当な場所に入れてあげる必要があります。

------------------------------------
**標準モジュール
------------------------------------
Public TimeCutFlg As Boolean
Sub SetTimer()
'セット・タイマー
Dim myTime As Date
Const mMIN As Integer = 60 '設定の時間(分)
TimeCutFlg = False

myTime = Now + TimeSerial(0, mMIN, 0)
Application.OnTime myTime, "SendFlg"
End Sub

Sub Sendflg()
'フラグを送る
 TimeCutFlg = True
End Sub

------------------------------------
**シートモジュール
------------------------------------
Private Sub Worksheet_Calculate()
'カルキュレイト・イベント
Static flg As Boolean
If TimeCutFlg Then 'フラグで解除
  If flg = False Then
   MsgBox "記録終了"
   flg = True
  End If
  Exit Sub
End If

With Worksheets("Sheet2").Range("A65536").End(xlUp).Offset(1, 0)
 .Resize(, 5).Value = Worksheets("Sheet1").Range("A2").Resize(, 5).Value
End With
flg = False
End Sub
    • good
    • 0
この回答へのお礼

ありがとうございました。
解決しました。

お礼日時:2008/08/26 00:59

こんにちは。



>それともVBで行わなければならないものでしょうか。
関数では不可能です。

マイクロソフト・サポートにウソはないと思いますが、Excel2003で、以下の内容では出来ませんでした。

OnData Property
http://support.microsoft.com/support/excel/conte …

英語圏の掲示板には、この実際のコードは、ここを紹介するだけで、ほとんど出てきません。多くは、株式データのDDE(OLE)のためのものですが、今回、上記では出来ませんでしたので、改めて、こちらで、DDEから、1秒ごとにデータを送る方法で、Excelのマクロを考えてみました。

--------------------------------------

2行目(A2 --F2)
199.20 199.23 199.20 199.23 2008/04/14 07:22:45   

適当なダミーの数式を、関係のない場所に置きます。
  = F2+1  'OnData で、Calculate Event が発生する。一行の終わりが入ったところが良い。(end of data line)
  

シートモジュールには、このようなコードを置きます。

'Sample--Sheet1 Module

Private Sub Worksheet_Calculate()
'Replace of DDE OnData Event (added Dummy Formula to relate a imported data)
With Worksheets("Sheet2").Range("A65536").End(xlUp).Offset(1, 0)
 .Resize(, 5).Value = Worksheets("Sheet1").Range("A2").Resize(, 5).Value
End With
End Sub


>これを表2のように時間ごとに履歴をつけられるようにしたいと思っております。(できれば、60分、30分などの時間別に)

具体性がないので、どうするか良くわかりませんでした。OnTimeメソッドで時間を区切ることだと思います。こちらは、もう少し、お話を聞かないと出来ません。

このDDEの詳しい説明は、Excel Ver.5 のVBAの標準マニュアルに出てきます。その後は、ないようです。

P.S.
なお、そのDDEの発生装置の設定プログラムには、「表2」のようにすることが出来るはずだと思います。横の列にデータが出るのですから、縦側も、行を1加えていく方法が、あるのではないかと思います。

この回答への補足

>これを表2のように時間ごとに履歴をつけられるようにしたいと思っております。(できれば、60分、30分などの時間別に)

具体性がないので、どうするか良くわかりませんでした。OnTimeメソッドで時間を区切ることだと思います。こちらは、もう少し、お話を聞かないと出来ません。

おっしゃる通りです。
1分ごとに履歴が記録されていますが、
これを、30分や、60分などを指定すれば、その単位で、履歴を記録させるという意でした。

補足日時:2008/08/12 23:40
    • good
    • 0

>エクセルで、DDEを利用して表1のようなデータがリアルタイムで


取れることが判っています。
エクセルは結果を表現するアウトプット画面に使われたに過ぎないでしょう。「エクセル(の機能)で」というのは言いすぎです。
WEBクエリでも使ったのかな。
ーー
表1は同じ!セル範囲に最新(変わったら換わった都度)データが入るのかな。
ーー
エクセルでは同一セル範囲場所にデータが入って(直前のデータは上書きされて消える)場合に、それを、時系列的に表に構成するのは
Changeイベントという考えに縋(すがる)らざるを得ないと思います。
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$C$2" Then
Worksheets("Sheet4").Select
Worksheets("Sheet4").Range("A65536").End(xlUp).Offset(1, 0).Select
Selection.Offset(0, 0) = Worksheets("Sheet3").Range("A2")
Selection.Offset(0, 1) = Worksheets("Sheet3").Range("B2")
Selection.Offset(0, 2) = Worksheets("Sheet3").Range("C2")
End If
End Sub
Sheet3のA2:C2に順次データを入れていって
Sheet4のA1:C1以下にデータを累積していく。
こういうものの考えになるのかなと思う。
ーーー
もうひとつの難しい点は、1分づつの間隔を置いて、その間のデータは捨てる、ことが必要かと思うが、タイマーの機能を使う必要があると思う。
==
そういうことで小生十分経験とスキルは無いが、VBでもむつかい課題であることぐらいはわかる。
多分すぐには、質問者にはこの課題は、無理かなと思う。
そういうソフトが無いかどうか探すべきでしょう。
ーー
関数では式を入れておいても、元のセル(上記例ではSheet3のA2:C2)がいつも一緒なので、全行同じ最新のものを表示してしまうので、役立たないと思う。

この回答への補足

なるほどです。
ありがとうございました。

補足日時:2008/08/12 23:37
    • good
    • 0

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


人気Q&Aランキング