【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 wb = New XLWorkbook
Dim ws = wb.Worksheets.Add("オートフィルター")

ws.Cell("A1").Value = "タイトル"
ws.Cell("A2").Value = "うしおととら"
ws.Cell("A3").Value = "進撃の巨人"
ws.Cell("A4").Value = "GS美神 極楽大作戦!!"
ws.Cell("B1").Value = "人物"
ws.Cell("B2").Value = "うしお"
ws.Cell("B3").Value = "ミカサ"
ws.Cell("B4").Value = "おキヌ"

ws.RangeUsed.SetAutoFilter

'オートフィルターを解除するには:
'ws.AutoFilter.Clear
'  または
'ws.SetAutoFilter(False)
'  または
'ワークシートの適当な範囲(Range)に対して上記のメソッドを呼び出す

wb.SaveAs("D:\test\AutoFilter.xlsx")

値を抽出する

Dim wb = New XLWorkbook
Dim ws = wb.Worksheets.Add("オートフィルター")

'データの用意
ws.Cell("A1").SetValue("数字") _
  .CellBelow.SetValue(2) _
  .CellBelow.SetValue(3) _
  .CellBelow.SetValue(3) _
  .CellBelow.SetValue(5) _
  .CellBelow.SetValue(1) _
  .CellBelow.SetValue(4)
ws.Cell("B1").SetValue("数字") _
  .CellBelow.SetValue(7) _
  .CellBelow.SetValue(8) _
  .CellBelow.SetValue(10) _
  .CellBelow.SetValue(9) _
  .CellBelow.SetValue(7) _
  .CellBelow.SetValue(6)

'オートフィルターの2列目で数字の 7, 8, 6 を抽出
ws.RangeUsed.SetAutoFilter.Column(2) _
    .AddFilter(7) _
    .AddFilter(8) _
    .AddFilter(6)

'オートフィルターの1列目で昇順ソート
ws.AutoFilter.Sort(1)

wb.SaveAs("D:\test\AutoFilter.xlsx")

カスタムフィルタ

Dim wb = New XLWorkbook
Dim ws = wb.Worksheets.Add("オートフィルター")

'データの用意
ws.Cell("A1").SetValue("文字") _
  .CellBelow.SetValue("B") _
  .CellBelow.SetValue("C") _
  .CellBelow.SetValue("C") _
  .CellBelow.SetValue("E") _
  .CellBelow.SetValue("A") _
  .CellBelow.SetValue("D")
ws.Cell("B1").SetValue("文字") _
  .CellBelow.SetValue("G") _
  .CellBelow.SetValue("J") _
  .CellBelow.SetValue("F") _
  .CellBelow.SetValue("K") _
  .CellBelow.SetValue("I") _
  .CellBelow.SetValue("H")

'オートフィルターの1列目で「B 以上 D 以下」の条件を設定
ws.RangeUsed.SetAutoFilter.Column(1).Between("B", "D")

'オートフィルターの2列目で降順ソート
ws.AutoFilter.Sort(2, XLSortOrder.Descending)

wb.SaveAs("D:\test\AutoFilter.xlsx")

上記コードの実行結果は下図のようになるはずでした。

しかし、実際には下図のようになりました。(A 列に "E" があってはいけないはずです)

いろいろ試してみたところ、Excel 上でフィルタの[再適用]ボタンをクリックすると "E" が消えて想定通りの結果になりました。

ちなみに、コードの中に ws.AutoFilter.Reapply を入れてもダメでした。

それから、今回は2列のデータでオートフィルタを試したら上記のようにちょっと変な結果になったわけですが、1列のデータの場合は最初から正しい結果でした。

 

カスタムフィルタの設定状態を確認するには、フィルタをクリック>[テキストフィルター]>[ユーザー設定フィルター]をクリックします。

 

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

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