名前定義のスコープ――名前・所属・参照先をセットで読む

LWP | 名前定義のスコープ――名前・所属・参照先をセットで読む

名前定義のスコープ――名前・所属・参照先をセットで読む

TakiLib(滝Lib)を使うVBA記事。コイ丸先輩とシャケモンが、同じ「売上」の違いを確かめます。

ストーリー

コイ丸先輩の使ってきたブックには、同じ「売上」という名前が二つあります。ブック範囲の名前とSheet2固有の名前は、別のセル範囲を指しています。シャケモンと、名前の所属とTakiLibの取得処理を読み直します。表・会話・商品や金額は説明用の例です。

1 同じ「売上」でも、所属が違えば別の名前

ブック範囲の売上はSheet1のB2:B5、Sheet2固有の売上はD2:D5を指す

図1|同じ短い名前でも、所属と参照先が違います。

2 名前の所属に合わせて、検索の入口を選ぶ

WorkbookのNamesにはシート固有名も含まれ、WorksheetのNamesはそのシート固有の名前を含む

図2|コレクションの範囲と名前のスコープを分けて読みます。

3 別シートへの適用は、Addressを使い直す操作

Sheet1のB2:B5のAddressをSheet2で使い直してB2:B5を返すが、ローカル名のD2:D5は検索しない

図3|rngNamedRangeOnSheetは同じ位置のRangeを返します。名前や値を複製する処理ではありません。

4 名前が存在しても、Rangeを取得できるとは限らない

セル範囲、定数42、参照切れの名前を比較し、存在とRange取得の成功を区別する

図4|RefersToRangeを使う前に、参照先の種類と正常性を確認します。

5 交差した最初の名前は、完全一致や全件ではない

対象B4:B5はB2:B5とB4:B7の両方に交差し、完全一致や全件列挙とは異なる

図5|rngGlobalDefinedNameは、交差する最初の名前を返す実装です。

6 取得したいものに合わせて、関数の契約を選ぶ

名前のRange取得、ブック名限定、別シートの同じ位置、交差する名前の検索を四つの関数で整理する

図6|名前・所属・参照先・目的で、呼び出しの意味を確定します。

まとめ

同じ文字の名前でも、ブック範囲とシート範囲では別の定義です。対象ブック・シートと参照先を明示し、名前の存在とRange取得の成功を分けて確認します。

rngNamedRangeOnSheetはブック範囲の名前からAddressを取り、対象シートのRangeとして使い直します。rngGlobalDefinedNameは交差する最初の名前を返し、完全一致や全名前の列挙は行いません。検索入口のApplication.NamesはアクティブなブックのNamesコレクションです。対象Rangeが別のブックにある場合、対象ブックの全名前を検索したとは扱えません。

今回の仕掛け

既存ブックの意図を知るコイ丸先輩と、取得処理を読めるシャケモンが、同じ名前の違いを整理します。「どの名前か」という構造から入り、「何を返すか」という関数の契約へ進みます。

今回のソースコードのサンプル

WindowsデスクトップExcelで、TakiLib 3.5.4を導入したブックを前提とします。ブック範囲の「売上」がSheet1!B2:B5を指し、Sheet2が存在する場合の確認例です。VBEのイミディエイトウィンドウまたはプロシージャ内で使う短い断片で、今回の制作ではVBA実機実行はしていません。

サンプルコード 別シートの同じ位置を確認する

01

Debug.Print rngNamedRangeOnSheet("売上", "Sheet2", ThisWorkbook).Address(External:=True)

関数の説明

rngNamedRangeOnSheetはTakiLibの関数です。引数は、ブック範囲の名前、対象シート、対象ブックの順です。Range.AddressはExcelの標準プロパティです。

コードの説明

「売上」の元のRangeを取り、そのAddressをSheet2で使い直します。外部修飾付きAddressを表示するため、ブック・シート・位置を確認できます。

入力・概要

ThisWorkbookにブック範囲の「売上」とSheet1・Sheet2が存在し、「売上」は単一のセル範囲Sheet1!B2:B5を指す前提です。Sheet2のローカル名「売上」がD2:D5でも、そのローカル名は検索しません。

結果

ソース読解に基づく期待結果は、対象ブックのSheet2!$B$2:$B$5を示すAddressです。ブック名の部分は実際のファイル名で変わります。

読むポイント

値の転記・数式のコピー・名前定義の追加は行いません。存在しない名前、Rangeを返さない定義、複数領域など、前提外の条件をこの断片で解決したとは扱いません。

以下は、直接呼んだ関数のソースを一段だけ掲載した読解用抜粋です。単独では必要な補助関数や定数がそろわないため、完全なTakiLibを使用してください。公開安定版3.5.4のAI読解用UTF-8ソースから、関数本文を改変せず引用しました。

サンプルコード rngNamedRangeOnSheetのソース

01

Public Function rngNamedRangeOnSheet( _

02

                        a_global_name, _

03

                        a_target_sheet, _

04

                        Optional ByVal a_book) As Range

05

    Rem @name       rngNamedRangeOnSheet

06

    Rem @desc       グローバルに定義された名前付き範囲を取得し、

07

    Rem             同じアドレスを指定シート上の Range として返す。

08

    Rem @param      a_global_name    参照するグローバルな名前(文字列)

09

    Rem @param      a_target_sheet   対象シート(シート名または Worksheet オブジェクト)

10

    Rem @param      a_book           対象ブック(省略時: ThisWorkbook)

11

    Rem @return     Range            指定シート上の Range オブジェクト

12

    Rem @note       - グローバル名の参照先アドレスをもとに、指定シートへマッピングする

13

    Rem             - a_target_sheet には文字列(シート名)または Worksheet を渡せる

14

    Rem             - a_book を明示すれば、対象ブックを切り替え可能

15

    Rem @procattr   std_function

16

    Rem @prochder=================================================================================@

17

18

    
    Call valueSetDefault(a_book, ThisWorkbook)

19

    If TK3_ASSERT Then Call langAssert( _

20

                                typeIsObjectOf(a_target_sheet, "Worksheet") Or hasCollKeyAffinity(a_target_sheet), _

21

                                TK3_ERROR_ARGUMENT)

22

23

    
    Dim xsrc_rng As Range:

24

        Set xsrc_rng = rngNamedRangeGlobal(a_global_name, a_book)

25

26

    
    Dim xsheet As Worksheet

27

28

    
    If typeIsWorksheet(a_target_sheet) Then

29

        Set xsheet = a_target_sheet

30

    Else

31

        Set xsheet = a_book.Worksheets(a_target_sheet)

32

    End If

33

34

    
    Set rngNamedRangeOnSheet = xsheet.Range(xsrc_rng.Address)

35

End Function

ソースの流れは、元のブック名のRange取得、対象シートの解決、同じAddressのRange取得です。内側のrngNamedRangeGlobalや補助関数のソースを再帰的には展開していません。

TakiLibのライセンス

この関数のソースには次のMIT Licenseを適用します。記事本文の利用案内とは別に、ソフトウェアの著作権表示と許諾文を保持します。

The MIT License

Copyright (c) 2021 Kazuhiro Yamanaka

Permission is hereby granted, free of charge, to any person obtaining a

copy of this software and associated documentation files (the

"Software"), to deal in the Software without restriction, including

without limitation the rights to use, copy, modify, merge, publish,

distribute, sublicense, and/or sell copies of the Software, and to

permit persons to whom the Software is furnished to do so, subject to

the following conditions:

The above copyright notice and this permission notice shall be

included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,

EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF

MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND

NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE

LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION

OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION

WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

出典メモ

元ネタ「名前定義のブック範囲とシート範囲を理解する」を6枚へ再構成し、当日選定したTakiLib公開安定版3.5.4の4関数を読みました。掲載コードと結果は、特記した実測ではなく、ソースと仕様に基づく説明です。

Namesの範囲はMicrosoft Learn:Workbook.NamesとWorksheet.Names、アクティブブックの検索入口はApplication.Namesを参照しました。Rangeを返さない定義では取得が失敗することはName.RefersToRangeで確認しました。

Copyright © 2026 LWP 山中 一弘

本資料は、出典を明記いただければ、商用・非商用を問わず、ご自由に複製・改変・再配布していただけます。なお、著作権表示は改変せず、そのまま記載してご利用くださいますようお願いいたします。