• ベストアンサー

”戻り値”が変化したときに、マクロを実行したい

超初心者です。 セルの値が変化したときにマクロが実行されるようなものを作りたいです。 セルに入力されているのは、”関数”です。 なので、関数の”戻り値”が変化したときにマクロを実行したいのです。 今は、戻り値が変化しても式自体が変わっていないため マクロが実行されません。 (セルの式を切り取ってもう一度貼りなおせば、マクロは実行される) ちなみに今は Private Sub Worksheet_Change(ByVal Target As Range) で書いています。 まずVBAの勉強をしろと言われてしまいそうですが><; 何卒アドバイスのほどよろしくお願いいたします!

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

  • ベストアンサー
  • end-u
  • ベストアンサー率79% (496/625)
回答No.2

セルの数式が計算された時に実行されるイベントプロシージャとして 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セルを記憶用セルとして使うようにしています。

neomame
質問者

お礼

ご回答いただきありがとうございます。 Worksheet_Calculate イベントですか! 最近イベントプロシージャについて勉強をはじめたばかりで calculateイベントについて知りませんでした。 ためしたところ、ばっちりです!できました^^ 要領を得ない質問にも関わらず、丁寧なご回答を ありがとうございました。 大変勉強になりました。

その他の回答 (2)

回答No.3

こんばんは。 >関数の”戻り値”が変化したときにマクロを実行したいのです。 何がイベントの信号となるのか、書かれていませんので、私も#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" '←反応するマクロ名を入れます。 もう少し、詳しいお話があると、直接の回答に結びつくはずです。

neomame
質問者

お礼

ご回答いただきありがとうございます。 リアルタイムスプレッドシート… はじめて聞きました。 なにぶん初心者なもので、かなり難しいですが 今からいろいろ調べてみたいと思います。 大変勉強になりました。ありがとうございました。

回答No.1

詳細が分からないので、何とも言えませんが・・。 「戻り値が変化する元となるアクション」が何かしらあるはずですので、そこに着目したら良いかと思いますが。

neomame
質問者

お礼

ご回答いただきありがとうございます。 なるほど、「戻り値が変化する元となるアクション」 という観点が抜けていました。 勉強になります。ありがとうございます!

関連するQ&A

  • エクセルマクロ(VBA)で指定したセルが変化したときに実行するには?

    VBAでsheetの中のworksheet_changeなどでマクロを書くと、そのシー トの中のどのセルを変化させてもマクロが実行されるのですが、これ を、A1とc1とc2が変化したときだけ処理を実行させたいのです。 以下のマクロのどこかを編集すると、そのようなことが出来るのでし ょうか? Private Sub Worksheet_SelectionChange(ByVal Target As Range) ----実行する内容---- End Sub Private Sub Worksheet_Change(ByVal Target As Range) ----実行する内容---- End Sub

  • エクセルVBAに関して

    VBAの知識があまりないので教えて頂きたいのですが、セルの内容が変更されたら マクロが実行される Private Sub Worksheet_Change(ByVal Target As Range) というのがあるかと思います。 セルに書かれた関数によって、セルの内容が変化したときにマクロが実行されるVBA関数はあるのでしょうか?

  • EXCELでセルの値が変化したときだけにマクロ実行

    教えてください。 EXCELのA1セルの値が1→0に変化したときにMacro1を実行、0→1に変化したときにMacro2を実行したいと思い、以下のマクロを「シート名タブ右クリック」→「コードの表示」で開く画面に打ちました。 そうしたところキーボードからA1セルに1や0を打ち込むとMacro1・Macro2を実行するのですが。A1セルに関数式を入れ自動で1→0・0→1に変化してもMacro1・Macro2が実行されません。この場合どう修正すればMacroが実行されるようになりますか? ※ちなみにA1セルの関数式はある条件を満たしたら1、そうでない時0という式です。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$A$1" And Target.Value = 0 Then Macro1 End If If Target.Address = "$A$1" And Target.Value = 1 Then Macro2 End If End Sub

  • Excelでセルの値を変化させた時にマクロを実行するには?

    "A1"のセルに値を入れるとマクロが実行するように組んだのですが、問題が発生しました。 Private Sub Worksheet_Change(ByVal Target As Range) If Target = Range("A1") Then      cells(1,2)=5      ・・・・ End If End Sub ここでA1に"5"を入力すると、B1に5と入力されるのですが、Target=5と認識してしまい、A1と同じ値になるので無限ループになってしまいます。 なにか回避策はないでしょうか? よろしくお願いします。

  • VBA マクロを動かさない

    (1)ある行のセルを変更したら動くマクロがあります。  Private Sub Worksheet_Change(ByVal Target As Range) (2)ある行のセルに数値を入れるマクロがあります。  Private Sub CommandButton_Click() (2)のマクロが動くと(1)がその後に発動して上書きをしてしまうようです。 これを発動させないようにスキップするにはどうしたらいいのでしょうか?

  • エクセルでセルに文字が入力されたらマクロを実行

    前回どなたかが質問されて回答を見せてもらったら私のやりたいことと同じだったので実行してみましたが出来なかったのでもう一度質問をさせてください。 1.実行したのですが、なにも実行されません。 2.実行したらメッセジBOXだけは実行するのですが、後のコマンドが実行されずにエラーになります。 もう一度詳しく教えてください。 マクロ初心者ですよろしくお願いします。 1.【シートモジュールで条件判定し、マクロを起動する】 通常はこちらの方法が使われます。 Private Sub Worksheet_Change(ByVal Target As Range)   '変化のあったセルがA1セルか?   If Target.Address = "$A$1" Then      '条件判定:A1セルの値は 1 か?     If Target.Value = 1 Then       MsgBox "A1セルは条件を満たしました"     End If   End If End Sub 2.【ワークシート上で条件判定し、マクロを起動する】 処理内容にもよっては不向きな場合もありますが、こんな方法も あります。 マクロを Sub ではなく、Function 、、つまり関数にしてしまいます。 Function TestMacro() '<-- Sub を Function に替える   MsgBox "A1セルは条件を満たしました"   TestMacro = "" '戻り値はなし End Function そして、ワークシートの B1 セルに次の式を入力します。()は必須 です。  =IF(A1=1,TestMacro(),"")

  • エクセルVBAでセル変化したら別のセルへコピーする

    おはようございます。VBAをはじめて浅い初心者です。 あるセルに数字および文字列が入力されたら違うセルへコピーしたいのですがどのようにすればできますか。 Private Sub Worksheet_Change(ByVal Target As Range)とか 使用してつくればいいのですか?教えてください。

  • エクセルVBAについて、ある領域の中のセルが変化したらマクロが実行され

    エクセルVBAについて、ある領域の中のセルが変化したらマクロが実行される方法を教えて下さい。 下記のようなイメージです。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If ActiveCell.Columns("A:A") Then 上記のようなイメージで2通り教えて下さい。 ・A列が選択された時 ・A列のうちで例えばA3セル以降が選択された時 宜しくお願いします。

  • エクセル95のマクロ

    エクセル95で Private Sub Worksheet_Change(ByVal Target As Range)  というのは使えるんでしょうか? リターン押したときに移るセルを操作したいので 代わりになるものでもあれば教えて頂きたいです。 よろしくお願いします。

  • エクセルのマクロ

    セルの値が変わったら動くマクロですが、2つ書くとエラーが出ます。 どのように直したらいいでしょうか? Private Sub Worksheet_Change(ByVal Target As Range) Select Case Target.Address If Intersect(Target, Range("EK22")) Is Nothing Then Exit Sub Else Range("EK24:EM28").Select Selection.ClearContents End If End Sub Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("EK24")) Is Nothing Then Exit Sub Else Range("EK27:EM28").Select Selection.ClearContents End If End Sub

専門家に質問してみよう