Pythonで面倒なExcelの仕事を自動化しよう( 第一弾 )|一瞬で仕事がおわるプログラミング活用術

PythonでExcelファイル作成高速1秒
Python仕事自動化

こんにちは。キノコードです。
みなさん、Excelでの単純作業を面倒だなと感じたことはありませんか?
私はプログラミングを覚える前、Excelでの単純作業を毎日繰り返ししていました。
例えば、上司へのレポートを作るため毎日1時間かけて作業をしていました。1年間だと200時間以上です。
200時間以上あれば、もっと成果を出せる仕事に集中できたり、早く帰宅して自分のやりたいことに集中できたはずです。
皆さんも、そんな単純作業に頭を抱えていませんか?
Pythonでは、色々なことを自動化することができます。
したがって、そのExcelでの単純作業は、プログラミングのPythonで自動化できるかもしれません。
プログラミングを1度書いてしまえば、ほんの一瞬で作業が終わります。

この記事の執筆・監修

キノコード
キノコード

テクノロジーアンドデザインカンパニー合同会社のCEO。
日本最大級のプログラミング教育のYouTubeチャンネル「キノコード」や、プログラミング学習サービス「キノクエスト」を運営。
著書「あなたの仕事が一瞬で片付くPythonによる自動化仕事術」や、雑誌「日経ソフトウエア」や「シェルスクリプトマガジン」への寄稿など実績多数。

この記事の信頼性と私のプロフィール

この記事は、Youtubeにて日本最大級のプログラミング教育のチャンネルを運営しているキノコードが執筆、監修しています。
私自身は、2012年からプログラミング学習を始め、2019年以降はプログラミング教育に携わってきた専門家です。
他にも、私には下記のような実績や専門性があります。

  • キノコードは毎月10名以上、合計100名以上ののプログラミング学習者と1対1でお悩みを聞き、アドバイスをしています
  • キノコード自身は、プログラミングスクールに通ったり、本や有料の動画で勉強してきた経験もあります
  • キノコードは、プログラミング学習サービス「キノクエスト」を運営しています
  • またの出版、プログラミング雑誌への寄稿の実績があります

レッスンで使ったファイル

キノクエストでアカウントの新規登録に進み、メール認証を完了します。

ログインした状態(プラン選択画面が表示されます)で下記のボタンをクリックいただくか、ファイルダウンロードページのURL:https://kinoquest.jp/main/file_download/を直接アドレスバーに入力ください。

Pythonでできる自動化の3つの具体例

ここでは、Pythonでできる自動化の記述を3つほど紹介します。
1つ目に、この動画紹介するExcelでの作業の自動化です。
Excelのデータを取り込んで、計算をしたり、データを書き込んだりすることができます。
色々なデータ加工をして、Excelに吐き出すことができます。
2つ目に、Webスクレイピングです。
Webスクレイピングとは、ウェブサイトからデータをとってくる技術のことです。
例えば、自動でブラウザを立ち上げて、ウェブサイトからデータを取ってきたり、ログインをしてCSVをダウンロードしてきたりすることができます。
3つ目に、データ分析です。合計を出したり、平均や最大値、最小値などの統計量を算出したり、エクセルでやっているようなグラフ化もできます。
これもプログラムを組めば一瞬で算出することができます。
この動画は、エクセルの作業を効率化したい方、プログラミングを勉強しようと思っている方、プログラミングの基本は勉強したけど使いどころに困惑している方に、お役立ちできればと思い動画を作成しました。
この動画では、PythonによるExcel作業の自動化をデモストレーションのような形でお見せします。
動画で使ったソースコードもダウンロードできますので、それをちょっとイジってカスタマイズすることもできます。
この動画だけでは、カスタマイズできない方や、もっと詳しく勉強したい方のために、
Pandas入門コースというレッスン動画も作りました。
Python超入門コースとPandas超入門コースを学習すれば、業務効率化や自動化が可能になるでしょう。
Python超入門コースとPandas超入門コースのURLを概要欄に貼っておきます。
ご興味ある方はご覧ください。
Pythonを使った業務効率化の動画を今後どんどん出していく予定なので、「チャンネル登録」ボタンを押しておいてくださいね。
新しい動画が更新されたときに通知がいくように、復習をする時に動画がどこにいったかわからなくならないようにチャンネル登録をお願いします。
それでは本編にいってみましょう!

Excelファイルの説明

まず、このレッスンで使うExcelの説明をします。
エクセルのファイル名は、sample.xlsxです。
このファイルには、シートが3つあります。
予実管理表、売上管理表、発注管理表です。

具体的なケース その1

これらはどのように仕事で使っているのでしょうか?
例えば、こういったようなケースをイメージしてください。
複数の店舗を運営しているアパレル会社Aがあったとします。
会社Aの発注担当者は、毎日定時に「発注管理表」を確認し、取引先ごとエクセルファイルを分割して、メールで発注しています。
しかし、この発注業務は、面倒だし、作業時間がかかっています。また、作業ミスが発生してしまうこともありました。
もし、毎日の発注業務を自動化できたら、毎月どれくらいの時間を減らすことができるでしょうか。
例えば、1日1時間かかっているとしたら、月20時間くらいは減らすことができます。
そうすると、他の業務ができたり、早く帰れたり、有給を取得したりできますね。
この面倒な作業はすべてPythonにやってもらいましょう
Pythonでコーディングし、実際に動作させてみます。
それでは、パソコン画面をみていきましょう。

実行環境と環境構築

まず、簡単にPythonを使うために、Anacondaを使っていきます。
Anacondaインストール方法は、Pythonの超入門コースの環境構築編をみてください。
概要欄にURLを貼っておきます。
AnacondaにはJupyter Labがインストールされています。Jupyter Labを起動してみましょう。
ちなみに、Jupyter Labの使い方についても、別動画で説明しています。こちらも概要欄にURLを貼っておきます。
起動方法は、macの場合はターミナル、Windowsの場合はコマンドプロンプトでJupyter Labと入力をしてエンターです。
Jupyter Labが起動しました。

ライブラリとは

次に、ライブラリをインストールしていきます。
ライブラリとはなんでしょうか?
ライブラリとは、よく使う機能・関数をまとめて、簡単に使えるようにしたものです。
例えば、あとから説明するPandasというライブラリには、csvファイルやExcelファイルを読み取るための機能や、データを表にする機能、グラフにする機能など、よく使うものをまとめたものです。

Excelを操作できるopenpyxl

!pip install openpyxl

それでは、PythonからExcelを操作するために、「openpyxl」というライブラリをインストールします。
さて、コードを書いていきましょう。
初めに、「!pip install openpyxl」を書きます。
インストールが完了したら、次に、ライブラリを「import」して、openpyxlを使えるようにします。
「import openpyxl」を書きます。

データ解析を支援するpandas

import pandas as pd

次に、「pandas」をインポートします。
Pandasは、データ解析を支援する機能を提供するPythonのライブラリです。
Pandasには、PythonでExcelやcsv操作、グラフ化、人工知能開発で大切なデータの集計や加工などの機能が入っています。
Pandasで扱うデータ構造としてよく使うもので、「Series」と「Dataframe」があります。
1次元のデータを扱うときは「Series」、2次元のデータを扱うときは「Dataframe」というデータ構造になっています。
つまり、1列だと「Series」、2列以上だと「Dataframe」です。
詳しくは、pandas超入門コースで説明していますが、データ構造が1列のものと2列以上のものがあるのだと覚えておいてください。
さて、Pandasもインポートしましょう。
「import pandas as pd」を書きます。
「import pandas as pd」の「as」は、ライブラリ名(pandas)を好きな名前にすることができます。
したがって、「pd」という名前で「pandas」を使えることができます。

ファイルパスを取得するglob

import glob

次に、「glob」インポートします。「import glob」を書きます。
「glob」は、特定の条件に一致するファイル名を取得することができます。

ファイルパスの設定

import_file_path = '読み込みたいファイルパスを指定'
excel_sheet_name = '発注管理表'
export_file_path = '書き出すディレクトリパス'

次に、読み取るエクセルファイルの場所やシート名を、変数に代入していきましょう。
そうすることにより、後日使う時に、ここだけ編集すれば良いことになり楽です。
エクセルファイルが置いてある場所を記述しましょう。
変数名は、ファイルを取り込む場所という意味の「import_file_path」にします。
ファイルの場所とファイル名を調べるには、Jupyter Labのサイドバーで表示されているファイルを右クリック。Copy Pathをクリックしてペーストすればわかります。
これをシングルクオテーションでくくればよいです。
次に、シート名を変数に格納します。
変数名は、Excelのシート名として、「excel_sheet_name」にします。
変数にシート名の「発注管理表」を記述します。
次に、取引先ごとに分割したファイルを書き出す場所を記述します。
変数名は、分割したファイルを置く場所として「export_file_path」にします。

Excelファイルを読み込むread_excel関数

df_order = pd.read_excel(import_file_path, sheet_name=excel_sheet_name)
df_order

次に、「pandas」を使って、Excelファイルの内容を読み込みます。
Excelファイルの内容を読み込みは、pandasのread_excel関数でできます。
その読み取ったデータを格納する変数を定義していきましょう。
read_excel関数を使うと、「Dataframe」というデータ構造で取得するため、「df」とします。
次に、アンダースコアを書きます。
最後に、発注という意味の「order」を書きます。
次に、「pandas」を使って、Excelファイルの内容を読み込む記述を書きます。
「import pandas as pd」で「pandas」の名前を「pd」としたため、「pd」と書きます。
次に、ドットを書いて、「read_excel」を書きます。
これが先ほど説明したread_excelで、これでExcelファイルを読み込むことができます。
次に、丸括弧を書きます。
丸括弧の中には、引数を記述します。
例えば、ファイルの場所とファイル名、他には読み取るシート名を記述します。
まず最初に、ファイルの場所とファイル名を記述しましょう。
先ほど「import_file_path」という変数にファイル名と場所を記述したので、この変数を記述。
次に、カンマを書いて、シート名を記述します。
シート名は先ほどexcel_sheet_nameという変数に代入しました。
sheet_nameという引数にイコールで、excel_sheet_nameを代入しましょう。
これで、Excelファイルの内容を読み込む記述が完了しました。
次に、変数「df_order」を書いて、中身を確認してみます。
では、実行してみましょう。
「発注管理表」シートの内容が読み込まれています。

ユニーク(重複をなくす)するunique関数

company_name = df_order[['会社名']]
company_name

読み込んだデータの列に会社名があります。
会社名には、「株式会社A」と「株式会社A」のように重複する名前があります。
次に、重複する名前を除いた会社名を取得して、変数に代入しましょう。
会社名という意味の変数「company_name」を定義します。
次に、「df_order」を書いて、角括弧を書きます。
角括弧の中に、シングルクォーテーションを書いて、会社名を書きます。
これで、先ほど確認したデータの会社名の列だけ対象とすることができます。
次に、カンマを書いて、ユニーク関数(unique())を書きます。
これで、重複を除く会社名ができたと思います。
確認してみます。
重複を除く会社名を取得できました。

type(company_name)

ちなみに、先ほどとデータの構造が違います。
type関数を使って、データ型を確認してみましょう。
これ(numpy.ndarray)は、NumPyというライブラリの配列ということになります。

type(df_order)

比較として、df_orderのデータ型も確認してみましょう。
DataFrameとなっています。
つまり、データフレームの列をユニーク関数を使って取得すると、データ型が変わるんだということは覚えておきましょう。

ファイル分割する

df_order['会社名']=='株式会社A']

それでは、会社名ごとのデータに分割してみましょう。
試しに、株式会社Aだけのデータを取得してみましょう。
df_orderの会社名というカラムの中で株式会社Aだけ一致するものを取得してみましょう。
その場合は、df_orderのあとに角括弧。角括弧の中にシングルクオテーション。「会社名」と記述します。
そして、株式会社Aだけを取得したいので、イコールを2つ書いて株式会社Aとします。
そうすると、一致する行はTrue、一致しない行はFlaseが返ってきます。

df_order[df_order['会社名']=='株式会社A']]

この記述をそのままdf_orderの角括弧の中に記述するとTrueの行だけ抽出できます。
実行してみましょう。
株式会社Aだけが抽出されました。

for i in company_name:
    print(i)

このような方法でfor文を使って、会社名ごとにデータを分割していきましょう。
まず、「for」と書いて、カウンタ変数「 i」を書きます。
次に、「in」を書い、「company_name」を書きます。
最後に、コロンを書きます。
こうすることで、先ほど取得したcompany_nameのリストが、先頭から順にiに代入されていきます。
printで表示させてみましょう。
ユニークの会社名が表示されていることが確認できます。

for i in company_name:
    df_order_company = df_order[df_order['会社名'] == i]]
    print(df_order_company)

この取得した会社名を使って、会社名ごとに発注データをエクスポートしていきましょう。
まず、変数を書きます。
変数名は、会社ごとの発注として「df_order_company」とします。
次に、読み込んだデータを会社ごとに分けます。
「df_order」を書いて、角括弧を書きます。
角括弧の中に、「df_order」を書いて、角括弧を書きます。
角括弧の中に、シングルクォーテーションを書いて「会社名」を書きます。
次に、イコールを2つ書いて、カウンタ変数のiを書きます。
では、print関数を使って、変数の中身をみていきましょう。
会社名ごとにデータが分かれていることが確認できます。

for i in company_name:
    df_order_company = df_order[df_order['会社名'] == i]]
    df_order_company.to_excel(export_file_path + i + '.csv')

最後に、会社ごとに分けたデータをファイルに書き込みます。
変数(df_order_company)を書いて、ドットを書きます。
次に、to_excelメソッドを書きます。
このメソッドで、Excelファイルにデータを書き出すことができます。
次に、丸括弧の中に、分割したファイルを置く場所(export_file_path)を書きます。
次に、ファイル名を結合するために、「+」を書きます。
次に、シングルクォーテーションを書いて、カウンタ変数の「i」を書きます。
最後に、シングルクォーテーションを書いて、拡張子(.xlsx)を書きます。
これで記述はおわりです。
それでは、実行してみましょう。
ファイルが作成されています。
ファイルの中身も確認してみましょう。
会社ごとのデータが書き込まれています。


これをpythonファイルに変換して実行をすると、今の作業が1秒で終わります。
やってみましょう。
これがPythonファイルにしたものです。先ほど書き出したエクセルファイルを削除して、実行して意味ましょう。
1秒も経たないうちにファイルが作成されましたね。
このように、Pythonで実行すると、圧倒的な業務効率化が可能です。
また、毎日この作業をやるとすると、毎月どのぐらいの時間が短縮できるのでしょうか。
仮に毎日30分かかっているとしたら、月10時間の時間削減です。時給換算すると数万円以上の経費削減です。
また、ファイル内のデータを手動で選別するわけではないので、間違いが起こりません。
間違えがなければ、取引先や上司や同僚にも迷惑がかかりません。
今回のレッスンでは紹介しませんが、分割したファイルをメールで送るようにプログラムを組むと、自動的に発注することができます。
さらに、毎日決まった時間になったら、プログラムを実行するように設定すると、何にもしなくても発注することができるようになります。
これで、ファイル分割、メール送信などの作業が1日1時間なら、年間200時間の時間削減です。約1か月分の労働時間になりますね。
Pythonを覚えて試してみる価値はあると思います!
さて、ここまでがレッスンの真ん中です。
いかがでしたでしょうか?
キノコードでは、他にも自動化のレッスンを配信していきます。
もしよければ、チャンネル登録をお願いします。さて、次にいきましょう!

具体的なケース その2

次に、分割したファイルを1つにするプログラムを組んでみましょう。こういったようなケースをイメージしてください。
複数の支店をもつ生命保険会社Bがあったとします。
各支店長は、支店の予算と実績を管理している予実管理表を本部に報告しています。
本部の担当者は、送られてきた予実管理表を集計し、上司に報告しています。
ファイルはデスクトップのMyPandasというフォルダのrawdataというところに保存されているとします。
 
もし、毎日の集計業務がなかったら、毎月15時間くらいを減らすことができます。
それでは、面倒な作業はすべてPythonにやってもらいましょう
Pythonでコーディングし、実際に動作させてみます。
それでは、みていきましょう。

ファイルパスの設定

import_file_path = '読み込みたいファイルパスを指定'
path = import_file_path + '/'+ '*.xlsx'

まず、分割されたファイルを1つのファイルにしたものを書き出す場所を記述しましょう。
MyPandasのディレクトリの直下にしましょう。
次に、各支店の予実管理表の各ファイルを置いてある場所を書きます。
変数名は、ファイルを取り込む場所という意味の「import_file_path」にします。
変数にファイルを取り込む場所を代入します。
次に、ファイルを取り込む場所にある、すべてのファイルの情報を取得してみます。
まず、pathという変数を定義します。
次に、「import_file_path」を書いて、プラスを書きます。
次に、シングルクォーテーションを書いて、「/」を書きます。
次に、プラスを書きます。
最後に、シングルクォーテーションを書いて、「*.xlsx」を書きます。
「*.xlsx」は、拡張子が「xlsx」の全てのファイルという意味です。

globによるファイル名の取得

file_path = glob.glob(path)
file_path

これをglobを使ってフォルダの中にある、「xlsx」の全てのファイルを取得してみましょう。
「glob」は、最初にレッスンの最初でお話ししましたが、特定の条件に一致するファイル名を取得することができます。
globドットglobと書き、丸括弧。丸括弧の中に先ほど変数に格納したpathを記述しましょう。
実行してみます。
これでデータが取得できたはずです。
取得したデータをみてみましょう。
フォルダの場所とファイル名が表示されました。

ファイル読込

df_concat = pd.DataFrame()

for i in file_path:
    df_read_excel = pd.read_excel(i)
    print(df_read_excel .head(3))

次に、for文を使って、Excelファイルを読み込ます。
for文を使ってExcelファイルを読み込んだ後に、データをひとつにまとめてみましょう。
そのため、for文を使う前に、データが入っていない「Dataframe」を作り、変数に格納しておきます。
この変数に次々、データを入れていきましょう。
変数(df_concat)を書いて、イコールを書きます。
次に、「pd」を書いて、ドットを書きます。
最後に、「DataFrame」を書いて、丸括弧を書きます。
これで空のデータフレームができました。
それでは、for文を書いていきます。
まず、「for」を書いて、カウンタ変数のiを書きます。
次に、「in」を書い、「file_path」を書きます。
最後に、コロンを書きます。
これでiに取得したファイル名がつぎつぎ代入されていきます。
次に、Excelファイルを読み込みます。
各視点のExcelファイルを読み込んだデータを格納するために「df_read_excel」という変数を書きます。
次に、「pandas」の省略名「pd」を書いて、ドットを書きます。
次に、read_excel関数を書いて、丸括弧を書きます。
丸括弧の中に、「i」を書きます。
それでは、読み込んだデータをみてみましょう。
表示するデータ量が多いため、最初の3行だけ表示します。
「df_read_excel」の後にドットを書いて、「head」を書きます。
次に、丸括弧を書いて、「3」を書きます。
それでは、表示してみます。
支店ごとのデータが読み込まれていることが確認できました。

表同士をくっつけるconcat関数

df_concat = pd.DataFrame()

for i in file_path:
    df_read_excel = pd.read_excel(i)
    df_concat = pd.concat(df_read_excel, df_concat)

先ほど書いたコードのプリントの部分を消して、新たな1行に加えたのがこのセルの記述です。
次に、読み込んだデータをひとつにまとめます。
まず、「df_concat」という変数にまとめていきましょう。
次にイコールを書きます。次に、「pd」を書いて、concat関数を書きます。
concat関数は、それぞれのデータフレームをくっつけることができます。
詳しくは、Pandas超入門コースで説明しますので、そちらをご覧ください。ここでは、concat関数は、データフレームという表を縦につっけていくものなのだと覚えておいてください。
次に、丸括弧を書いて、角括弧を書きます。
角括弧の中に、読み込んだデータ(df_read_excel)を書いて、カンマを書きます。
続いて、for文の前に定義した、空のデータフレームである「df_concat」を書きます。
それでは、実行した後に、中身をみてみましょう。
データがひとつにまとまりました。

df_concat

表示させてみましょう。
まとまっていることが確認できました。

列や行を削除するdropメソッド

df_drop = df_concat.drop('Unnamed: 0,' axis=1)
df_drop.head(3)

ただし、表示されたデータに、このような名前(Unnamed: 0)の列があります。
こちら(Unnamed: 0)は、不要なので、列ごと削除します。
まず、「df_drop」という変数を書いて、イコールを書きます。
次に、「df_concat」を書いて、ドットを書きます。
次に、「drop」メソッドを書いて、丸括弧を書きます。
このメソッド(drop)を使うと、行や列を削除することができます。
丸括弧の中に、シングルクォーテーションを書いて、こちら(Unnamed: 0)を書きます。
次に、カンマを書いて、1行目を指定するためにこちら(axis = 1)を書きます。
それでは、実行してみます。
列が削除されました。

並び替えをするsort_valuesメソッド

df_sort = df_drop.sort_values(by='達成率', acsending=False)
df_sort

次に、達成率順に並び替えます。
まず、「df_sort」という変数を書いて、イコールを書きます。
次に、「df_drop」を書いて、ドットを書きます。
次に、「sort_values」メソッドを書いて、丸括弧を書きます。
このメソッド(sort_values)を使うと、並べ替えができます。
丸括弧の中に、「by」を書いて、イコールを書きます。
続いて、シングルクォーテーションを書いて、「達成率」を書きます。
次に、カンマを書いて、降順にするためにこちら(ascending = False)を書きます。
ちなみに、昇順にしたい場合はイコールのあとをTrueにすればオッケーです。
それでは、実行してみます。
並び替えができているはずです。表示させてみましょう。
「達成率」が降順に並べ替えできました。

Excel書き出すto_excelメソッド

df_sort.to_excel(export_file_path + '/' + '予実管理表.xlsx')

次に、データをExcelに書き出します。
まず、「df_sort」という変数を書いて、ドットを書きます。
次に、to_excelメソッドを書いて、丸括弧を書きます。
このメソッド(to_excel)を使うと、Excelに書き出すことができます。
丸括弧の中に、保存した場所とファイル名を書きます。
ファイル名は、「予実管理表.xlsx」とします。
保存場所とファイル名を結合して、こちら(export_file_path+'/'+'予実管理表.xlsx')を書きます。
それでは、実行してみます。
予実管理表ができました。
予実管理表を開いてみます。

Excelの1列目削除

workbook = openpyxl.load_workbook(export_file_path+'/'+'予実管理表.xlsx')
worksheet = workbook.worksheets[0]
worksheet.delete_cols(1)
workbook.save(export_file_path+'/'+'予実管理表.xlsx')

一番左側の列が不要です。これを削除します。
まず、「workbook」を書いて、イコールを書きます。
openpyxlのライブラリを使います。
次に、openpyxlを書いて、ドットを書きます。

load_workbook関数

次に、load_workbook関数を書いて、丸括弧を書きます。
この関数(load_workbook)を使うと、Excelファイルを読み込むことができます。
次に、こちら(export_file_path+'/'+予実管理表.xlsx')を書きます。
次に、操作するシートを指定します。
まず、「worksheet」という変数を書いて、イコールを書きます。
次に、「workbook」を書いて、ドットを書きます。
続いて、「worksheets」を書いて、角括弧を書きます。
角括弧の中に、最初のシートを指定するために「0」を書きます。
次に、不要な列を削除する記述をします。
まず、変数「worksheet」を書いて、ドットを書きます。

delete_colsメソッド

次に、「delete_cols」メソッドを書いて、丸括弧を書きます。
このメソッド(delete_cols)を使うと、指定した列を削除することができます。
次に、丸括弧の中に、一番左の列を削除するために「1」を書きます。
最後に、Excelファイルを保存する記述をします。
まず、「workbook」を書いて、ドットを書きます。そして、saveを記述。
次に、丸括弧を書きます。
丸括弧の中に、こちら(export_file_path+'/'+予実管理表.xlsx')を書きます。
ファイル名が区別できるように予実管理表_01.xlsxとしましょう。
それでは、実行してファイルの中身を確認してみましょう。
不要な列が削除されました。

まとめ

二つのケースをみてきましたが、いかがだったでしょうか。
他にも、Pythonによるエクセル操作の方法はあります。
ほぼ、できないことはないといっても過言ではないです。
みなさんもPythonを勉強して仕事の生産性をあげていきましょう。
他にも、業務効率化や自動化のレッスンを配信していきます。
気に入った方は是非チャンネル登録をお願いします。
それでは次のレッスンでお会いしましょう