• ベストアンサー

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

すいませんが教えてもらえませんか。 タイトル通り、EXCELのある箇所(例としてA1セル)の値が1→0に変化した ときに1度だけ Macro1を実行したいと思うのですが、A1のセルに式をどう 記述したらいいかわからずに困っています。 教えてもらえると助かります。 よろしくお願いします。

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

  • ベストアンサー
  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.1

A1セルの値が0になったときだけマクロを動かしたいなら以下のマクロを「シート名タブ右クリック」→「コードの表示」で開く画面に貼り付ければ良いです。シートに戻りA1に0を入力してみてください Private Sub Worksheet_Change(ByVal Target As Range)  If Target.Address = "$A$1" And Target.Value = 0 Then    'ここに『処理』を書く    MsgBox("A1が0になりました") End If End Sub 『処理』の箇所はA1が0になったとき毎回実行されます。でも質問にある  >1→0に変化したときに1度だけ Macro1を実行 は「前回値が1以外なら処理しない」とか「二回目に0になったときには処理をしない」などの可能性が読み取れます。 その場合ワークシートのどこかに前回値や処理を実行したことを示すフラグを書いておけば対応はできますので、ご自身で試してみてください

koro_koro_koro
質問者

お礼

ありがとうございました。早速試したらできました。

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.2

「1度だけMacro1を実行」というのは、Macro1が実行されたら、再びそのセルの値が1→0に変化してもMacro1は実行されない、ということでしょうか。 標準モジュールに、 Public Val1 As Integer Public Macro1Executed as Boolean と記述しておき、(変数名は適当です。A1の型がInteger以外なら正しい型に変えてください) ThisWorkbookに、 Private Sub Workbook_Open()  Val1 = Worksheets("Sheet1").Range("A1").Value End Sub と記述し、シートモジュールに、 Private Sub Worksheet_Change(ByVal Target As Range)  Dim R As Range  Set R = Intersect(Target, Range("A1"))  If R Is Nothing Then Exit Sub  If Val1 = 1 And R.Value = 0 And Macro1Executed = False Then   Macro1   Macro1Executed = True  End If  Val1 = R.Value End Sub と記述してください。 ただし、一度ブックを閉じて開いたら、またA1のセルが1→0に変化したときにMacro1が実行されます。「1度だけMacro1を実行」というのが、そのファイルを開いているときだけで、いったん閉じて開きなおしたときはまたMacro1は実行される、というのであればこれでいいのですが、そうでなくて、「一度Macro1が実行されたらブックを開き直しても二度と実行されない」というのであれば、どこかのセルにMacro1実行されたかどうかの情報を隠し持つ必要があります。

koro_koro_koro
質問者

お礼

ありがとうございます。なるほど、ブックを開いたときに1度だけ実行と いうのもいつか使用するかもしれません。大変参考になりました。

koro_koro_koro
質問者

補足

すいません。書き方が悪くて、1度だけというのはセルの内容が1→0になったら 1回のみマクロ実行、更に1→0になったら1回のみマクロ実行という意味でした。 ブックを開いて、A1セルが1度だけという認識を与えてしまってごめんなさい。

すると、全ての回答が全文表示されます。

関連するQ&A