Pythonとxlwingsでオートフィルターを実装する方法

xlwingsのオートフィルターの使い方です。オートフィルターに関してWEB検索しても、日本語はもちろん英語でも情報が出てこないので、まとめました。

情報がないのに、どの様にして知り得たかというと、ExcelVBAの関数によって分かりました。そのことも後半に書いてあります。

xlwingsのオートフィルターの使い方

フィルターの制御対象となるエクセルファイルは、事前にオートフィルターが設定してあります。

xlwings AutoFilter setting

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()    #   プロセスを削除

上記実行後のエクセルのシートです。

xlwings AutoFilter setting result

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

上記実行後のエクセルのシートです。

xlwings AutoFilter org result

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')

上記実行後のエクセルのシートです。

xlwings AutoFilter org result

フィルターの条件に、複数の値を指定

1つの列に複数の値を表示する場合です。Operator=7としたうえで、Criteria1に配列を指定します。

# 仕入れ値が120,150,200
rng.api.AutoFilter(Field=3, Criteria1=["120", "150", "200"], Operator=7)    # Operator=7は複数

上記実行後のエクセルのシートです。

xlwings AutoFilter valuesg result

オートフィルターをクリア

オートフィルターを設定したままで、全ての行を表示できます。

# オートフィルターをクリア
wb.sheets[0].api.ShowAllData()

オートフィルターを削除

オートフィルターの設定を削除する方法です。全ての行が表示されます。

# オートフィルターを削除
wb.sheets[0].api.AutoFilterMode = False

オートフィルターの実装で参考にしたサイト

マイクロソフト

xlwingsの実装方法は、ExcelVBAの関数で分かる

求める機能がxlwingsのライブラリにない時、ExcelVBAの関数を呼ぶ手段を取ることができます。

ここまでのオートフィルターも、Excelのマクロ機能を利用して設定する関数を見つけ、Pythonで実行して確認しています。

Excelのマクロで設定するPythonの関数が分かる

マクロを記録する方法は、Excelで開発タブを表示できるようにして

1)開発タブ→マクロの記録を押下

excel macro start

2)実装したい操作をする

Pythonで実装したい機能を操作します。

3)開発タブ→記録終了を押下

excel macro end

4)開発タブ→マクロを表示

excel macro view

上記の方法でマクロが確認できます。

参考にしたエクセルのマクロ

「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()と実装したところ、全行が表示されました。

コメント

タイトルとURLをコピーしました