Excelから条件に合うデータを抽出保存!PythonでExcelの操作を自動化しよう。
VBAユーザーの為のPYTHON 03回
Excelブックから、条件にあったデータを抽出し別ブックに保存。
3回目では、2回目の2つ目のプログラム、Excelのブックにあるデータから、条件にあったデータを抽出し別ブックに保存の解説をします。
【いきなりPython × Excel】Excelのから条件に合うデータを抽出保存3回 VBAユーザーの為のPython入門
1. Pythonはプログラミング言語です。そのプログラミング言語には2種類あり、コンパイラ型言語と、インタープリタ言語の2種類あります。
コンパイラ型言語には、C/C++,FORTRAN,COBOL などがです。事前に全てのソースコードをコンパイル翻訳してからプログラムを実行するため、実行速度が速いという特徴があります。
インタプリタ言語には、JavaScript、Python、Ruby、PHP、BASIC、Lispなどがあります。インタプリタ言語は、コードを実行する際に1行ずつ機械語に翻訳していく言語です。
インタプリタ言語はコンパイラよりも処理速度が遅くなりますが、1行ずつ実行するため、エラーの場所を見つけやすいメリットがあります。
2.pythonはオブジェクト思考の言語で もあり ますつまりpythonで扱うデータは全て オブジェクトとして扱えます。
これはVBAと 同じ考え方ですからVBAを使っている皆さんはすぐに馴染めると思います。
3. ライブラリが豊富にあり、様々なプログラムを作成することができます。これがPythonというプログラム言語が今 1番人気と言われる理由かと思います。
4.Pythonでよく使うライブラリのほんの一部。
2回目の後半コード「読み込んだデータから条件に合ったデータを探す」の解説
5.いきなりPythonの2回目では、ファイルをColaboratoryのセッションストレージにアップロードして、それを読み込みました。
いきなりPython3回ではコードを追加し、
「読み込んだデータから条件に合ったデータを探す」に進化させました。
そのコードの解説をしたいと思います。
前半部分は、ほとんど同じコードです。
6.後半にて、 「# 合計点数が160未満の生徒を探す」コードが追加されます。
実行すると、セッションストレージに「試験結果_補習者決定.xlsx」
というブックが作成されます。それでは追加した”条件で絞り込むためのコード”を説明します。
6列目の値が<160 ならばそのデータを補習者.xlsx に書き込むというものです。
そして、その補習者.xlsxを別名で保存します。
7. 作成されたブックを右クリックして、ダウンロードを選択して、
保存するフォルダを指定します。
以下はブックをダウンロード後、ブックを開いて確認したところです。
8. 以下のコードのIf文で、行のセル row[5] これは6番目のセル、つまり6列目ということです。
それが、is not None and row[5] < 160: ならば、
補習者リストに追加しています。
# 合計点数が160未満の生徒を探す for row in ws.iter_rows(min_row=2, max_col=6, max_row=ws.max_row, values_only=True): # 合計点数を確認 row[5]は6番目のセル if row[5] is not None and row[5] < 160: # 補習者リストに追加 last_row += 1 # 新しい行にデータを追加するため、行番号を増やす for col, value in enumerate(row, start=1): new_ws.cell(row=last_row, column=col, value=value)
その繰り返しを
for row in ws.iter_rows
分行います。
最終的に、ブックに名前をつけて保存したいので、
以下のコードでファイル名を設定して保存しています。
# 保存ファイル名の作成 xlsx_file = "/content/試験結果.xlsx" file_name = os.path.splitext(os.path.basename(xlsx_file))[0] new_wb.save(f"/content/{file_name}_補習者決定.xlsx")
Colaboratory で使用したコードの全体「補習者を探す」
import openpyxl as op import os # 元のファイルを読み込み source_file = "/content/試験結果.xlsx" wb = op.load_workbook(source_file, data_only=True) ws = wb.active # 補習者.xlsx ファイルをひな形として読み込む template_file = "/content/補習者.xlsx" new_wb = op.load_workbook(template_file) new_ws = new_wb.active # 補習者.xlsxの既存データの最終行を見つける last_row = new_ws.max_row # 合計点数が160未満の生徒を探す for row in ws.iter_rows(min_row=2, max_col=6, max_row=ws.max_row, values_only=True): # 合計点数を確認 小なりを記号に書き換えます。 if row[5] is not None and row[5] < 160: # 補習者リストに追加する前に、データをプリントする print("転記するデータ:", row) # 補習者リストに追加 last_row += 1 # 新しい行にデータを追加するため、行番号を増やす for col, value in enumerate(row, start=1): new_ws.cell(row=last_row, column=col, value=value) # 保存ファイル名の作成 xlsx_file = "/content/試験結果.xlsx" file_name = os.path.splitext(os.path.basename(xlsx_file))[0] new_wb.save(f"/content/{file_name}_補習者決定.xlsx")