1. はじめに
Excelでは、セル範囲や数式、定数などに「名前付き定義(Named Range)」を付けることができ、これを使うことで可読性や再利用性が大きく向上します。
VBAでこの「名前付き定義」を操作するのが、Name
オブジェクトです。
このオブジェクトは、ワークブックまたはワークシートに定義された名前とその参照先(数式やセル範囲など)を制御するために使用されます。
2. Nameオブジェクトの概要
Name
オブジェクトは、1つの名前付き定義を表します。- すべての名前付き定義は、
Workbook.Names
またはWorksheet.Names
コレクションとして保持されます。 - 名前付き定義には、セル範囲だけでなく、数式、定数、関数の名前も指定できます。
3. Nameオブジェクトの構造とプロパティ
主なプロパティ一覧
プロパティ | 説明 |
---|---|
Name | 名前定義の名前(例: “MyRange”) |
RefersTo | 名前が参照する範囲や数式(文字列形式、例: =Sheet1!$A$1:$B$10 ) |
RefersToRange | RefersTo がセル範囲を指す場合の Range オブジェクト |
Visible | 名前を名前管理画面に表示するかどうか |
Comment | 名前の説明コメント |
Workbook | 名前が属するワークブック |
Index | Names コレクション内でのインデックス |
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オブジェクトと名前の競合
同名の名前が複数(ワークブック・ワークシートで)存在すると、優先順位は次のようになります:
- アクティブシートのワークシートレベルの名前
- ワークブックレベルの名前
Range("MyName") ' アクティブシートにローカル名がある場合はそちらが優先される
14. まとめ
要素 | 内容 |
---|---|
オブジェクト名 | Name (単体)/ Names (コレクション) |
主な用途 | 名前付き範囲の定義・取得・削除 |
所属 | Workbook.Names または Worksheet.Names |
重要プロパティ | Name , RefersTo , RefersToRange , Visible , Comment |
作成方法 | Workbook.Names.Add または Worksheet.Names.Add |
注意点 | RefersTo は文字列で = 必須、同名の優先順に注意 |