名前付き範囲へのアクセス
名前付き範囲にアクセスする方法は複数あります。
名前が付けられた特定の範囲/セルへのアクセス
'ワークシートのスコープ 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つのシートが作成されます。
それぞれのシートでは、下図のような名前付き範囲を参照できます。