セルの名前の定義の使い方を覚えると確実に作業効率アップ!|エクセルVBA
エクセルVBAでセルを参照する時、こんな書き方してませんか?
Dim x As String x = Range("A1").Value x = Cells(1, 1).Value
結論を先に言うと、こういう書き方をしていると間違いなく時間を浪費することになります。
参照セルの位置が変わることなんて日常茶飯事
先ほどの書き方でも例外にOKなのは、参照セルがそこから絶対変わらないの場合。
すべてを綿密にカッチリ決めてVBAを書き始めたならそれも可能です。
でもそんなことは稀ですよね。
例えば、作成途中でのシートレイアウトの変更。
セルをカット&ペースト、行・列の追加。その結果セルが移動することは日時茶飯事。
そうなると必然的にVBAの書き換えが必要になります。
これ、効率が悪いことは明らかですよね。
じゃあどうするか??
ここで名前の定義の登場です。
セルに名前を付けることでVBAが効率的に!
セルに名前を付けるのは簡単。
メニューバーの下に「名前ボックス」があります。
ここに好きな名前を打ち込んであげればOK。
例えば日付を入れるセルに「rngB_DateFrom」と名前を付けます。
簡単ですね。
VBAでこのセルを参照したい場合は
Dim datFrom As Date datFrom = wsBoku.Range("rngB_DateFrom").Value
これでセルから日付を取得することが可能。
で、何より重要なのはセルが移動する場合。
例えば、列の挿入が必要になって先ほどのセルが2列目から3列目に移動した場合。
セルが動いても名前との紐付きは変わっていません。
そのためVBAの書き換えは不要です。
一方、セルの番地を使った書き方をしていた場合、書き換えが必要になります。
Dim datFrom As Date datFrom = wsBoku.Cells(2, 2).Value '↑Cells(2, 2) を Cells(3, 2) に書き換える必要が出てくる
セルの位置が変わる度にVBAを書き換えなきゃならないなんて大変ですよね。
だから名前の定義を活用するんです。
セルのコピー&ペーストの時は名前は付いて来ない
先ほどのように列を挿入(削除)した、あるいは行を挿入(削除)した、その結果、セルが移動した場合、セルと名前の紐付き関係は変わりません。
また、セルをカット&ペーストした場合も、セルと一緒に名前を付いてきます。
ただ、セルのコピー&ペーストの時は名前は付いてきません。
この点は注意しておきましょう。
「名前の管理」で名前の管理?!
セルに付けた名前の管理は「名前の管理」画面で出来ます。
メニュー「数式」>「名前の管理」で開くことが出来ますが、「Ctrl + F3」ショートカットでも開けるので是非覚えておきましょう。
この「名前の管理」で修正、削除、あるいは新規作成が可能です。
ここで「範囲」が「ブック」となっていますが、これは名前がブックにぶら下がったものであることを表しています。
もう少し正確に言うと、セルに「名前」を付けることはNameオブジェクトを作ることと同義です。
その観点から整理すると、最初「名前ボックス」でセルに名前を付けましたが、それによりNameオブジェクトが作成され、そのNameオブジェクトの名前が「rngB_DateFrom」であり、Nameオブジェクトが持つ値や参照範囲が「名前の管理」で確認できるわけです。
このNameオブジェクトは基本的にWorkbookオブジェクトのメンバーとして作成されます。
ややこしいのはこのNameオブジェクトはWorksheetオブジェクトのメンバーにもなる、ということです。
例えば、先ほど名前を付けたセルがあるシートをコピーしてから「名前の管理」を見ると、まったく同じ名前を持つNameオブジェクトが作られていることが確認できます。
ただし「範囲」が「ブック」ではなく、コピーされたシートになっています。
つまり、WorksheetのメンバーのNameであるということです。
これ、はっきり言ってダブルスタンダード状態で百害あって一利なしです。
WorksheetのNameが作られてしまった場合にはそれを全て削除し、WorkbookのNameで統一していくことをオススメします。