• ベストアンサー

エクセルVBAでTargetのセルに設定された「名前の定義」の取得方法は?

例えば、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ペコッ

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

  • ベストアンサー
回答No.1

エキスパートさん、遅ればせながら、おめでとさんです! 今年もよろしゅう願います。 >Select Case Target.Names.Name 'ここでエラー 最初の Names のsは省いて、  Select Case Target.Name.Name 以上です。  

merlionXX
質問者

お礼

あ、大師さま、お久しぶりでございます。 ヾ(=^▽^=)ノ 本年もご指導のほどよろしくお願い申し上げます。 (o。_。)oペコッ 明快なご回答ありがとうございます。 それにしても何とも間抜けな質問でした。 /(^o^)\ナンテコッタイ 失礼いたしました。

その他の回答 (1)

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.2

こんにちは^^ サブプロシージャにしてみたら? あと、名前 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

merlionXX
質問者

お礼

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