セルや描画オブジェクト(テキストボックス等)に対しては名前を付けることができます。 VBからは、付けた名前を介してセルや描画オブジェクトを扱えます。
Var = Range("ほげほげ").Value Range("むにゃむにゃ").Font.Color = RGB(0, 0, 0)Rangeの中に指定している文字列が、付けた名前。
Var = Sheets("Sheet1").Range("ほげほげ").Value
Sheets("Sheet5").Shapes("ほげ").Select
Selection.Characters.Text = "表示する値"
Shapesの前のシートは必ず明示する必要がある模様。
また、非常に納得いかないことに、
SelectとSelectionの効率化を行うと、うまく動かない。
古いExcelでは
DrawingObjects("ほげ").Text = "表示する値"
で、うまく行ったと思うんだけど…。
セルの名前付けには、ローカル名とグローバル名という区別があるらしい。[2009-10-26]
ローカル名は、シート毎に名前を付けるもの。(別々のシート毎に同じ名前を付けるが、別の位置を指す)
グローバル名はブック内でひとつ(複数シートでひとつ)ということだと思う。
(参考: マイクロソフトサポートオンラインのHOW
TO グローバルおよびローカルの参照)
上記の「名前ボックス」から名前を入れる際に名前のみを入力した場合、グローバル名になるようだ。
名前を付ける際に明示的にシート名を付加すると、ローカル名になる。[2009-10-28]
名前ボックスに 入れる値 |
説明 | 備考 |
---|---|---|
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では以下のようにしてセルにローカル名を付けられる。[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
※並び順は不定(不明)