S-JIS[2002-04-21/2009-10-28] 変更履歴

セルや描画オブジェクトの名前について

セル描画オブジェクト(テキストボックス等)に対しては名前を付けることができます。 VBからは、付けた名前を介してセルや描画オブジェクトを扱えます。


セル

  1. 名前を付ける
    1. まず名前を付けたいセルを選択する。単独でも複数セルでも構わない。
    2. 次に、Excelの左上にある、現在のセルを表すコンボボックス(「A1」とか表示されてるやつ)( 「名前ボックス」というらしい)をクリックし、名前を入力してリターンキーを押す。
      (名前だけを入れるとグローバル名になる。ローカル名を付けるにはシート名も明示する)
      これで、名前の登録は完了。
  2. 名前の付いているセルの位置を確認したい場合
    1. 上記のコンボボックスから、確認したい名前を選択するだけ。
      選択せずに入力しても大丈夫だが、1文字でも違っていた場合は名前を付ける動作になってしまうので注意。
  3. 名前を変えたい場合
    1. 名前を付けるやり方とまったく同じで、新しい名前を入力するだけ。
      ただし、前に付けた名前も残ってしまい、複数の名前が同一セルを指すことにな る。それが嫌な場合は、前に付けた名前を削除する。
  4. 名前を削除したい場合
    1. メニューバーの「挿入」から「名前」→「定義」を選ぶ。
    2. 現在付けられている名前の一覧が出るので、削除したいものを選ぶ。
      ついでに言えば、範囲の修正や名前の追加なんかもここで出来る。
  5. VBから使う

描画オブジェクト

例としてテキストボックスを扱うが、基本的に描画オブジェクトなら何でも同じだと思う。
  1. テキストボックスを貼り付ける
  2. 名前を付ける
  3. 名前を変えたい場合
  4. VBから使う

グローバル名とローカル名

セルの名前付けには、ローカル名とグローバル名という区別があるらしい。[2009-10-26]
ローカル名は、シート毎に名前を付けるもの。(別々のシート毎に同じ名前を付けるが、別の位置を指す)
グローバル名はブック内でひとつ(複数シートでひとつ)ということだと思う。
(参考: マイクロソフトサポートオンラインのHOW TO グローバルおよびローカルの参照

上記の「名前ボックス」から名前を入れる際に名前のみを入力した場合、グローバル名になるようだ。

名前を付ける際に明示的にシート名を付加すると、ローカル名になる。[2009-10-28]

Sheet1で名前を付ける例
名前ボックスに
入れる値
説明 備考
TEST グローバル名になる。 既にその名前が存在している場合、そのシートへジャンプする。
Sheet1!TEST ローカル名になる。 別シートから登録しようとするとエラーになる。
既にそのシートにその名前が存在している場合、そのシートへジャンプする。
'Sheet1'!TEST

参考: エクセル技道場の名前定義


セルに名前の付いているワークシートをコピーした場合、名前もそのまま残るが、コピー先の名前はローカル名になる。[2009-10-26]
(コピー元のシートもコピー先のシートも同じ名前が残っているが、無関係なシートから名前を選択するとコピー元のシート (グローバル名の場合)に飛ぶ)
(参考: マイクロソフトサポートオンラインのブック内の全ての名前をローカル名にする

ワークシートの“シートそのもの”をコピーするのでなく、全選択でデータをコピーした場合は、名前はコピーされない。
こうしてコピーした後に元のシートと同じ名前を付けたいと思っても、「名前ボックス」に名前のみを入れると位置移動扱いになるのでグローバル名の場所に飛んでしまう。
明示的にローカル名として入力する必要がある。

あるシートで“別シートのグローバル名”と同名のローカル名が存在している場合、位置移動VBAのRangeによる指定はローカル名が優先される。


例えばSheet1のA1セルに「SAMPLE」という名前を付け、Sheet1をコピーしてSheet2を作った場合、名前一覧は以下のようになる。 (Excel2003)

Sheet1 Sheet2

Sheet2の「SAMPLE」の行には、右端にシート名が出ている。
ここにシート名が出ているのは、それがローカル名である印だと思われる。

ちなみに、ここでSheet2の「SAMPLE」を削除すると、ローカル名が削除されるだけで、グローバル名の「SAMPLE」は残る。
すなわちSheet1の名前の定義と同じ表示になる。
(SAMPLEの行の右端のシート名が消えるだけで行自体は残るので、削除されなかったと錯覚しそうになるが)


VBAから名前を付ける方法

VBAでは以下のようにしてセルにローカル名を付けられる。[2009-10-26]

	Dim s As Worksheet
	Set s = ActiveSheet
	s.Names.Add Name:="CELL_NAME", RefersTo:="=$A$1"
	s.Names.Add Name:="Invisible", RefersTo:="=$B$2", Visible:=False

'セル名を付けてもローカル名になる
	s.Names.Add Name:="CELL_NAME", RefersTo:="=" & s.Name & "!$C$3"

Nameにセルの名前を指定する。
RefersToに指定する文字列の先頭に「=」を付け忘れると、正しく設定できない。(名前を付ける際にはエラーにならないが、参照しようとすると 見つからなくてエラーになる)
VisibleにFalseを指定すると、「名前の定義」ダイアログにその名前は出てこないが、VBAから参照することは出来る。デフォルトはTrue。

NameLocalやRefersToLocalという引数もあるが、たぶんセルに日本語名を付けたい時にはこちらを使用するのだと思う。


グローバル名を付けるには以下のようにする。[2009-10-28]

'アクティブなワークブックのアクティブなシートに対してグローバル名を付ける
	Names.Add Name:="GLOBAL_NAME", RefersTo:="=$A$1"
'指定されたブックのアクティブなシートに対してグローバル名を付ける
	Dim b as Workbook
	Set b = ActiveWorkbook
	b.Names.Add Name:="GLOBAL_NAME", RefersTo:="=$A$1"
'指定されたブックの指定されたシートに対してグローバル名を付ける
	Dim b as Workbook
	Set b = ActiveWorkbook
	b.Names.Add Name:="GLOBAL_NAME", RefersTo:="=Sheet1!$A$1"

シートに付いているローカル名を全て取得するには以下のようにする。[2009-10-26]

	Dim s As Worksheet
	Set s = 〜

	Dim n As Name
	For Each n In s.Names
		Debug.Print n.Name, n.RefersTo, n.Visible
	Next
	Dim s As Worksheet
	Set s = 〜

	Dim ns As Names
	Set ns = s.Names

	Dim i As Integer
	For i = 1 To ns.Count
		Dim n As Name
		Set n = ns(i)
		'Set n = ns.Item(i)
		Debug.Print n.Name, n.RefersTo, n.Visible
	Next i
↓実行結果
Sheet1!CELL_NAME	=Sheet1!$A$1	True
Sheet1!Invisible	=Sheet1!$B$2	False

同様にワークブックに対して名前を取得しようとすると、グローバル名だけでなく、全シートの全ローカル名も取得される。[2009-10-28]

	Dim b as Workbook
	Set b = ActiveWorkbook

	Dim n As Name
	For Each n In b.Names
		Debug.Print n.Name, n.RefersTo, n.Visible
	Next

↓実行結果

Sheet1!CELL_NAME	=Sheet1!$A$1	True
Sheet1!Invisible	=Sheet1!$B$2	False
Sheet2!CELL_NAME	=Sheet2!$A$1	True
Sheet2!Invisible	=Sheet2!$B$2	False
GLOBAL_NAME	=Sheet1!$A$1	True

※並び順は不定(不明)


Excelへ戻る / 技術メモへ戻る
メールの送信先:ひしだま