- ベストアンサー
”戻り値”が変化したときに、マクロを実行したい
超初心者です。 セルの値が変化したときにマクロが実行されるようなものを作りたいです。 セルに入力されているのは、”関数”です。 なので、関数の”戻り値”が変化したときにマクロを実行したいのです。 今は、戻り値が変化しても式自体が変わっていないため マクロが実行されません。 (セルの式を切り取ってもう一度貼りなおせば、マクロは実行される) ちなみに今は Private Sub Worksheet_Change(ByVal Target As Range) で書いています。 まずVBAの勉強をしろと言われてしまいそうですが><; 何卒アドバイスのほどよろしくお願いいたします!
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
セルの数式が計算された時に実行されるイベントプロシージャとして Worksheet_Calculate イベントがあります。 これを活用されると良いでしょう。 監視対象セル以外のセル範囲に数式が設定されていると、その再計算時にもイベントが発生しますので 別に作業用シートを用意したほうが無難。 例えば Sheet1 の X10 セルの関数の戻り値を監視したい場合。 1)新規シートを追加して、監視用シートとする。 2)追加した監視用シートの A1 セルに 数式で =Sheet1!X10 ..などのように監視対象のセルを参照。 3)監視用シートのシートモジュールに以下のプロシージャを置く。 Private Sub Worksheet_Calculate() If Range("A1").Value <> Range("B1").Value Then Range("B1").Value = Range("A1").Value MsgBox "change" End If End Sub 基本的に、Sheet1 の X10 セルの数式が計算されて値が変化した時にCalculateイベントが発生しますが、 数式の内容によっては、値が変わらなくてもCalculateイベントが発生するケースもあります。 また、Sheet1の行削除や挿入時などでもCalculateイベントは反応します。 なので前回計算時の値を別セルに記憶させておいて、値を比較する必要があります。 前述の例では、A1に参照数式があるとして、B1セルを記憶用セルとして使うようにしています。
その他の回答 (2)
- WindFaller
- ベストアンサー率57% (465/803)
こんばんは。 >関数の”戻り値”が変化したときにマクロを実行したいのです。 何がイベントの信号となるのか、書かれていませんので、私も#1さんと同様、はっきりとこれが良いとは言えません。 >Private Sub Worksheet_Change(ByVal Target As Range) このイベントは、入力のEnter キーに対して反応するものです。 #2さんとは重複しますが、 Private Sub Worksheet_Calculate() は、まさしく、Calculate の信号が発せられた時です。 リアルタイムスプレッドシート(RSS)は、この範疇に入ります。Calculateイベントは、私の記憶では、=Now()関数を、同じシートのどこかに置いておくと、値の変化に対してイベントが発生します。これは、OnDataイベントの代わりの役目があります。 OnDataイベントとは、DDEやOLEが入ってくるのを監視する役目を持っています。 'ローカルモジュールに入れる Worksheets("Sheet1").OnData = "ValidateData" '←反応するマクロ名を入れます。 もう少し、詳しいお話があると、直接の回答に結びつくはずです。
お礼
ご回答いただきありがとうございます。 リアルタイムスプレッドシート… はじめて聞きました。 なにぶん初心者なもので、かなり難しいですが 今からいろいろ調べてみたいと思います。 大変勉強になりました。ありがとうございました。
- SherlockHolmes2
- ベストアンサー率40% (175/429)
詳細が分からないので、何とも言えませんが・・。 「戻り値が変化する元となるアクション」が何かしらあるはずですので、そこに着目したら良いかと思いますが。
お礼
ご回答いただきありがとうございます。 なるほど、「戻り値が変化する元となるアクション」 という観点が抜けていました。 勉強になります。ありがとうございます!
お礼
ご回答いただきありがとうございます。 Worksheet_Calculate イベントですか! 最近イベントプロシージャについて勉強をはじめたばかりで calculateイベントについて知りませんでした。 ためしたところ、ばっちりです!できました^^ 要領を得ない質問にも関わらず、丁寧なご回答を ありがとうございました。 大変勉強になりました。