名前付き範囲へのアクセス
名前付き範囲にアクセスする方法は複数あります。
名前が付けられた特定の範囲/セルへのアクセス
'ワークシートのスコープ
Dim range = worksheet.Range("NameOfTheRange")
Dim cell = worksheet.Cell("NameOfTheRange")
'ワークブックのスコープ
Dim range = workbook.Range("NameOfTheRange")
Dim cell = workbook.Cell("NameOfTheRange")
名前が付けられた複数の範囲/複数のセルへのアクセス
MEMO
複数の範囲/複数のセルのそれぞれに同じ名前が付けられている場合。
'ワークシートのスコープ
Dim ranges = worksheet.Ranges("NameOfTheRange")
Dim cells = worksheet.Cells("NameOfTheRange")
'ワークブックのスコープ
Dim ranges = workbook.Ranges("NameOfTheRange")
Dim cells = workbook.Cells("NameOfTheRange")
ワークブックからワークシートのスコープの名前付き範囲にアクセスする
Dim range = workbook.Range("Sheet1!NameOfTheRange")
Dim cell = workbook.Cell("Sheet1!NameOfTheRange")
名前付き範囲のスコープについて
ワークシートの名前付き範囲を参照するとき、ClosedXML はまず検索を開始したワークシートのスコープで検索し、見つからない場合はワークブックのスコープに切り替えます。
ワークブックのスコープで作成された名前付き範囲には、その名前付き範囲があるワークシートのスコープからもワークブックのスコープからもアクセスできます。
'名前付き範囲をワークブックのスコープで(デフォルトオプションで)作成
worksheet.RangeUsed.AddToNamed("NameOfTheRange")
'ワークブックからアクセスする場合
Dim range = workbook.Range("NameOfTheRange")
'ワークシートからアクセスする場合
'まずそのワークシート上の名前付き範囲を探して、
'見つからなければワークブックのスコープで検索する
Dim range = worksheet.Range("NameOfTheRange")
名前付き範囲が見つからない場合
名前付き範囲が見つからない場合は Nothing が返されます。
名前付き範囲の使用例
Dim wb = New XLWorkbook
'「実験シート」と「データシート」を追加する
Dim experimentSheetName As String = "実験シート"
Dim wsExperiment = wb.Worksheets.Add(experimentSheetName)
Dim dataSheetName As String = "データシート"
Dim wsData = wb.Worksheets.Add(dataSheetName)
'「データシート」にデータを準備する
wsData.Cell(1, 1).Value = "名前"
wsData.Cell(1, 2).Value = "年齢"
wsData.Cell(2, 1).Value = "太郎"
wsData.Cell(2, 2).Value = 30
wsData.Cell(3, 1).Value = "花子"
wsData.Cell(3, 2).Value = 25
wsData.Cell(4, 1).Value = "丈太郎"
wsData.Cell(4, 2).Value = 29
'「データシート」のデータ範囲に名前を付ける。デフォルトのスコープは「ワークブック」。
'つまりワークブック内の他のシートからも参照可能。
Dim dataRangeName As String = "年齢データ"
wsData.Range("A2:B4").AddToNamed(dataRangeName)
'作成した名前付き範囲を式で使う。
wsExperiment.Cell(1, 1).Value = "人数:"
wsExperiment.Cell(1, 2).FormulaA1 = $"COUNT({dataRangeName})"
' $"COUNT({dataRangeName})" は String.Format("COUNT({0})", dataRangeName) と同じ。
'名前付き範囲をワークシートのスコープで作成する。
'つまりそのシート内でのみ参照可能。
Dim peopleCountRangeName As String = "人数"
wsExperiment.Range("B1").AddToNamed(peopleCountRangeName, XLScope.Worksheet)
'作成した名前付き範囲を式で使ってみる
wsExperiment.Cell(2, 1).Value = "合計:"
wsExperiment.Cell(2, 2).FormulaA1 = peopleCountRangeName
'名前付き範囲のデータをコピー
wsExperiment.Cell(4, 1).Value = "年齢データ:"
wsExperiment.Cell(5, 1).Value = wb.Range(dataRangeName)
'///////////////////////////////////////////////////////////////////////
'Excel に詳しい人の中には、相対アドレスを指す名前付き範囲について
'ご存知の方がいるかもしれません。
'相対アドレスを指す名前付き範囲は次のようにして作成できます。
'次のコードは、同じ行の次の列を指す名前付き範囲を作成します。
'たとえば、現在のセルが B4 の場合、名前付き範囲「次の列へ」は C4 を指します。
wsExperiment.NamedRanges.Add("次の列へ", $"{experimentSheetName}!B1")
'次のコードは、同じ行の前の列を指す名前付き範囲を作成します。
'たとえば、現在のセルが D2 の場合、名前付き範囲「前の列へ」は C2 を指します。
wb.NamedRanges.Add("前の列へ", $"{experimentSheetName}!XFD1")
'解説:
'相対アドレスの指定は常に A1 を基点として計算されます。つまり、
'B1 を指定すると「右へ1つ」、B2 を指定すると「右へ2つ」、
'XFD1 を指定すると「左へ1つ」ということになります。また、
'A2 を指定すると「下へ1つ」、A3 を指定すると「下へ2つ」、
'A1048576 を指定すると「上へ1つ」ということになります。
'2つ上へ移動する名前付き範囲
'(名前付き範囲名は数字で始められないので漢字にした)
wb.NamedRanges.Add("二つ上へ", $"{experimentSheetName}!A1048575")
'右下へ移動する名前付き範囲
wb.NamedRanges.Add("右下へ", $"{experimentSheetName}!B2")
'///////////////////////////////////////////////////////////////////////
'コンテンツに合わせて列幅を調整
'(日本語のコンテンツに対して AdjustToContents を使う場合、日本語フォントを設定しておかないと正しく動作しない)
wsData.Style.Font.FontName = "游ゴシック";
wsData.Columns.AdjustToContents
wsExperiment.Style.Font.FontName = "游ゴシック";
wsExperiment.Columns.AdjustToContents
wb.SaveAs("D:\test\NamedRanges.xlsx")
上記のコードで下図のような2つのシートが作成されます。
それぞれのシートでは、下図のような名前付き範囲を参照できます。




