【VB.NET】ClosedXML:名前付き範囲

MEMO
  • この記事は GitHub - ClosedXML - Wiki を参考に書かせていただいたものですが、C# から VB.NET への書き換えをし、英語から日本語へ翻訳しただけでなく、元記事の構成・コード・コメント等を変更している場合もありますのでご了承ください。
  • 現在 ClosedXML のメンテナンスをご担当されている Francois Botha 様からの掲載許可もいただいてます。
  • この記事のコードサンプルについては、Imports ClosedXML.Excel が宣言されていることを前提としています。
  • ClosedXML の作成者について:Francois Botha, Aleksei Pankratev, Manuel de Leon, Amir Ghezelbash
  • ClosedXML のライセンスについて:GitHub - ClosedXML - MIT License

名前付き範囲へのアクセス

名前付き範囲にアクセスする方法は複数あります。

名前が付けられた特定の範囲/セルへのアクセス

'ワークシートのスコープ
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つのシートが作成されます。

それぞれのシートでは、下図のような名前付き範囲を参照できます。

 

「【VB.NET】ClosedXML の使い方」の一覧を表示

購読する
通知を受け取る対象
guest
0 Comments
Inline Feedbacks
View all comments