xlwingsのオートフィルターの使い方です。オートフィルターに関してWEB検索しても、日本語はもちろん英語でも情報が出てこないので、まとめました。
情報がないのに、どの様にして知り得たかというと、ExcelVBAの関数によって分かりました。そのことも後半に書いてあります。
xlwingsのオートフィルターの使い方
フィルターの制御対象となるエクセルファイルは、事前にオートフィルターが設定してあります。
1つの列に、1つの条件を設定
下のサンプルでは、No.が1の時を表示しています。Fieldで列を指定し、Criteria1で値を指定します。指定した値を持つ行だけが表示されます。
import xlwings as xw
xw.App(visible=False) # エクセルの非表示を設定
wb = xw.Book('.\\autofilter.xlsx') # 既存のBOOKを開く
rng = wb.sheets[0].range('a1:f7')
# No.が1
# rng.api.AutoFilter(Field=1, Criteria1="1") # Field=1 は左から数えて1番目の列
wb.save() # 保存
wb.close() # プロセスを削除
上記実行後のエクセルのシートです。
No.が1だけが残りました。
1つの列に、2つの条件を設定
1つの列に2つの条件を設定し、その条件の論理和又は論理積を指定できます。下記のAutoFilterのサンプルでは、Criteria1とCriteria2で2つの条件を指定し、Operatorで条件を指定しています。Operator=2は、ORを表します。ちなみに、ANDはOperator=1です。参考:マイクロソフト xlwingsのAutoFilterのOperation指定
# No.が1 又は 3を超えるもの
rng.api.AutoFilter(Field=1, Criteria1='=1', Operator=2, Criteria2='>3') # Operator=2はOR
上記実行後のエクセルのシートです。
AutoFilterに2つの列に条件を設定
異なる列にそれぞれフィルターの条件を設定します。2列の設定は、2回AutoFilter(を)呼ぶだけです。いうまでもなく、3回api.AutoFilter()を呼べば、3列に設定できます。
# 大根と人参の在庫数が100個を切っているもの
rng.api.AutoFilter(Field=2, Criteria1='=人参', Operator=2, Criteria2='=大根') # Operator=2はOR
rng.api.AutoFilter(Field=5, Criteria1='<100')
上記実行後のエクセルのシートです。
フィルターの条件に、複数の値を指定
1つの列に複数の値を表示する場合です。Operator=7としたうえで、Criteria1に配列を指定します。
# 仕入れ値が120,150,200
rng.api.AutoFilter(Field=3, Criteria1=["120", "150", "200"], Operator=7) # Operator=7は複数
上記実行後のエクセルのシートです。
オートフィルターをクリア
オートフィルターを設定したままで、全ての行を表示できます。
# オートフィルターをクリア
wb.sheets[0].api.ShowAllData()
オートフィルターを削除
オートフィルターの設定を削除する方法です。全ての行が表示されます。
# オートフィルターを削除
wb.sheets[0].api.AutoFilterMode = False
オートフィルターの実装で参考にしたサイト
xlwingsの実装方法は、ExcelVBAの関数で分かる
求める機能がxlwingsのライブラリにない時、ExcelVBAの関数を呼ぶ手段を取ることができます。
ここまでのオートフィルターも、Excelのマクロ機能を利用して設定する関数を見つけ、Pythonで実行して確認しています。
Excelのマクロで設定するPythonの関数が分かる
マクロを記録する方法は、Excelで開発タブを表示できるようにして
1)開発タブ→マクロの記録を押下
2)実装したい操作をする
Pythonで実装したい機能を操作します。
3)開発タブ→記録終了を押下
4)開発タブ→マクロを表示
上記の方法でマクロが確認できます。
参考にしたエクセルのマクロ
「1つの列に複数の値を設定したフィルター」「オートフィルターのクリア」のマクロです。xlwingsのドキュメントに見当たらなかったため、マクロを記録しました。
Sub Macro1()
Rows("1:1").Select
ActiveSheet.Range("$A$1:$F$7").AutoFilter Field:=3, Criteria1:=Array("120", "150", "200"), Operator:=xlFilterValues
Rows("1:1").Select
ActiveSheet.ShowAllData
End Sub
上記では、Criteria1:=Array("120", "150", "200")とありますが、api.AutoFilter(Criteria1='Array("120", "150", "200")')としても、全ての行が表示されなかったため、api.AutoFilter["120", "150", "200"])としたところ、目的の動きになりました。
また、オートフィルターのクリアは、ActiveSheet.ShowAllDataとあったため、シートのインスタンス.api.ShowAllData()と実装したところ、全行が表示されました。
コメント