[[20200708185113]] 『複数のWorksheet_Change』(S) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『複数のWorksheet_Change』(S)

特定のセルに特定の文字が入力された際にメッセージを表示するように下記コードをかいたのですが、
(1)(2)の両方を反映させたい場合はどうすればよいでしょうか。
過去ログを参照し色々試してみ間々したがうまくいかないため、
基本的なことで申し訳ないのですがよろしくお願いいたします。

(1)
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo wkError
If Intersect(Target, Range("C12")) Is Nothing Then
Exit Sub
Else
If Target.Value = "TEST A" Then
MsgBox "TEST A!!"
End If
End If
wkError:
Err.Clear
End Sub

(2)
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo wkError
If Intersect(Target, Range("C15")) Is Nothing Then
Exit Sub
Else
If Target.Value = "TEST B" Then
MsgBox "TEST B!!"
End If
End If
wkError:
Err.Clear
End Sub

< 使用 Excel:Excel2013、使用 OS:Windows7 >


 こんな感じで行けると思います。

 Private Sub Worksheet_Change(ByVal Target As Range)
  If Intersect(Target, Range("C12", "C15")) Is Nothing Then Exit Sub
  Select Case Target
   Case Range("C12")
    If Target.Value = "TEST A" Then MsgBox "TEST A!!"
   Case Range("C15")
    If Target.Value = "TEST B" Then MsgBox "TEST B!!"
  End Select
 End Sub
(OK) 2020/07/08(水) 19:11

 OKさんへ
  C12セルに "TEST B" と入っていたらマズくないですか?

(半平太) 2020/07/08(水) 20:40


 2つのセル限定なら・・

 Private Sub Worksheet_Change(ByVal Target As Range)
     Select Case Target.Address(False, False)
         Case "C12"
             If Target.Value = "TEST A" Then
                 MsgBox "TEST A!!"
             End If

         Case "C15"
             If Target.Value = "TEST B" Then
                 MsgBox "TEST B!!"
             End If
     End Select
 End Sub

 何故、On Error GoTo wkError ステートメントが要るのか分からなかったです。

(半平太) 2020/07/08(水) 20:42


>過去ログを参照し色々試して
どのようなアプローチを試してみましたか?

わりと良くある質問の部類に入るとおもいますが…
[[20181213154414]] 『Changeイベント 複数』(初心者)

(もこな2 ) 2020/07/08(水) 20:48


そもそも論でChangeイベントのTargetは複数セルになることがあり得るので、その点を考えなくてよいかでアプローチがちょっと変わってくると思います。

必ず、1セルずつしか変更しないのであれば半平太さんのコードで対応できるとおもいますが、複数セルが同時に変わるようなケースもあり得るなら1セルずつ見る必要が出てきます。

    Private Sub Worksheet_Change(ByVal Target As Range)
        Dim MyRNG As Range, tmpRNG As Range
        Set tmpRNG = Intersect(Target, Range("C12,C15"))

        If Not tmpRNG Is Nothing Then
            For Each MyRNG In Intersect(Target, Range("C12,C15"))
                Select Case MyRNG.Address(False, False)
                    Case "C12"
                        If MyRNG.Value = "TEST A" Then MsgBox "TEST A!!"

                    Case "C15"
                        If MyRNG.Value = "TEST B" Then MsgBox "TEST B!!"
                End Select
            Next MyRNG
        End If
    End Sub

 ※ 既に半平太さんからコメントがありますが、私もエラートラップはいらないような気がします。

(もこな2 ) 2020/07/08(水) 21:56


 > 何故、On Error GoTo wkError ステートメントが要るのか分からなかったです。

 分かりました。

 Targetが複数セルの場合、
 オリジナルのコードはここでトラブるので、その場合はすぐ抜ける為。
          ↓    
 >If Target.Value = "TEST A" Then

(半平太) 2020/07/09(木) 00:02


 >C12セルに "TEST B" と入っていたらマズくないですか?

 ほんとですね。気づきませんでした。テスト不足でした。

 >ChangeイベントのTargetは複数セルになることがあり得るので

 これも考慮不足でした。
(OK) 2020/07/09(木) 07:51

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.