プロが教えるわが家の防犯対策術!

セルの値が変ると自動でマクロが実行されるVBAを教えて下さいm(_ _ )m
例えば、シート1のA1の値が変ると、マクロAが実行される。
シート1のA2の値が変ると、マクロBが実行される。
と一つのシート内に複数のイベントを設置したのですが、イマイチわかりません。
知恵をお貸し下さい。

A 回答 (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と同じ値を設定すると違うのがわかると思います。
あしからず、、、
    • good
    • 6
この回答へのお礼

とても丁寧な回答ありがとうございますm(_ _ )m
凄く勉強になります。
色々試してわかったことがあるのですが、セル値の変更はwebクエリで更新された場合は判定されないのでしょうか。

お礼日時:2012/07/14 19:02

どうも


 
> 色々試してわかったことがあるのですが、セル値の変更はwebクエリで更新された場合は判定されないのでしょうか。
 
答えは「はい(No)」です。
Changeイベントは、WEBクエリの更新を契機(トリガー)にすることはできません。
「Webクエリの更新に連動したイベント」ということになると、
かなり高度な複合技という感じでしょうか。
いくつか方法はあるようですが私にとっては不得手なジャンルですし
'回答というレベル'で書けるものは持ち合わせていませんので、ご容赦を。
もしそのテーマについて、別途質問されるのでしたら使用環境などの詳細を示した方が良さそうです。
 
(私宛ではないですが)
> 例えばChangeターゲットのセルはA1なのですが、A1は(=B1)の数式の場合、B1の数値が変ってもターゲットがA1の場合は更新の判定がされません。
 
Changeイベントは計算の結果として値変更されたものを返しませんから
その意味では正常な動作です。
方法としては
Worksheet_Calculateイベントを使って工夫する手もありますが
この例では参照先(B1)の変更をChangeイベントで追う方が
一般的でしょうね。
 
それでは、また
    • good
    • 0
この回答へのお礼

大変勉強になりました。
回答ありがとうございましたm(_ _ )m

お礼日時:2012/07/15 07:51

シート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の場合は更新の判定がされません。
これを判定する方法などありますでしょうか。

補足日時:2012/07/14 17:32
    • good
    • 1

【VBA】エクセルシート上のある1つのセルの値が更新される度にVBAを実行する方法 - Yahoo!知恵袋


http://detail.chiebukuro.yahoo.co.jp/qa/question …
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A