- ベストアンサー
エクセルのあるセルに常に自動更新される値があります。これを
エクセルのあるセルに常に自動更新される値があります。これを そのセルの数字が変化するごとに自動で特定の列に順に出力していきたいのですが? そのような方法はありますか? 自動更新されている値は外部のアプリから取り込んだものです
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
No3 merlionXXです。 No1さんへの補足に「A1にいま入力してある外部の地を取り込む式をダブルクリックで表示させてからエンターキーを押すとB列に出力はされるのですが」とあります。 ということは、A1セルにデータを直接入力しているのではないですね? そういうことは最初にお書きにならないと回答者にはわかりません。 ならばChangeイベントは発生しませんから作動しなくて当然です。 A1セルが参照しているのが当該BOOKではないならば、Changeイベントはつかえません。 そのシートの値が変わるのが外部データの変化だけなのであれば、「計算」が発生したときに作動するCalculateイベントを利用することも可能です。 ただし、ご期待にこたえられるか保証の限りではありません。 Private Sub Worksheet_Calculate() On eror GoTo line Application.EnableEvents = False Cells(Rows.Count, "D").End(xlUp).Offset(1).Value = Range("A1").Value line: Application.EnableEvents = True End Sub
その他の回答 (7)
- Wendy02
- ベストアンサー率57% (3570/6232)
#7さんが、すでに書かれていますが、Changeイベントは、Return(Enter) コードが入らないと起動しません。 ただ、申し訳ないのですが、9割の質問の方が、きちんと、その状況を書かれていません。それさえ言ってくれればよいのですが……。 >セルに常に自動更新される値 これだけでは、本当は分かるはずがありません。 私も、何度も回答して、何年間も失敗した上で、やっと実体が分かってきました。最終的には、自分で、実験してみなければ、分からないです。 多くの質問では、DDEやOLEというものがキーワードです。例えば、RSS(スピードスプレッドシート)というものもあります。検索ワードとしては「RSS Excel」とか「DDE Excel」とでも、出てくる可能性がありますが、ほとんどの方は、どういうように入ったかということは公開しません。 これは、日本だけの話ではないようで、少なくとも英語圏でも、きちんと書かれてあるのは、MSサポート一箇所だけでした。 しかし、MS側の内容も古すぎて間違っていました。MSでは、OnEntry プロパティやChangeイベントでできると書かれていますが、それは出来ません。 自分で、DDEの自動発信プログラムを自分で作ってみて分かりました。ただ、質問者さんの環境と同じかは分かりません。「出来ました」と回答でしか、実態は分からないのです。 そこで、私が考えた方法は、 #7さんのご指摘のように、 Private Sub Worksheet_Calculate() とイベントを使いますが、そのままですと、Calculate イベントは発生しないことがあります。そこで、再計算関数の =Now() をどこか同じシートのセルに置いてやることで、Calculate を発生させるという方法があります。 '//シートモジュール Private Sub Worksheet_Calculate() 'Replace of DDE OnData Event (added Dummy Formula to relate a imported data, e.g. =NOW()) Application.EnableEvents = False Me.Cells(Rows.Count, 2).End(xlUp).Offset(1).Value = Cells(1, 1).Value 'A1 にデータ Application.EnableEvents = True End Sub A1 にデータが入り、B列に、時系列にデータが入ります。 もし、最新データが上に来るようにするには、以下のようになります。データが一杯になれば、次の列に入ります。 '//シートモジュール Private Sub Worksheet_Calculate() 'Reverse Data Import Dim i As Long Application.EnableEvents = False i = Cells(Rows.Count - 1, Columns.Count).End(xlToLeft).Column With Cells(1, i + 1) 'B列 .Insert xlDown .Offset(-1).Value = Cells(1, 1).Value 'A1 にデータ End With Application.EnableEvents = True End Sub もし、これで発生しないようでしたら、例えば、A1 にデータが入るとすれば、 どこかのセルに、 =Now() * COUNTA(A1) と置いてやればよいかと思います。 なお、OnTime でも間違いがありませんが、あまり速いサイクルですと、ワークシートに対して負担が大きいはずです。また、あらたに、イベントを設ける方法もありますが、意外にワークシートが不安定になりがちで、他のマクロとの共用がよろしくありません。
お礼
できるだけ質問を簡潔に書こうとしてそれが裏目に出てしまうのかもしれません 大変勉強になりましたありがとうございます。
- mt35610
- ベストアンサー率19% (10/51)
ワタシが書いたコードはシートを指定して書いていませんので 対象シートがアクティブでなくてはいけません そうでない場合は シートを指定しなければいけません って そのくらいはわかると思って省略したのですが・・ そういう事ですか?
- imogasi
- ベストアンサー率27% (4737/17070)
これは前の質問と同類・そっくりではないか。 >うーんなぜかできません Changeイベントは関数式が入れてあって、引数が他シートを参照している場合は、他シートのそのセルの値が変わると、式を入れたセルの値は変わるが、下記には反応しない。 Private Sub Worksheet_Change(ByVal Target As Range) MsgBox "change" End Sub には反応しないようだ。 それ以外はコピー、外部データの取り込みなどにも反応するようだが。 ーー イベントを捉えるコードはシートモジュールに書くのだがその点大丈夫かな。 標準モジュールに入れているとか、他シートのシートモジュールに入れているとか無いでしょうね。 >外部のアプリから取り込んだものです 前の質問と内容が変わっている。 測定データを測定機器からリアルタイムで直接エクセルシートへ取り込んだ物でないでしょうね。 Changeイベントの反応 http://soudan1.biglobe.ne.jp/qa4039237.html 参考
- mt35610
- ベストアンサー率19% (10/51)
コードをどこに書いていますか?
- merlionXX
- ベストアンサー率48% (1930/4007)
bobo21さんについ最近おこたえした、 http://okwave.jp/qa/q6262955.html エクセルのあるセルに常に自動更新される値があります。 http://okwave.jp/qa/q6274280.html D列に順にその変化を出力していきたいのですが この二つを組み合わせれば簡単だと思うのですが・・・・。 あるセル=A1 特定の列=D列 とした場合 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address(0, 0) <> "A1" Then Exit Sub Cells(Rows.Count, "D").End(xlUp).Offset(1).Value = Target.Value End Sub です。 該当のシートのシートモジュールにお書きください。
補足
本当にまいどまいど申し訳ございません(*_ _) この方法でもANo.1の方と同じになってしまいます
- DIooggooID
- ベストアンサー率27% (1730/6405)
Change イベント を使ってみてください。 http://www9.plala.or.jp/siouxsie/date06.html
- mt35610
- ベストアンサー率19% (10/51)
VBAで可能です Private Sub Worksheet_Change(ByVal Target As Range) Dim Endrow As Long Endrow = Range("b65536").End(xlUp).Row If Intersect(Target, Range("A1")) Is Nothing Then Exit Sub If Target.Column = 1 Then Range("b" & Endrow + 1).Value = Range("a1").Value End If End Sub a1を変化する値のセルとし B列を記録先としました B1は見出しとし B2から順次変化した値が格納されます 但し 65536でMAXです いっぱいなったら というコードを加えなければいけませんが とりあえず
補足
うーんなぜかできません。。。 A1にいま入力してある外部の地を取り込む式をダブルクリックで表示させてからエンターキーを押すと B列に出力はされるのですが A1のセルの値が変わるごとに自動で出力したいのです またA1は常にアクティブではありません
お礼
できました!ありがとうございます!!! 自分ももっと勉強することにします。今回は本当にありがとうございました