Name

Workbook

1. はじめに

Excelでは、セル範囲や数式、定数などに「名前付き定義(Named Range)」を付けることができ、これを使うことで可読性や再利用性が大きく向上します。

VBAでこの「名前付き定義」を操作するのが、Nameオブジェクトです。
このオブジェクトは、ワークブックまたはワークシートに定義された名前とその参照先(数式やセル範囲など)を制御するために使用されます。


2. Nameオブジェクトの概要

  • Nameオブジェクトは、1つの名前付き定義を表します。
  • すべての名前付き定義は、Workbook.Names または Worksheet.Names コレクションとして保持されます。
  • 名前付き定義には、セル範囲だけでなく、数式、定数、関数の名前も指定できます。

3. Nameオブジェクトの構造とプロパティ

主なプロパティ一覧

プロパティ説明
Name名前定義の名前(例: “MyRange”)
RefersTo名前が参照する範囲や数式(文字列形式、例: =Sheet1!$A$1:$B$10
RefersToRangeRefersTo がセル範囲を指す場合の Range オブジェクト
Visible名前を名前管理画面に表示するかどうか
Comment名前の説明コメント
Workbook名前が属するワークブック
IndexNames コレクション内でのインデックス

4. 名前付き定義の作成(追加)

4-1. ワークブックレベルで作成

Sub 名前定義追加_ワークブック()
ThisWorkbook.Names.Add Name:="SalesRange", RefersTo:="=Sheet1!$A$1:$A$10"
End Sub

4-2. ワークシートレベルで作成

Sub 名前定義追加_ワークシート()
Dim ws As Worksheet
Set ws = Worksheets("Sheet1")

ws.Names.Add Name:="LocalRange", RefersTo:="=$B$1:$B$10"
End Sub
  • ワークシートレベルで定義された名前は、他のシートから参照できません。
  • RefersTo の値は 文字列で = を含む必要があります。

5. 名前付き定義の取得と操作

5-1. 参照先の取得・変更

Sub 名前の参照先操作()
Dim nm As Name
Set nm = ThisWorkbook.Names("SalesRange")

MsgBox nm.RefersTo ' 現在の参照先を表示

' 新しい参照先に変更
nm.RefersTo = "=Sheet1!$C$1:$C$10"
End Sub

5-2. 範囲オブジェクトとして利用

Sub 名前をRangeとして使用()
Dim nm As Name
Set nm = ThisWorkbook.Names("SalesRange")

nm.RefersToRange.Interior.Color = RGB(200, 255, 200) ' 背景色変更
End Sub

6. 名前付き定義の削除

Sub 名前削除()
ThisWorkbook.Names("SalesRange").Delete
End Sub
  • 存在しない名前を削除しようとするとエラーになるため、エラーハンドリングを入れると安全です。

7. 名前の一覧を取得・表示

Sub 名前一覧取得()
Dim nm As Name
For Each nm In ThisWorkbook.Names
Debug.Print nm.Name, "→", nm.RefersTo
Next
End Sub

8. Nameオブジェクトの応用例

8-1. 動的範囲として使用

ThisWorkbook.Names.Add Name:="DynamicRange", RefersTo:="=OFFSET(Sheet1!$A$1,0,0,COUNTA(Sheet1!$A:$A),1)"
  • このように OFFSET 関数を使って、行数が変動する範囲を定義できます。
  • VBAからグラフや条件付き書式などに動的に適用することが可能です。

9. 可視性の制御

Sub 名前の非表示()
ThisWorkbook.Names("SalesRange").Visible = False
End Sub
  • 名前管理ダイアログに表示されたくない内部用の名前は Visible = False に設定します。

10. 名前付き定義の用途

用途説明
定数の定義例: 税率 = 0.1
セル範囲の抽象化例: SalesData = Sheet1!A1:D100
数式の再利用例: TotalSales = SUM(SalesData)
VBAとの連携Range("MyRange").Value = 100 のように扱える
グラフの元データ範囲として使用動的グラフなどに最適

11. トラブルと注意点

  • RefersTo の先頭に = をつけないと、名前定義がうまく機能しません。
  • 同一名でワークブックレベルとワークシートレベルに定義すると、VBAからのアクセスに注意が必要。
  • 削除前に存在確認を行わないと Run-time error 1004 が発生します。
Function 名前が存在するか(名前 As String) As Boolean
On Error Resume Next
名前が存在するか = Not ThisWorkbook.Names(名前) Is Nothing
On Error GoTo 0
End Function

12. 名前の階層(Workbook vs Worksheet)

種別説明
ワークブックレベル全シート共通で使える名前。通常はこちらを使うことが多い。
ワークシートレベルそのシート内のみ有効。他シートからはアクセス不可。

アクセスの際に、Worksheet.Names("Name") または Workbook.Names("Name") で明示的に使い分ける必要があります。


13. Nameオブジェクトと名前の競合

同名の名前が複数(ワークブック・ワークシートで)存在すると、優先順位は次のようになります:

  1. アクティブシートのワークシートレベルの名前
  2. ワークブックレベルの名前
Range("MyName")  ' アクティブシートにローカル名がある場合はそちらが優先される

14. まとめ

要素内容
オブジェクト名Name(単体)/ Names(コレクション)
主な用途名前付き範囲の定義・取得・削除
所属Workbook.Names または Worksheet.Names
重要プロパティName, RefersTo, RefersToRange, Visible, Comment
作成方法Workbook.Names.Add または Worksheet.Names.Add
注意点RefersTo は文字列で = 必須、同名の優先順に注意
タイトルとURLをコピーしました