Python 業務自動化 | Excel業務自動化:Excel基本操作 - Excelフィルタ

Python Python
スポンサーリンク

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のフィルタ結果を取得する」ことはできません。
そのため、実務では次の流れが最も使われます。

  1. ExcelのデータをPythonで読み込む
  2. 条件に合う行だけ抽出する
  3. 抽出結果を別シートや別ファイルに書き込む

この方法は 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側で条件抽出」する方が圧倒的に柔軟
  • 完全一致・部分一致・数値条件・日付条件を組み合わせれば何でも抽出できる
  • 抽出結果を別シートに書き込めばレポート自動生成が完成する

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