• ベストアンサー

エクセル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さま、いつもありがとうございます。 こういうやり方があるんですね、勉強になります。 これからもご指導くださいませ。

関連するQ&A

  • Worksheet_Change、名前の定義で分岐

    エクセル2010です。 Worksheet_Change イベントで、名前の定義で分岐させようと思います。 下記二つの方法は思いつきましたが、ほかにもっと良い方法はないでしょうか? 実際にはもっとたくさんの名前の定義があります。 ・Intersectで見る方法 Private Sub Worksheet_Change(ByVal Target As Range)   Select Case True   Case Not Application.Intersect(Target, Range("見積日")) Is Nothing     Range("有効期限").Value = Range("見積日").Value + 60   Case Not Application.Intersect(Target, Range("Trigger")) Is Nothing     If Target(1).Value = "AAAA" Then '(1)は結合セルクリア対策       MsgBox "BBBBを入力してください。"       Range("BBBB").Select     Else       Range("BBBB").MergeArea.ClearContents     End If   Case Not Application.Intersect(Target, Range("BBBB")) Is Nothing     If Target(1).Value = "日付入力" Then       Range("BBBB").Value = InputBox("日付を入力してください。")     End If   End Select End Sub ・アドレスで見る方法 Private Sub Worksheet_Change(ByVal Target As Range)   Select Case True   Case Target(1).Address = Range("見積日")(1).Address     Range("有効期限").Value = Range("見積日").Value + 60   Case Target(1).Address = Range("Trigger")(1).Address     If Target(1).Value = "AAAA" Then '(1)は結合セルクリア対策       MsgBox "BBBBを入力してください。"       Range("BBBB").Select     Else       Range("BBBB").MergeArea.ClearContents     End If   Case Target(1).Address = Range("BBBB")(1).Address     If Target(1).Value = "日付入力" Then       Range("BBBB").Value = InputBox("日付を入力してください。")     End If   End Select End Sub

  • エクセルVBAにて指定範囲以外処理時複数セルの場合エラーになる。

    エクセルVBAにて '処理を実行する、セルの選択範囲を指定して処理を実行後 '範囲外の処理を下記の通り処理できますが、 Else C = Split("0 0 0 0 0") End If 複数のセルを選択した場合エラーになります。 エラーにならない処理方法を教えて下さい。 例 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim C As Variant Dim i As Integer If Not Intersect(Range("e36:i40"), Target) Is Nothing Then Target) Is Nothing Then Exit Sub Select Case Target.Row Case 36 C = Split("3 0 0 0 0") Case 37 C = Split("0 3 0 0 0") Case 38 C = Split("0 0 3 0 0") Case 39 C = Split("0 0 0 3 0") Case 40 C = Split("0 0 0 0 3") End Select Else C = Split("0 0 0 0 0") End If For i = 0 To 4 ActiveSheet.Shapes(i + 1).Select Selection.Font.ColorIndex = C(i) Next i Target.Select End Sub

  • エクセル VBA シートの選択 

    windows XP でエクセル2000を使っています。 Sub aaa() Sheets("Sheet1").Select Dim a As String a = Cells(2, 4) Sheets(a).Select Range("A1").Select End Sub というマクロだと セルに入っている値のシート名を探してくれます。 ですが Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) If Intersect(Target, Range("B11:b683")) Is Nothing Then Exit Sub Worksheets("Sheet1").Range("C2").Value = Target.Value Dim b As String b = Range("C2).value (←ここをcellsにしてもダメ) Sheets(b).Select Range("A1").Select End Sub これだとsheets(b)を選びません。Sheets(b).Selectのところが黄色くなります。 何処が間違えているのでしょうか。 全くの素人ですが、仕事で必要に迫られています。 わかりやすく回答・解説くれると助かります。

  • エクセル VBA の質問です。

    A2~A20までのセルに文字を入力した段階で、それぞれB2~B20に入力日時を入れるVBAを以下のように組んでいます。 しかし、同様の条件を同一シートのE2~E20・F2~F20にも入力・自動表示できるようにしなければならなくなり、困っています。 どのように記述を変えればよいのか、教えていただけたらと思います。 宜しく御願いいたします。 Sub Worksheet_change(ByVal Target As Range) Dim Rng As Range Dim c As Range Set Rng = Range("A2:A20") If Intersect(Target,Rng) Is Nothing Then Exit Sub For Each c In Intersect(Target,Rng) If Not IsEmpty(c) Then c.Offset(, 1).Value = Now Else c.Offset(, 1).ClearContents End If Next Rng.Offset(, 1).EntireColumn.AutoFit End Sub 申し訳ありませんが、何卒、宜しく御願いいたします。

  • エクセルVBA SelectCaseを使用したい

    エクセル勉強中の者です。 SelectCaseを使って特定セルの色を変えたいのですが上手く動作しません。 目的の動作 1:A1セルに数字を入力 2:A1に入力された数字を基にセルB1:B6に色を付ける これを目標に作成したプログラム Private Sub Worksheet_Change(ByVal Target As Range) Dim mycolor As Range Dim boxcolor As Range Set mycolor = Intersect(Target, Range("A1")) Set boxcolor = Intersect(Target, Range("B1:B6")) If Not mycolor Is Nothing Then For Each mycolor In Target Select Case Target.Value Case Is = 1 boxcolor.ColorIndex = 3 Case Is = 2 boxcolor.ColorIndex = 5 Case Is = 3 boxcolor.ColorIndex = 4 Case Is = 4 boxcolor.ColorIndex = 6 Case Else boxcolor.ColorIndex = xlAutomatic End Select Next mycolor End If End Sub 実行するとSelect Caseの最初で止まってしまいます。 何だか変数を上手く指定出来ていないような・・・? 色々と調べて手を加えてみましたが成功に至りませんでした。 お手数掛けますが御指導お願い致します。 ちなみにExcelはバージョン2002を使用しております。

  • エクセル イベントマクロのエラー回避

    イベントマクロを初めて書いてみたのですが A列を全部選択して削除などをするとエラーがて出てしまいます 回避するにはどのようにしたら良いのでしょうか? Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("A:A")) Is Nothing Then Select Case Target.Value Case Is = "りんご" cellColor = 3 Case Is = "みかん" cellColor = 6 End Select End If If Not Intersect(Target, Range("B:B")) Is Nothing Then Select Case Target.Value Case Is = "りんご" cellColor = 6 Case Is = "みかん" cellColor = 3 End Select End If Target.Interior.ColorIndex = cellColor End Sub 以上が書いたものです。 皆様の知恵お貸しください 宜しくお願いします。

  • エクセルVBAのDeleteキーによるエラー

    VBA初心者です。エクセル(2003)のVBAについて質問です。 セルに何か値が入力されたら、隣のセルに「TRUE」と入力し、 入力が消去されたら、隣のセルに「FALSE]と入力されるマクロを作成しています。 下記のコードをシートモジュールに入力し、 標準モジュールにはそれぞれ呼び出し用のマクロを入力しています。 A列とB列は結合されていて、その結合されたA・B列のセルに値が入力されたり消去されたりすると 隣のC列に結果が入力されるようにしたいのですが、 A・B列の値をDeleteキーで消去するとエラーになってしまいます。 BSキーで値を消去するとエラーは出ません。 Deleteキーでもエラーが出ない様にする方法はありますでしょうか。 どなたかご教授お願いします。 ----------------------------------------------------- Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("A1:B1,A3:B3,A5:B5")) Is Nothing Then If Target.Value <> "" Then Select Case Target.Address(0, 0) Case "A1" Call マクロ1_TRUE Case "A3" Call マクロ3_TRUE Case "A5" Call マクロ5_TRUE End Select ElseIf Target.Value = "" Then Select Case Target.Address(0, 0) Case "A1" Call マクロ1_FALSE Case "A3" Call マクロ3_FALSE Case "A5" Call マクロ5_FALSE End Select End If End If End Sub

  • エクセルVBAのイベントについて教えてください。

    エクセルVBA初学者のです。 "C9"にいれるとchangeイベントが発生するコードなんですが、 "C9"のほかに"D1"においてもchangeイベントを発生させたいのですが 下記のコードに続けて書いてもイベントが発生しないのですが どのように書けばよいのでしょうか? private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("C9")) Is Nothing Then Exit Sub Range("H14:H56").Interior.ColorIndex = 2 If Intersect(Target, Range("D1")) Is Nothing Then Exit Sub Range("G14:G56").Interior.ColorIndex = 2 End Sub よろしくお願いします。

  • エクセルのマクロ

    セルの値が変わったら動くマクロですが、2つ書くとエラーが出ます。 どのように直したらいいでしょうか? Private Sub Worksheet_Change(ByVal Target As Range) Select Case Target.Address If Intersect(Target, Range("EK22")) Is Nothing Then Exit Sub Else Range("EK24:EM28").Select Selection.ClearContents End If End Sub Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("EK24")) Is Nothing Then Exit Sub Else Range("EK27:EM28").Select Selection.ClearContents End If End Sub

  • エクセルのVBAについて教えてください。

    エクセルのVBAについて教えてください。 下記のような構文で、Dの行にAやBの文字が入力された時、その都度 セルの色が変わるようにはできたのですが、本当は、「C5」セルに文字が 入力された時、「C5」だけでなく「B5:J5」の範囲でセルの色を変えたい のですが、どうすれば良いのでしょうか。 ご存知の方是非教えてください。 Private Sub Worksheet_Change(ByVal Target As Range) Dim myColor As Integer If Target.Count > 1 Then Exit Sub If Target.Column <>4 Then Exit Sub Select Case Target.Value Case "A" myColor = 34 '水色 Case "B" myColor = 40 '肌色 Case Else myColor = xlNone End Select Target.Interior.ColorIndex = myColor End Sub

専門家に質問してみよう