dポイントプレゼントキャンペーン実施中!

例えば、A1、B2、C3セルに「名前の定義」で、それぞれ入力A、入力B、入力C という名前がつけてあります。
それらのセルに入力があった場合、Select Caseで分岐させ作動するマクロをつくりました。
簡略化すると以下のようなもので、一応正しく作動します。

Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("入力A,入力B,入力C")) Is Nothing Then Exit Sub
Select Case Target.Address(0, 0)
Case "A1"
MsgBox "A処理します。"
Case "B2"
MsgBox "B処理します。"
Case "C3"
MsgBox "C処理します。"
End Select
End Sub

ただ、せっかくセルに名前を定義してあるのに、個々の入力セルの判定をTarget.Addressでしているのが不満です。
( ̄~ ̄;)

定義された名前を使えないかと以下のようにやってみましたが実行時エラーで「サポートしてません」となってしまいます。
(T.T)

Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("入力A,入力B,入力C")) Is Nothing Then Exit Sub
Select Case Target.Names.Name 'ここでエラー
Case "入力A"
MsgBox "A処理します。"
Case "入力B"
MsgBox "B処理します。"
Case "入力C"
MsgBox "C処理します。"
End Select
End Sub

どうやったら、Targetに設定されている名前を取得できるのでしょうか?
(^∇^`)?
実際の例はもっと対象が多いので、Select Caseを使わない以下の方法は避けたいのです。

If文の羅列(これでも正しく作動はします。)

Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("入力A,入力B,入力C")) Is Nothing Then Exit Sub

If Not Intersect(Target, Range("入力A")) Is Nothing Then
MsgBox "A処理します。"
ElseIf Not Intersect(Target, Range("入力B")) Is Nothing Then
MsgBox "B処理します。"
Else
MsgBox "C処理します。"
End If

End Sub

なにとぞよろしくお願いします。 (o。_。)oペコッ

A 回答 (2件)

エキスパートさん、遅ればせながら、おめでとさんです!


今年もよろしゅう願います。


>Select Case Target.Names.Name 'ここでエラー

最初の Names のsは省いて、

 Select Case Target.Name.Name

以上です。
 
    • good
    • 0
この回答へのお礼

あ、大師さま、お久しぶりでございます。
ヾ(=^▽^=)ノ
本年もご指導のほどよろしくお願い申し上げます。
(o。_。)oペコッ

明快なご回答ありがとうございます。
それにしても何とも間抜けな質問でした。
/(^o^)\ナンテコッタイ

失礼いたしました。

お礼日時:2008/02/05 13:21

こんにちは^^



サブプロシージャにしてみたら?

あと、名前 TEST1,TEST2 に属するセルが一度に更新された場合
の処理なんかを考えれば、下記のような仕組みでどうですか?

Private Sub Worksheet_Change(ByVal Target As Range)
  
  Dim r As Range, n As Variant
  
  For Each n In Array("TEST1", "TEST2", "TEST3")
    Set r = Intersect(Range(n), Target)
    If Not r Is Nothing Then
      Call ChangeEventSubProcedure(r, n)
    End If
  Next
  Set r = Nothing

End Sub

Private Sub ChangeEventSubProcedure( _
  ByVal r As Range, _
  ByVal sRngName As String _
)
  Dim s As String
  Select Case sRngName
    Case "TEST1": s = r.Address & vbLf & "A 処理"
    Case "TEST2": s = r.Address & vbLf & "B 処理"
    Case "TEST3": s = r.Address & vbLf & "C 処理"
  End Select
  MsgBox s

End Sub
    • good
    • 0
この回答へのお礼

KenKen_SPさま、いつもありがとうございます。
こういうやり方があるんですね、勉強になります。
これからもご指導くださいませ。

お礼日時:2008/02/05 14:21

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

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


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