“学びたい”を刺激するメディア。

2021.01.05

Column

面倒なExcelシート間の転記処理。Python(パイソン)なら負担軽減に!

面倒なExcelシート間の転記処理。Python(パイソン)なら負担軽減に!

Excel作業で頻繁に生じるのがシートから別のシートへのデータの転記処理。繰り返しの単純作業は関数やマクロを駆使して自動的に処理させるのがこれまでの“Excel名人”の王道でした。

そのなかに新たにPythonという選択肢を加えてみてはいかがでしょうか。

簡単で汎用性の高いプログラミング用語PythonでExcelを操作する方法を基礎から学ぶことができるSchooの授業シリーズ『Excel×Pythonで業務効率化』。第3回である今回は、Python×Excelでシート間の転記処理を素早く簡単に処理させる方法を学ぶことがメインテーマとなっています。

講師は第1種情報処理技術者であり株式会社イーザー 代表取締役副社長の金宏 和實先生。プログラミング講師やライターとしての活動も行う金宏先生の“伝わる”Python講座で業務効率化スキルをどんどん伸ばしていきましょう!

目次

  • 今回記述するのは“ソリューション感”のあるプログラム
  • 指定の項目をワークブックから取得する
  • ついにプログラムが完成!

 

 

今回記述するのは“ソリューション感”のあるプログラム

 

「今回はソリューション感(目的に対する“やった感”)のあるプログラムを説明したい」という金宏先生。これまでの授業を軽く振り返ったうえで早速「Excelシート間の転記処理」が開始されました。

 

今回作るのは「複数の伝票を一覧表に転記する処理」。S・M・Lなどサイズごとに値段が設定されているドレスシャツ、ポロシャツ等の売上伝票を一覧表にまとめて管理しやすくします。

 

実際には以下のプログラムが記述され、解説が進められました。

 

import pathlib
import openpyxl

 

lwb = openpyxl.Workbook()
lsh = lwb.active
list_row = 1
path = pathlib.Path(“.\sales”)
for pass_obj in path.iterdir():
  if pass_obj.match(“*.xlsx”):
    wb = openpyxl.load_workbook(pass_obj)
      for sh in wb:
        for dt_row in range(9,19):
          if sh.cell(dt_row, 2).value != None:
            lsh.cell(list_row,1).value = sh.cell(2,7).value
            lsh.cell(list_row,2).value = sh.cell(3,7).value.date()
            lsh.cell(list_row,3).value = sh.cell(4,3).value
            lsh.cell(list_row,4).value = sh.cell(7,8).value
            lsh.cell(list_row,5).value = sh.cell(dt_row,1).value
            lsh.cell(list_row,6).value = sh.cell(dt_row,2).value
            lsh.cell(list_row,7).value = sh.cell(dt_row,3).value
            lsh.cell(list_row,8).value = sh.cell(dt_row,4).value
            lsh.cell(list_row,9).value = sh.cell(dt_row,5).value
            lsh.cell(list_row,10).value = sh.cell(dt_row,4).value*\sh.cell(dt_row,5).value
            lsh.cell(list_row,11).value = sh.cell(dt_row,7).value
            list_row += 1
lwb.save(“.\sales\salesList.xlsx”)

 

まずは「pathlib」と「openpyxl」の2つのライブラリをインポートします。「pathlib」はあるディレクトリ(サブフォルダ)に入っているブックを全て取得するために使われる標準ライブラリ。「openpyxl」はPythonでExcelを操作するために使われる外部ライブラリで、第一回、第二回の授業でも登場しました。

 

 

つづいて「openpyl.Workbook()」で新しいワークブックを作成し、変数「lwb」に代入します。この時点で新たにワークブックとそのなかのシートが一枚作られていることになります。そこで「lwb.active」でそのシートをアクティベートし、使用可能な状態にします。

 

「その次が難しいところです」と先生。

 

「list_row   =   1」で対象となる行を選択したうえで、「path = pathlib.Path(“.\sales”)」と指定することで、売上伝票が格納されているディレクトリ「sales」にパスを通します。そして、直下の「iterdir」(イテラブルディーアイアール)メソッドを使って、そのパスからファイルをひとつずつ取得します。

 

第二回の授業でも説明されましたが、イテラブルとは「繰り返し可能なオブジェクト」のことを指します。

 

ここから「for文」でファイルを取得する処理を繰り返すわけですが、対象としたいのはExcelファイルだけです。そこで「if文」で「pass_obj.match(“*.xlsx”)」すなわち、パスの拡張子が「xlsx」とマッチしたときだけ、「wb = openpyxl.load_workbook(pass_obj)」でオブジェクトをワークブックにロードするよう指定します。

 


指定の項目をワークブックから取得する

つづいて「ワークブックからシートを取得します」と先生。

 

ここで「for sh in wb」で一つのワークブックに含まれる複数のシートを繰り返し読み込む処理を行います。

 

今回の伝票で取得したいのは「9~18行目」までの明細行。「for dt_row in range(9,19)」で指定します。

 

そして、その直下にて「1:伝票No」「2:日付」「3:得意先コード」「4:担当者コード」「5:No」「6:商品コード」「7:商品名」「8:数量」「9:単価」「10:金額」「11:備考」の11種類の転記すべき項目をセルから取得するプログラムを記述します。

 

 

なおその前の「if文」、「if sh.cell(dt_row, 2).value != None:」では対象となる行の2行目に商品コードが入っていない場合を鑑み、同セルに値が確認できる場合のみ転記処理を行うよう命令しています。

 

また、日付に関しては「.date」で日付部分のみを取り出すよう指定しているなど、細かい指定がなされている点にも注目してみてください。

 


ついにプログラムが完成!

最後に記述された「lwb.save(“.\sales\salesList.xlsx”)」。

 

このプログラムにより、転記した内容を「sales」ディレクトリの「salesList.xlsx」と名付けられたファイルに保存するよう指定することができます。

 

そうして転記が完了したのが、以下のExcelシートです。

 

 

「伝票No」「日付」「得意先コード」など指定した11項目が整然データとして格納されています。

 

ここでリアルタイム受講生から「そもそもPythonはローカル環境でも動作するのか」を尋ねる質問が届きました。Schooの授業ではこのようにコメント欄から質問事項をリアルタイムで講師に対して投げかけることができます。

 

先生の答えは「可能」です。ローカルにPythonをインストールすればローカル環境でもPythonを利用することができます。その方法について詳しくは第1回「Python×Excel:Pythonの基礎を学ぶ」で取り扱われました。気になる人はぜひそちらの動画もご覧になってみてください。

 

ほかの受講生からは「よし、できた」と学びを報告するコメントも。先生は「長いプログラミングなのにすごいですね」と称賛しつつ、「長いといっても30行程度のプログラムを書くだけでそれまで長い時間がかかっていた転記処理を自動化させられるのがPythonのメリット」だと語ります。

 

長いプログラムに慣れない方はつい物おじしてしまうかもしれませんが、実際に実行してみれば今までよりも理解は深まるはず。ぜひコピー&ペーストでもいいのでご自身の実行環境で今回ご説明した「シート間の転記処理」を実行してみてください。

 

また、このシリーズの授業内容は金宏先生の著書『Excel×Python最速仕事術』(日経BP)をもとにして構成されています。文章の方が理解しやすいという方はそちらの本を手に取ってみると効果的かもしれません。

 

文=宮田文机

今回の授業はこちら!

 

『Excel×Pythonで業務効率化 第3回 Python×Excel:シート間の転記処理をPythonで作成』http://schoo.jp/class/7165/room

 

『Excel×Pythonで業務効率化』の最終第4回のタイトルは「Python×Excel:シートの集計処理をPythonで作成」です。本授業からさらに一歩進んだ内容を修めたい人はぜひそちらの授業をご覧ください。

 

『第4回 Python×Excel:シートの集計処理をPythonで作成』 http://schoo.jp/class/7166/room

おすすめ記事

本日の生放送

ペンシルからのプッシュ通知を設定しておくと、新着記事のお知らせなどをブラウザ上で受信できて便利です。

通知を受信しますか?