こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

エクセル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ペコッ

投稿日時 - 2008-02-05 09:51:51

QNo.3746119

困ってます

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

エキスパートさん、遅ればせながら、おめでとさんです!
今年もよろしゅう願います。


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

最初の Names のsは省いて、

 Select Case Target.Name.Name

以上です。
 

投稿日時 - 2008-02-05 11:47:36

お礼

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

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

失礼いたしました。

投稿日時 - 2008-02-05 13:21:00

このQ&Aは役に立ちましたか?

6人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.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

投稿日時 - 2008-02-05 13:14:24

お礼

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

投稿日時 - 2008-02-05 14:21:28

あなたにオススメの質問