- ベストアンサー
セルの値が変ると自動でマクロが実行される。
セルの値が変ると自動でマクロが実行されるVBAを教えて下さいm(_ _ )m 例えば、シート1のA1の値が変ると、マクロAが実行される。 シート1のA2の値が変ると、マクロBが実行される。 と一つのシート内に複数のイベントを設置したのですが、イマイチわかりません。 知恵をお貸し下さい。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは お邪魔します。 (1)まずはオーダー通りの基本型 Private Sub Worksheet_Change(ByVal Target As Range) ' ' 複数セルが変更された場合(単セルでない場合)は処理を抜ける If Target.Count > 1 Then Exit Sub ' ' 変更されたセルが1列めでない場合は処理を抜ける If Target.Column <> 1 Then Exit Sub ' ' 変更されたセルの行位置によって処理を分岐する Select Case Target.Row Case 1 ' A1 の場合の処理 MsgBox "A1" ' 確認用(確認が済んだら当行削除) Case 2 ' A2 の場合の処理 MsgBox "A2" ' 確認用(確認が済んだら当行削除) End Select End Sub (2)セルの位置によってもっと細かく分岐したい場合 Private Sub Worksheet_Change(ByVal Target As Range) ' ' 複数セルが変更された場合(単セルでない場合)は処理を抜ける If Target.Count > 1 Then Exit Sub ' ' 変更されたセルの 列位置 によって処理を分岐する Select Case Target.Column Case 1 ' 1列めなら ' ' 変更されたセルの 行位置 によって処理を分岐する Select Case Target.Row Case 1 ' 1列め の 1行め なら ' A1 の場合の処理 MsgBox "A1" ' 確認用(確認が済んだら当行削除) Case 2 ' 1列め の 2行め なら ' A2 の場合の処理 MsgBox "A2" ' 確認用(確認が済んだら当行削除) End Select Case 2 ' 2列めなら ' ' 変更されたセルの 行位置 によって処理を分岐する Select Case Target.Row Case 1 ' 2列め の 1行め なら ' B1 の場合の処理 MsgBox "B1" ' 確認用(確認が済んだら当行削除) Case 2 ' 2列め の 2行め なら ' B2 の場合の処理 MsgBox "B2" ' 確認用(確認が済んだら当行削除) End Select End Select End Sub (3)セルのアドレスを採り文字列で分岐したい場合 (個人的にはあまりお奨めしていませんが、知っておいた方が好いもの) Private Sub Worksheet_Change(ByVal Target As Range) '' ' 変更されたセルの 参照文字列(A1型) によって処理を分岐する Select Case Target.Address(False, False) Case "A1" MsgBox "A1" ' 確認用(確認が済んだら当行削除) Case "A2" MsgBox "A2" ' 確認用(確認が済んだら当行削除) Case "B1" MsgBox "B1" ' 確認用(確認が済んだら当行削除) Case "B2" MsgBox "B2" ' 確認用(確認が済んだら当行削除) End Select End Sub とりあえず、単セルの場合だけ、理解を深めてみましょう。 複数セルに値変更があった場合については、その後でいいと思います。 (1)にある If Target.Count > 1 Then Exit Sub If Target.Column <> 1 Then Exit Sub のような記述はイベントプロシージャでは多用される基本中の基本ですから よーく咀嚼して呑み込んじゃってください。 一応、いわずもがなですが、 上に挙げたようなイベントプロシージャを複数併記することはできませんので 使わないものはコメントブロックして下さい。 VBE(Visual Basic Editor)のツールバーに[編集]というのを追加してあれば [コメントブロック]、[非コメントブロック]というボタンがありますので適宜。 また、イベントプロシージャで注意するべき点として 例えば今回のChangeイベントの処理中にセルの値を変更すれば 再度Changeイベントが呼び出される(再帰)ということを知っておいてください。 その場合、 Application.EnableEvents = False ' 処理 Application.EnableEvents = True のような形で、再帰を回避します。 私自身VBAを覚え初めの頃は、イベントプロシージャとばかり格闘して 日に何百回もエラーを出しながら納得がいくまで色んなことを試していた覚えがあります。 ・オブジェクトやプロパティの基本的な扱い方 ・条件分岐 などの基本事項を覚えるのには最適の課題ですから、頑張って挑戦し続けてください。 以上です。 /// Re:#2 ちょっと違うかも。 それは、「A1 と 同じ値 に変更された セル があった場合」の処理になっています。 Private Sub Worksheet_Change(ByVal Target As Range) If Target = Range("A1") Then MsgBox Target.Address End If End Sub として、例えば、C3セルにA1と同じ値を設定すると違うのがわかると思います。 あしからず、、、
その他の回答 (3)
- cj_mover
- ベストアンサー率76% (292/381)
どうも > 色々試してわかったことがあるのですが、セル値の変更はwebクエリで更新された場合は判定されないのでしょうか。 答えは「はい(No)」です。 Changeイベントは、WEBクエリの更新を契機(トリガー)にすることはできません。 「Webクエリの更新に連動したイベント」ということになると、 かなり高度な複合技という感じでしょうか。 いくつか方法はあるようですが私にとっては不得手なジャンルですし '回答というレベル'で書けるものは持ち合わせていませんので、ご容赦を。 もしそのテーマについて、別途質問されるのでしたら使用環境などの詳細を示した方が良さそうです。 (私宛ではないですが) > 例えばChangeターゲットのセルはA1なのですが、A1は(=B1)の数式の場合、B1の数値が変ってもターゲットがA1の場合は更新の判定がされません。 Changeイベントは計算の結果として値変更されたものを返しませんから その意味では正常な動作です。 方法としては Worksheet_Calculateイベントを使って工夫する手もありますが この例では参照先(B1)の変更をChangeイベントで追う方が 一般的でしょうね。 それでは、また
お礼
大変勉強になりました。 回答ありがとうございましたm(_ _ )m
- KURUMITO
- ベストアンサー率42% (1835/4283)
シート1のシート見出しを右クリックして「コードの表示」を選択します。 コードは次のようにすることでもしA1が変わればマクロAがA2が変わればマクロBが実行されますね。 Private Sub Worksheet_Change(ByVal Target As Range) If Target = Range("A1") Then 'マクロAの内容 End If If Target = Range("A2") Then 'マクロBの内容 End If End Sub または 例えばマクロAの内容を Sub マクロA() マクロAの内容 End Sub マクロBの内容を Sub マクロA() マクロAの内容 End Sub と別に用意しておきそれらを呼び出すような形にします。 Private Sub Worksheet_Change(ByVal Target As Range) If Target = Range("A1") Then Call マクロA End If If Target = Range("A2") Then Call マクロB End If End Sub
補足
思っていた通りの事が出来ましたm(_ _ )mありがとうございます。 ただ、ひとつ疑問点が・・・ 例えばChangeターゲットのセルはA1なのですが、A1は(=B1)の数式の場合、B1の数値が変ってもターゲットがA1の場合は更新の判定がされません。 これを判定する方法などありますでしょうか。
- mekuriya
- ベストアンサー率27% (1118/4052)
【VBA】エクセルシート上のある1つのセルの値が更新される度にVBAを実行する方法 - Yahoo!知恵袋 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1228057787
お礼
とても丁寧な回答ありがとうございますm(_ _ )m 凄く勉強になります。 色々試してわかったことがあるのですが、セル値の変更はwebクエリで更新された場合は判定されないのでしょうか。