[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ネットを介してリアルタイムに自動取込んだ数値を目的別に分類し各々に表示して、次々に取込まれ分類された数値が各々のセルで加算されて行くVBAをお教え下さい。』(迷人)
内容の要約が長くて済みません。
随時リアルタイムに取込、更新されるデータ(数値)を目的別に分類し各々O3とO4に表示されるようにしました。
O3に次々に表示される取込まれた値を順次加算した値をP3に、
そしてO4に次々に表示される取込まれた値を順次加算した値をP4に各々表示される様にしたいのです。
このご質問の前に、検索して次のVBAを試してみましたが、
1:2つのセルで同じ処理をさせる書き方が出来ませんでした。
2:1つのセルで実行しましたところ、O3セルの値が自動でリアルタイムに変化してもO4セルの値は加算されませんでした。
故にこの式では駄目でした。
/////////////////////////////////////////////// Private Sub Worksheet_Change(ByVal Target As Range) If Target.Count <> 1 Then Exit Sub If Target.Address <> Range("O3").Address Then Exit Sub
Range("P3").Value = Range("P3").Value + Target.Value Target.Select End Sub ///////////////////////////////////////////////
セルの個所を、目的のO3とP3に変更しました。
この文を2つ並べ一方のセルの所をO4とP4にしましたが、P4への反映は有りませんでした。
故に、最もシンプルな方法で、前述の事が実現できる、VBA文をお教え下さい。
Excelは2003で、OSはWinXP-PROサービスパック3です。
リアルタイム更新はどのように行われているのですか? (みやほりん)
有り難うご座います。
リアルタイムスプレッドシートを利用し、 Excelにアドインして自動データ取り込みを行い、 取込んでいるセル(D8)をO3,O4の各セルにIF文で、 分類基準を表しているセル(K8)と共に参照させて、 その分類に従って各々D3の値がO3とO4に表示されるようにしています。
O3では、=IF(K8="↑",D8,0) O4では、=IF(K8="↓",D8,0)
と云うIF文です。(迷人)
リアルタイムスプレッドシートは楽天RSSのことでしょうか。 利用したことはないので、仕組みそのものはちょっとわかりませんが、 おそらくWEBクエリーを利用しているのではないかと推測します。 WEBクエリも利用経験がないので、ローカルファイルでのクエリ更新の 挙動を想定して書かせていただきます。 クエリ更新では更新に関係する複数セルが同時更新されます。 したがって、更新を行っているシートでWorksheet_Changeイベントマクロ を利用した場合には、 If Target.Count <> 1 Then Exit Sub の部分でプロシージャが終了してしまいますので、この行は無用。 同じく、更新されるTargetのセルが複数なので、以下のステートメント If Target.Address <> Range("O3").Address Then Exit Sub これも必ずプロシージャが終了してしまいますので、無用。 また、「O3が変化したら」という意味で捉えているかもしれませんが、 O3は数式の計算結果が変わるだけでセル内容が変化したわけでは ありません。 同じく、Targetが複数のセルであるとするならば、 Range("P3").Value = Range("P3").Value + Target.Value セルP3にセルの値の配列を加算する形になるので、エラーになります。 加えて、このステートメントが実行された場合、セル編集されるので、 Worksheet_Changeが終わらないうちに別プロセスのWorksheet_Changeが 発生してしまいます。(再帰呼び出し) 再帰呼び出しを起こさない工夫が必要です。 で、何が言いたいかというと、「それらしきコード」ですが、やりたいことに そぐわないと考えますので、現在のコードは捨ててください。 最初から考えてみます。 ・更新でChangeイベントは発生するので、Worksheet_Changeの利用は妥当 ・O3、O4のセルは数式が埋め込まれているので、これらをチェックするのは 適当ではない(更新による変化したセル範囲Targetには含まれない) したがって、Targetに含まれるかどうかの判断も必要ない。 この場合重要なのはむしろK8の値である。 ・Changgeイベントは普通の編集でも発生してしまうので、RSSによる更新か、 ユーザーが意図的、もしくは偶発的に行った編集かを区別する方法がない。 ・したがって、該当シートはRSSによる更新だけが行われるような状態が好ま しく、その結果を表示する部分は別シートにおくのが良いのではないか? 以上を踏まえて、 RSSが実行されているのとは別のシート(仮にSheet2とします)のP3、P4に 結果を加算していくものとします。 RSSが実行されるシートは基本的に編集しないものとし、 また更新される範囲が仮にA1:K25であるとします。 下記のコードをRSSが実行されるシートモジュールへ。 /////////////////////////////////////////////// Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = Me.Range("A1:K25").Address Then With Worksheets("Sheet2") Select Case Me.Range("K8") Case Is = "↑" .Range("P3").Value = .Range("P3").Value + Me.Range("D8").Value Case Is = "↓" .Range("P4").Value = .Range("P4").Value + Me.Range("D8").Value End Select End With End If End Sub /////////////////////////////////////////////// RSSの仕組みが解っていないので、上記が不適当であればごめんなさいです。 (みやほりん)(-_∂)b
関連情報として 「リアルタイムスプレッドシート」で全文検索すると、ちょこっと参考事例があるかもです。 私も当時ごちゃごちゃやってて、でもほとんど忘れちゃいましたが。 (ご近所PG)
そして、ご報告
VBAの式をリアルタイムに随時更新されるセル(D8)や振分けの為の条件セル(K8)、そしてO3とO4が存在するシートは、Sheet3なのでVBエディターを起動してSheet3上の機能しなかったVBA文を指示通り削除しました。そしてお教え賜りました文をコピーペーストし、If Target.Address = Me.Range("A1:K25").Address ThenのA1:K25をD8に変更し、 With Worksheets("Sheet2")のSheet2をSheet4に変更しました。勿論Sheet4は追加しました。
動作させて見ましたが、Sheet3のD8セルは自動で更新され、それに応じてK8セルが↑や↓が表示され、そして↑の時はO3に、↓の時はO4に、D8セルの値が表示されます。ご承知の如くO3とO4のセルにはIF文を書いていますので、D8セルの値が表示されたセルと反対のセルには0が表示されています。
これで追加したSheet4のP3とP4に各々Sheet3のO3とO4の更新される値が加算されて表示される様になると思い、観察していましたが、Sheet4のP3とP4に空白のままで変化しませんでした。
何処が、間違っているのでしょうか。
因みにリアルタイムスプレッドシートは、楽天RSSです。これは楽天のマーケットスピードと云うソフトを起動してログイン後にリアルタイムスプレッドシートと云う別ソフトを起動します。そしてExcelにアドイン登録した後、自分の好みのセルに自分の取込みたい項目を選択するとそのセルに書式が入力されます。例えば日経225先物ラージ12月限の出来高であれば、『=RSS|N225.FUT01.OS!出来高』この様に書かれます。マーケットスピード・リアルタイムスプレッドシート・取込設定した前記のExcelファイルの全てが起動していれば、取込設定したセル上でリアルタイムに日経225先物ラージ12月限の出来高が、約定する毎にその約定枚数が加算された合計値として表示され更新されていきます。
実はRSSの取込項目に1約定毎にその出来高枚数を取込む機能が無い為、Excelファイル上で1つ前の出来高から今の出来高を引く事により、1つの約定毎の枚数を算出させました。それをSheet3のD8に表示させ、同時にその価格をE8に表示させ、1つ前の価格(E9)との比較によってK8に、高い時は↑、低い時は↓、同じ時はK9と同じにする様にしました。そしてK8が↑の時はD8の値がO3に表示され、↓の時はD8の値がO4に表示される。ここまでは機能しています。
後は、このSheet3のO3とO4が更新されるその都度に加算された合計がSheet4のP3とP4に表示される様になれば、成功なのですが、上手く行きません。このSheet4のP3は買われた約定の合計を、P4は売られた約定の合計を表すことに成ります。
説明が長くなりましたが、これで意図する事が、誤解無くお伝え出来ているでしょうか。
以上を踏まえ、宜しくご指導下さいませ。
(迷人)
詳しい説明ありがとうございます。 私が想像したものとは違うようです。 changeイベントはセル内容の変更がトリガーです 表示される値が変化するだけではトリガーになりません。 再計算イベントを使った方がいいのかな? 今日は携帯からなのでサンプルが出せませんが。 (みやほりん)
皆さんのやり取りそのものをよく読んでおらず、またおき抜け出頭がぼぉ〜としていて、 かつ、DDEっていうんですか、このあたりの仕組みを使ったことがないので、「無責任かつ的外れの三乗」になるかも。
DDEのような外部の仕組みでのセルの値の変化に対してはChangeイベントは発生しない(ようだね) (ControlSourceプロパティで紐つけたセル値が自動変更されたときとおなじ) ただ、このセルを参照する式が他のセルにあれば、このほかのセルでCalculteイベントは発生すると思うので それを利用するかな?
シートにOnDataというプロパティがあるそうで、それを利用する方法が、楽天証券リアルタイプスプレッドシートの解説ページに掲載されている。
これらは、別の板だけど、以下のQ/Aの受け売り。このQ/Aそのものは、当初のテーマからはずれて どんどん、ややこしい様相になっているけど、真ん中あたりまでで、(迷人) さんのテーマに関しては 解決レベルになっているんじゃないかな? http://www.moug.net/faq/viewtopic.php?t=60582
(ぶらっと)
(ぶらっと)様のアドバイス通り、昨日・今日と調べましたが、今の楽天証券リアルタイプスプレッドシートの解説ページには有りませんでした。 ご案内のサイトへ行き、順に読んでまいりましたが、最後まで読んでも解決する糸口を掴めませんでした。 手持の本『ExcelVBA完全制覇』(2002〜7迄対応)翔泳社出版でOnDataやCalculateをインデックスで調べましたが有りませんでした。 解決方法がお分かりならば、(みやほりん)様が作成して下さいました前文VBAのどの部分をどの様に変更すれば宜しいのでしょうか。どうぞお教え下さいませ。 (迷人)
上でも書いたように、当方RSSもDDEも実体験はないので「受け売り」なんだけど、紹介先でも議論されていたように 別アプリからのシート上のセルの値の変更では、シート側でChangeイベントが発生しないので アップされたコードや(みやほりん)さんのコードのように、 Private Sub Worksheet_Change(ByVal Target As Range) で受けても、ここには飛んでこない。
アドバイスしているのは、たとえば、そのシートのA1の値がRSSで変更されるとすれば、どこかに(IV65636でもいい)に =A1 と A1を参照する式を入れておけばCaluculateイベントは発生するので、Private Sub Worksheet_Calculate()で受けるとなんとかなるかな?というもの。 ただし、引数をみてもわかるようにTargetがないので、シート上の、どのセルの参照式によるイベントなのかがわからない。 かなり細工が必要だけどねぇ。
自分なら、このあたりの仕組みがわからないので、裏で、ぐるぐる監視ロジックをループさせるかもしれないなぁ。
なお、「エクセル シートイベント」で検索するとイベントをわかりやすく解説したページがたくさん出てくる。 http://www.eurus.dti.ne.jp/yoneyama/Excel/vba/vba_event.html とか また「エクセルシート OnDataプロパティ」で検索すると、これまた参考ページが。
いずれにしても、まずは自助努力でがんばってほしい。
こんにちは。
『ExcelVBA完全制覇パーフェクト』のことですね。 この本、いまは図書館に預けてあるのでw手許にありませんが、『Calculate』載っていませんか? では『イベント』ではどうでしょう、載っていそうな気がしますが。
ちなみに『かんたんプログラミング Excel2007 応用編」にはくわしく載っています(イベント)。 『Calculateイベント』も載っています。 『完全制覇』のほうに載っていないときは『かんプロ』をお勧めします。 本を使う習慣のあるひとには『かんプロ』を勧めています。やや値は張りますが、 値段に見合う価値のある本です。
ondataはむかしExcelVBAで使われていたメソッドで、いまは旧バージョンとの互換のために残されている ものです。新しい解説本にはまず載っていません。ネットで検索するとむかし書かれた(と思われる) サンプルコードが散見されますが、コピペしてDDE環境で動かしても、エラーもでない代わりなにも起こりませんでした。 かりに上手くいく方法を見つけたところで、いつまで使える保証もありません。 ondataについてはいったん忘れたほうが良いと思います。
−佳−
Private Sub Worksheet_Calculate() ' Application.EnableEvents = False ' With Worksheets("Sheet4") ' Select Case Me.Range("K8") ' Case Is = "↑" ' .Range("P3").Value = .Range("P3").Value + Me.Range("D8").Value ' Case Is = "↓" ' .Range("P4").Value = .Range("P4").Value + Me.Range("D8").Value ' End Select ' End With ' Application.EnableEvents = True MsgBox "再計算されました" End Sub Changeイベントのマクロを削除して、上記を貼り付け。 更新時に「再計算されました」というメッセージが出れば シートの再計算が行われている、と検証できます。 然る後に「MsgBox "再計算されました"」を削除、 コメントアウトしてある行の「'」も削除でどうでしょうか。 (みやほりん)(-_∂)b
(ぶらっと)様、(佳)様、(みやほりん)様、この度は有り難うご座いました。
『かんたんプログラミング Excel2007 応用編』は、注文しました。
自助努力で頑張っていましたが解決出来ず、提帯しておりました。
(みやほりん)様から賜りましたVBA式をご指示通りコピペ致しました。
今、夜間のマーケットが動いていますので、稼動させました。
無事に取引約定毎に分類されたものが、各々に累積表示されるように成りました。
この度は、本当に有り難うご座いました。
皆様のご健康とご繁栄をお祈り致しております。
(迷人)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.