皆さんは、VBAで名前の定義を設定して使う方法を知っていますか?
セル範囲を直接せず名前の定義を使って処理を作ることで、行・列を追加して位置がずれた場合にも対応できる、変化に強いVBAのコードを作っていくことができるので、使い方を覚えておくと便利です!
そこで今回は、
・VBAで名前の定義を設定する方法
といった基礎的なことから、
・シート・ブックの名前の定義の違いについて
・VBAで名前の定義を使って処理を作る方法
・VBAで設定した名前の定義を削除する方法
といった応用的な方法まで、徹底的に解説します!
VBAで名前の定義を設定する方法
VBAで名前の定義を設定する方法は、大きく分けて以下の2つがあります。
・ブックレベルで名前の定義を設定
・シートレベルで名前の定義を設定
それぞれ詳しく解説する前に、簡単に「ブックレベル・シートレベルの名前の定義の違い」について解説しますね。
ブックレベル・シートレベルの名前の定義の違い
ブックレベル・シートレベルと聞くと少し難しく感じるかもしれませんが、簡単に言うと次のような違いがあります。
・ブックレベル:シート名の指定なしでどこからでも使える
・シートレベル:シート名の指定をしなければ使えない
変数でいうところのPublic、Privateなどのスコープの違いに似ているかもしれませんね。
ブックレベルはどこからでもつかえるので使いやすい分、意図しない場所で書き換えられてしまうリスクもあるので、その点を踏まえたうえで使いやすい方を使うのがおすすめです!
では次に、具体的な設定方法について解説します。
ブックレベルで名前の定義を設定する方法
まず、「ブックレベルで名前の定義を設定する方法」についてです。
Nameプロパティを使うことで、ブックレベルで名前の定義を付けることができます。
使い方は次のとおりです。
Nameプロパティの使い方:
Range("セル範囲").Name = "名前の定義に設定する名前"
たとえば、次のように名前の定義を設定することができます。
サンプルコード:
Sub Test() Range("A1:C2").Name = "Nameプロパティを使った名前" End Sub
設定した名前の定義の場所:
このように、簡単に範囲を指定して名前の定義を設定することができます。
シートレベルで名前の定義を設定する方法
次に、「シートレベルで名前の定義を設定する方法」についてです。
NamesコレクションのAddメソッドを使えば、ブックシートレベル・シートレベルのどちらかを指定して、名前の定義を設定することができます。
使い方は次のとおりです。
NamesコレクションのAddメソッドの使い方:
'ブックレベルで設定 Application.Names.Add [Name ,RefersTo ,RefersToR1C1 ,Visible ,MacroType] 'シートレベルで設定 Worksheets(“シート名”).Names.Add [Name ,RefersTo ,RefersToR1C1 ,Visible ,MacroType]
各プロパティの使い方を簡単に一覧でまとめました。
No | プロパティ名 | 意味 |
---|---|---|
1 | Name | 名前として使用する文字列を指定 |
2 | RefersTo | A1、B3などのセルのアドレスで名前の参照先を指定 |
3 | RefersToR1C1 | R1C1 形式の表記法を使用して、名前の参照先を指定 |
4 | Visible | 名前を表示/非表示をTrue/Falseで指定。規定値はTrue |
5 | MacroType | マクロの種類を以下から指定。 1:Functionプロシージャ 2:Subプロシージャ 3:なし(定義した名前がFunction、Subを参照しない) |
たとえば、次のようにシートレベルで名前の定義を設定することができます。
サンプルコード:
Sub Test2() Worksheets("Sheet1").Names.Add "Addメソッドを使った名前", Range("A3:C7"), True, 3 End Sub
設定した名前の定義の場所:
このように、簡単に範囲を指定して名前の定義を設定することができます。
ブックレベル・シートレベルを使い分けることができるので、便利ですね。
VBAで名前の定義を設定したセルを使用する方法
次に、VBAで設定した名前の定義を使う方法について解説します。
わかりやすく解説するために、さきほど用意した名前の定義を設定するサンプルコードを使って、それぞれ解説します。
ブックレベルの名前の定義を使用する方法
まず、「ブックレベルの名前の定義を使う方法」についてです。
以下のようにRangeメソッドの範囲に直接「名前の定義で設定した名前」を使って処理を書くだけなので、とても簡単です。
サンプルコード:
Sub Test3() Range("A1:C2").Name = "Nameプロパティを使った名前" Range("Nameプロパティを使った名前").Value = 1 End Sub
設定した名前の定義の場所:
こちらは、設定した名前の定義の範囲に「1」を書き込むサンプルです。
このように、簡単に名前の定義を使って処理を書くことができます。
シートレベルの名前の定義を使用する場合
シートレベルの名前の定義を使うためには、シート名を指定してから「名前の定義で設定した名前」を指定しないといけません。
「Worksheets(“シート名”).Range(“名前の定義で設定した名前”).メソッド」のように書くことで、名前の定義を使った処理を書くことができます。
サンプルコード:
Sub Test4() Worksheets("Sheet1").Names.Add "Addメソッドを使った名前", Range("A3:C7"), True, 3 Worksheets("Sheet1").Range("Addメソッドを使った名前").Value = 5 End Sub
設定した名前の定義の場所:
ちなみに、シート名を指定せずにRangeメソッドを使った場合は「Activesheet」がRangeメソッドの前に暗黙的に指定されるため、名前の定義を設定したシートであれば、「Range(“名前の定義で設定した名前”).メソッド」でもエラーにはなりません。
ただ、別のシートで処理を実行した場合は、次のようにエラーメッセージが出てしまいます。
エラーメッセージを出さないためにも、「Worksheets(“シート名”).Range(“名前の定義で設定した名前”).メソッド」のようにシートを指定して処理を作る癖をつけるのがおすすめです!
※ちなみに、Activesheetって何?と思った方は、以下記事を見てみてくださいね!
VBAで設定した名前の定義を削除する方法
最後に、VBAで設定した名前の定義を削除する方法について解説します。
ブックレベル・シートレベルどちらも、NamesコレクションのItemメソッドを使って削除します。
使い方は次のとおりです。
NamesコレクションのItemメソッドの使い方:
'ブックレベルの名前の定義を削除 Application.Names.Item("名前の定義に設定した名前").Delete 'シートレベルの名前の定義を削除 ActiveSheet.Names.Item("名前の定義に設定した名前").Delete
Applicationを先頭のオブジェクトに指定した場合はブックレベル、ActiveSheetまたはWorksheets(“シート名”)を指定した場合はシートレベルになるわけです。
たとえば、次のように設定した名前の定義を削除することができます。
削除前の名前の定義:
サンプルコード:
Sub Test5() 'ブックレベルの名前の定義を削除 Application.Names.Item("Nameプロパティを使った名前").Delete 'シートレベルの名前の定義を削除 ActiveSheet.Names.Item("Addメソッドを使った名前").Delete End Sub
削除後の名前の定義:
このように、簡単に作成した名前の定義を削除することができます。
まとめ
今回は、VBAで名前の定義を設定・使用・削除する方法について解説しました。
名前の定義を使いこなすと、変更に強いVBAの処理を作ることができるので、覚えておくと便利です。
使い方も簡単なので、ぜひ使ってみてくださいね!