【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

範囲の取得

'4つの数字で範囲を取得
Dim range1 = ws.Range(4, 1, 4, 2) '処理速度の面ではおすすめ

'文字列で範囲を取得
Dim range2 = ws.Range("A1:B1")

'2つの文字列で範囲を取得
Dim range3 = ws.Range("A3", "B3")

'2つの XLAddresses で範囲を取得
Dim range4 = ws.Range(ws.Cell(2, 1).Address, ws.Cell(2, 2).Address)

'ws.FirstCellUsed と ws.LastCellUsed
Dim range = ws.Range(ws.FirstCellUsed.Address, ws.LastCellUsed.Address)

'範囲の中の Row(1) を取得
Dim range5 = ws.Range("B4:C5").Row(1)

'範囲の中の Column(2) を取得
Dim range6 = ws.Range("E1:F4").Column(2)

'行全体を番号で取得
Dim range7 = ws.Row(7)
Dim range8 = ws.Rows(1, 3)

'行全体を文字列で取得
Dim range9 = ws.Rows("5:6") '処理速度が遅くなるので非推奨
Dim range10 = ws.Range("5:6") '処理速度が遅くなるので非推奨

'列全体を番号で取得
Dim range11 = ws.Columns(3)
Dim range12 = ws.Columns(3, 4)

'列全体を列名で取得
Dim range13 = ws.Column("C") '処理速度が遅くなるので非推奨
Dim range14 = ws.Columns("C:D") '処理速度が遅くなるので非推奨
Dim range15 = ws.Range("E:F") '処理速度が遅くなるので非推奨

'複数の範囲を取得して同時に処理
ws.Ranges("A1:B2,C3:D4,E5:F6").Style.Fill.BackgroundColor = XLColor.Red
注意

大きな範囲(行全体や列全体など)を取得して処理する場合、文字列で範囲を取得するよりも番号で取得したほうが処理時間が短くなります。

文字列で取得した範囲の処理に時間がかかる場合は、番号で範囲を取得してみてください。

範囲のコピー

別のシートに範囲をコピーする例。

anotherSheet.Cell(1,1).Value = range

範囲の削除・クリア

range.Delete
range.Clear

範囲の自動的な移動

下記のコードでは、行・列の挿入によって、取得しておいた範囲が自動的に移動する様子を示しています。

Dim workbook = new XLWorkbook
Dim ws = workbook.Worksheets.Add("範囲の移動")

'元の範囲を示すテキストアドレス
Dim orgAddressStr As String = "B3:C3"

'範囲を取得
Dim targetRange = ws.Range(orgAddressStr)

'取得した範囲の前に行・列を挿入
ws.Row(1).InsertRowsAbove(2)
ws.Column(1).InsertColumnsBefore(2)

'取得した範囲が自動的に移動した場所の背景色を薄い青色に
With targetRange
    .Column(1).SetValue("移動した範囲")
    .Style.Fill.SetBackgroundColor(XLColor.LightBlue)
End With

'取得した範囲が移動する前の場所の背景色を黄色に
With ws.Range(orgAddressStr)
    .Column(1).SetValue("元の範囲")
    .Style.Fill.SetBackgroundColor(XLColor.Yellow)
End With

workbook.SaveAs("D:\test\ShiftingRanges.xlsx")

 

範囲(セル)の結合

Dim workbook = new XLWorkbook
Dim ws = workbook.Worksheets.Add("セルの結合")

'範囲の中の行の結合
ws.Cell("B2").Value = "B2:D3 の範囲の Row(1) を結合"
With ws.Range("B2:D3")
    .Row(1).Merge _
        .Style.Fill.BackgroundColor = XLColor.Yellow

    '罫線の設定
    .Style.Border.SetOutsideBorder(XLBorderStyleValues.Thick) _
        .Border.SetOutsideBorderColor(XLColor.Red)
End With

'範囲の中の列の結合
ws.Cell("F2").Value = "F2:G8 の範囲の Column(1) を結合"
With ws.Range("F2:G8")
    .Column(1).Merge _
        .Style.Alignment.SetWrapText _
        .Alignment.SetVertical(XLAlignmentVerticalValues.Center) _
        .Fill.SetBackgroundColor(XLColor.Yellow)

    '罫線の設定
    .Style.Border.SetOutsideBorder(XLBorderStyleValues.Thick) _
        .Border.SetOutsideBorderColor(XLColor.Red)
End With

'範囲の結合
ws.Cell("B4").Value = "B4:D6 を結合"
With ws.Range("B4:D6")
    .Merge _
        .Style.Alignment.SetHorizontal(XLAlignmentHorizontalValues.Center) _
        .Alignment.SetVertical(XLAlignmentVerticalValues.Center) _
        .Fill.SetBackgroundColor(XLColor.Yellow)

    '罫線の設定
    .Style.Border.SetOutsideBorder(XLBorderStyleValues.Thick) _
        .Border.SetOutsideBorderColor(XLColor.Red)
End With

'範囲の結合を解除
ws.Cell("B8").Value = "B8:D8 を結合 → 結合を解除"
With ws.Range("B8:D8")
    .Merge _
    .Unmerge

    '罫線の設定
    .Style.Border.SetOutsideBorder(XLBorderStyleValues.Thick) _
        .Border.SetOutsideBorderColor(XLColor.Red)
End With

workbook.SaveAs("D:\test\MergeCells.xlsx")

 

結合セルの検索

下記のコードでは、アドレス "B4" を含む最初の結合範囲の背景色を赤色にします。

Dim mergedRange = ws.MergedRanges.First(Function(r) r.Contains("B4"))
mergedRange.Style.Fill.BackgroundColor = XLColor.Red

 

範囲(表)の回転

下図の最初の表をコピーして2番目の表を作り、2番目の表を回転します。

上図で B11 にあるテキスト「( *´艸`)」は、2番目の表を回転するときのオプションによって移動されるか上書きされるかが決まります。

Dim workbook = New XLWorkbook
Dim ws = workbook.Worksheets.Add("表の回転")

'表を作成(開始セルは B2)
Dim originalTable = New List(Of String())
originalTable.Add(New String() {"顔文字"})
originalTable.Add(New String() {"平静", "スマイル", "狼狽", "哀しみ", "怒り"})
originalTable.Add(New String() {"(*´ω`*)", "(*^_^*)", "(;^ω^)", "( ;∀;)", "(# ゚Д゚)"})
ws.Cell("B2").Value = originalTable

With ws.Range("B2:F4")
    '表タイトルの書式設定
    .FirstRow.Merge.Style.Alignment _
        .SetHorizontal(XLAlignmentHorizontalValues.Center) _
        .Fill.SetBackgroundColor(XLColor.LightBlue)
    '表の罫線を設定
    .Style.Border.SetOutsideBorder(XLBorderStyleValues.Thick).Border.SetInsideBorder(XLBorderStyleValues.Thin)

    '表をコピー(開始セルは B6)
    Dim copiedTable = .CopyTo(ws.Cell("B6"))

    'コピーした表の下にテキストを入力
    ws.Cell("B9").Value = "( *´艸`)"

    'コピーした表の向きを変更
    '向きを変える表の下に別のテキストがあったらそれを移動
    copiedTable.Transpose(XLTransposeOptions.MoveCells)
    '向きを変える表の下に別のテキストがあったらそれを上書き
    'copiedTable.Transpose(XLTransposeOptions.ReplaceCells)
End With

workbook.SaveAs("D:\test\Transpose Ranges.xlsx")

 

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

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