• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBAでセル範囲の「名前の定義」の有無を取得)

VBAでセル範囲の「名前の定義」の有無を取得

このQ&Aのポイント
  • エクセルのセル範囲に名前の定義を定義していますが、その有無を取得するためにVBAを使用する方法について教えてください。
  • 名前の定義されたセル範囲を変更する際に、エラーが発生してしまいます。正しい方法で名前の定義の有無を取得して分岐させる方法を教えてください。
  • エラーで判断するのではなく、名前の定義の有無を確認して処理を分岐する方法について教えてください。

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

  • ベストアンサー
  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.1

エラーで判断するのが正しいやり方ではないなどとは言えないと思います。 それで安全に動けばいいのではないですか。 nameを調べるなら、全部のnameにあたるしかないでしょう。 次のようなコードでどうでしょう。 Private Sub Worksheet_Change(ByVal Target As Range) Dim x As String, ad As String, lad As Integer ad = Target.Address lad = Len(ad) For Each nm In ActiveWorkbook.Names If ad = Right(nm.RefersTo, lad) Then x = Target.Name End If Next If x = "" Then Exit Sub Select Case Target.Name.Name Case "住所" Range("送付先住所").Value = Target.Value Case "氏名" Range("送付先氏名").Value = Target.Value End Select End Sub

emaxemax
質問者

お礼

さっそくありがとうございます。 全部の「名前の定義」に総当りしなければいけないということは、ある任意のセルに名前が定義されているかどうかを直接取得する方法はないということなのでしょうか。

その他の回答 (3)

  • end-u
  • ベストアンサー率79% (496/625)
回答No.4

>「名前の定義」の有無を取得 するわけではないですが、提示の例題に限って言えば、 Private Sub Worksheet_Change(ByVal Target As Range)   Application.EnableEvents = False   With Target     Select Case True     Case Not Intersect(.Item(1), Range("住所")) Is Nothing       Range("送付先住所").Value = .Value     Case Not Intersect(.Item(1), Range("氏名")) Is Nothing       Range("送付先氏名").Value = .Value     End Select   End With   Application.EnableEvents = True End Sub このように、とにかくIntersectメソッド実行してNothing判定という方法もあるかもしれません。 ただ、 Range("住所")とRange("氏名")を含めたセル範囲を同時に選択してクリアしたり、 などはどういう対応になりますか? そのケースも考慮するなら、 それぞれIntersectメソッドの結果を取得して処理する必要があります。 Private Sub Worksheet_Change(ByVal Target As Range)   Dim r As Range   Application.EnableEvents = False   Set r = Intersect(Target, Range("住所"))   If Not r Is Nothing Then     Range("送付先住所").Value = r.Value   End If   Set r = Intersect(Target, Range("氏名"))   If Not r Is Nothing Then     Range("送付先氏名").Value = r.Value   End If   Application.EnableEvents = True End Sub でも提示のケースはあくまで例題なのですよね? それだけの用途なら関数をセットしておくほうが簡単な気がします。

emaxemax
質問者

お礼

ありがとうございます。 勉強になります。

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.3

#1です。 補足について、 Rangeオブジェクトのメンバーに、nameを持つかどうかの判定できるようなプロパティはないと思います。 したがって、総当たりになります。 このような場合エラーで判断する方法もありかと思いますが、質問の場合はエラーの限定がし難い(1004じゃ広すぎる)ので、適切ではないかもしれません。

emaxemax
質問者

お礼

ありがとうございます。

  • kybo
  • ベストアンサー率53% (349/647)
回答No.2

以下の様な記述でもいいです。 Private Sub Worksheet_Change(ByVal Target As Range) Dim x As String Dim N As Name For Each N In ActiveWorkbook.Names If Not Intersect(Target, Range(N.RefersToLocal)) Is Nothing Then x = N.Name Exit For End If Next N If x = "" Then Exit Sub Select Case x Case "住所" Range("送付先住所").Value = Target.Value Case "氏名" Range("送付先氏名").Value = Target.Value End Select End Sub

emaxemax
質問者

お礼

ありがとうございます。 この方法も総当りで調べるのですね。 直接、名前の定義の有無を取得する方法はないのですね?

関連するQ&A