- Excelフィルタは「必要なデータだけを抽出し、業務に必要な情報を瞬時に取り出す」ための超重要スキル
- openpyxlでExcelのフィルタを設定する(ExcelのUIと同じ動作)
- Python側でフィルタ処理を行う(実務で最も使われる)
- 特定の値でフィルタする(完全一致)
- 部分一致でフィルタする(キーワード検索)
- 数値条件でフィルタする(範囲抽出)
- 日付でフィルタする(期間抽出)
- 抽出したデータを別シートに書き込む(実務テンプレート)
- 例題①:売上データから「東京店」だけ抽出する
- 例題②:エラー行だけ抽出して赤色で強調する
- 例題③:期間内のデータだけ抽出してレポートに書き込む
- Excelフィルタを業務で設計するときの視点
Excelフィルタは「必要なデータだけを抽出し、業務に必要な情報を瞬時に取り出す」ための超重要スキル
Excel業務自動化では、フィルタ(抽出)が非常に多く登場します。
なぜなら、実務のExcelは次のような特徴があるからです。
- データ量が多く、必要な行だけ見たい
- 条件に合う行だけ抽出して別シートにコピーしたい
- 「完了」「未完了」などステータス別に仕分けしたい
- 日付や金額の範囲で抽出したい
Pythonでは openpyxl を使って「Excelのフィルタ機能そのもの」を操作することもできますし、
より柔軟に「Python側で条件抽出して結果を書き戻す」方法もあります。
初心者でも理解しやすいように、両方の方法を丁寧に解説します。
openpyxlでExcelのフィルタを設定する(ExcelのUIと同じ動作)
フィルタを設定する最小コード
from openpyxl import load_workbook
from openpyxl.worksheet.table import Table, TableStyleInfo
wb = load_workbook("sample.xlsx")
ws = wb["Sheet1"]
table = Table(displayName="Table1", ref="A1:C20")
style = TableStyleInfo(
name="TableStyleMedium9",
showRowStripes=True
)
table.tableStyleInfo = style
ws.add_table(table)
wb.save("sample.xlsx")
Python深掘りポイント
Tableを設定すると Excel 上で「フィルタボタン」が表示されるref="A1:C20"がフィルタ対象範囲TableStyleInfoを付けると見た目も整う- Excelの操作と同じフィルタが使えるようになる
Python側でフィルタ処理を行う(実務で最も使われる)
重要な考え方
openpyxlは「Excelのフィルタ結果を取得する」ことはできません。
そのため、実務では次の流れが最も使われます。
- ExcelのデータをPythonで読み込む
- 条件に合う行だけ抽出する
- 抽出結果を別シートや別ファイルに書き込む
この方法は Excelのフィルタより柔軟で強力 です。
特定の値でフィルタする(完全一致)
例:ステータスが「完了」の行だけ抽出
from openpyxl import load_workbook
wb = load_workbook("tasks.xlsx")
ws = wb["一覧"]
filtered = []
for row in ws.iter_rows(min_row=2, values_only=True):
if row[3] == "完了": # D列がステータス
filtered.append(row)
print(filtered)
Python深掘りポイント
values_only=Trueで値だけ取得- 条件に合う行をリストに追加するだけでフィルタが完成
- Excelのフィルタより柔軟で高速
部分一致でフィルタする(キーワード検索)
例:「エラー」を含む行だけ抽出
filtered = []
for row in ws.iter_rows(min_row=2, values_only=True):
if "エラー" in str(row[2]): # C列にログメッセージ
filtered.append(row)
Python深掘りポイント
- Excelの「テキストフィルタ contains」と同じ動作
- ログ解析やコメント抽出で大活躍
数値条件でフィルタする(範囲抽出)
例:金額が 1000 以上の行だけ抽出
filtered = []
for row in ws.iter_rows(min_row=2, values_only=True):
if isinstance(row[2], (int, float)) and row[2] >= 1000:
filtered.append(row)
Python深掘りポイント
- 数値判定には
isinstance()を使う - 金額・数量・スコアなどの抽出に最適
日付でフィルタする(期間抽出)
例:2024年1月以降のデータだけ抽出
from datetime import datetime
filtered = []
for row in ws.iter_rows(min_row=2, values_only=True):
if isinstance(row[0], datetime) and row[0] >= datetime(2024, 1, 1):
filtered.append(row)
Python深掘りポイント
- datetime をそのまま比較できる
- 日付フィルタは実務で非常に多い
抽出したデータを別シートに書き込む(実務テンプレート)
例:フィルタ結果を「抽出結果」シートに書き込む
result_ws = wb.create_sheet("抽出結果")
for r_idx, row in enumerate(filtered, start=1):
for c_idx, value in enumerate(row, start=1):
result_ws.cell(row=r_idx, column=c_idx, value=value)
wb.save("tasks_filtered.xlsx")
Python深掘りポイント
- フィルタ結果を別シートに保存するのは実務で非常に多い
- レポート生成・抽出ツールとして使える
例題①:売上データから「東京店」だけ抽出する
wb = load_workbook("sales.xlsx")
ws = wb["売上"]
filtered = []
for row in ws.iter_rows(min_row=2, values_only=True):
if row[1] == "東京店": # B列が店舗名
filtered.append(row)
result = wb.create_sheet("東京店")
for r, row in enumerate(filtered, start=1):
for c, v in enumerate(row, start=1):
result.cell(row=r, column=c, value=v)
wb.save("sales_filtered.xlsx")
Pythonポイント
- 店舗別抽出は実務で最も多いフィルタ処理
- 完全一致で簡単に抽出できる
例題②:エラー行だけ抽出して赤色で強調する
from openpyxl.styles import PatternFill
fill = PatternFill(fill_type="solid", fgColor="FFCCCC")
for row in ws.iter_rows(min_row=2):
if "エラー" in str(row[2].value):
for cell in row:
cell.fill = fill
Pythonポイント
- フィルタ+背景色変更の組み合わせ
- エラー可視化に最適
例題③:期間内のデータだけ抽出してレポートに書き込む
from datetime import datetime
start = datetime(2024, 1, 1)
end = datetime(2024, 3, 31)
filtered = []
for row in ws.iter_rows(min_row=2, values_only=True):
if start <= row[0] <= end:
filtered.append(row)
Pythonポイント
- 期間抽出はレポート作成で必須
- datetime比較で簡単に実現できる
Excelフィルタを業務で設計するときの視点
- openpyxlの「Table」を使うとExcelのフィルタボタンを付けられる
- 実務では「Python側で条件抽出」する方が圧倒的に柔軟
- 完全一致・部分一致・数値条件・日付条件を組み合わせれば何でも抽出できる
- 抽出結果を別シートに書き込めばレポート自動生成が完成する
