【Python自動化】openpyxlを使って 社内のExcel作業を自動化する

Python・GAS・DS

今回は社内でのエクセル業務の自動化について理解を深めます。

Pythonを使うと、Excel仕事を効率化・自動化することが可能です。

では具体的にどうやるのか?Pythonかじりはじめたばかりでもできるのか?実務で使えるのか?

この点を明らかにするべく、営業上がり・非エンジニアの私でも出来るレベルの効率化ワザをまとめます(‘◇’)ゞ

合わせて確認したい記事

Pythonを時短で基礎から応用まで一気に学びたい時はこちらもオススメ!
>>【Python】TechAcademyを実際に使ってみて学べたこと

今回の論点整理

今回のアウトプット

今回は既存のエクセルデータの編集をPythonを使って行います。

イメージとしては以下のように、指定の範囲をコピーして貼り付けるなどのエクセルの基本作業をプログラムにやってもらいます。

普段はwindows機を使っているので、ここらへんはマウスを使って、エクセルでポチポチやっているわけですが、これを効率化できないかと考えます。

特に、定型的な業務になっているものは、毎回開いて同じ加工をする作業は自動化できるはず!という思想に則り考えます。

参考にしているのは以下の書籍です。ポイントを絞ってかなり詳しく記載してもらえておりオススメです。

ツマ

参考書があると目的に対して勉強の流れが明確になるね。

今回の勉強背景

今回は現業でのデータ活用を深めるべく学んでまいります。

ここで、現業のデータの利活用の流れを考えると下記、大きく3つのフェーズで考えられます。

  • フェーズ1:データ収集
    ▷全国の取引先からのアンケートやアセスメント結果、販促データを収集
  • フェーズ2:データ抽出
    ▷上記のデータを抽出して、整理した資料を作成して考察
  • フェーズ3:データ共有
    ▷出てきた知見を販促資料や戦略の基礎資料として共有

ざっくりいうとこんな感じで大別されます。

その中で、日常業務で関わるところは多くの場合フェーズ2とフェーズ3の工程に派生した業務(雑務)だったりします。

そのためこの点をもっと業務効率化(自動化)できないかというのが焦点です。

ワタシ

実務に繋がること・プラスになることを意識した方がモチベが続きやすいと思っています。

今回の位置づけ

また、この領域を自動化させるために必要なステップは以下の6ステップだと考えています。

その上で、今回はデータは何らかの形で抽出されている前提で、そのデータをいじる工程であるSTEP1を対象にします。

上記を実現する手順について下記に備忘録的にまとめたいと思います。

今回のポイントは以下の3点になります。

抑えドコ!
  • Excelファイルをいじれる関数をインストールする
  • コピペをするところからやってみる
  • 複数データを読み込み、新タブで出力する

順に触れていきます。

Excel業務の自動化に向けたポイント

① Excelファイルをいじれる関数をインストールする

まずは何はともあれ、エクセルがいじれる環境にしないといけないので、ここの整備を行います。

Excelの作業は以下のコードでいじくれるようになります。

import openpyxl #エクセルのブックを操作するライブラリ の読み込み
import re #文字列操作をするライブラリの読み込み

これを読み込んだ上で、コピペしたりなどのエクセルで普段やる業務にうつっていきます。

ワタシ

まぁこれがないと始まらないですよね…。。

② コピペをするところからやってみる

そして次に考えたいのが、エクセルでいうコピペの作業です。

これは、結論からいうと下記のような関数で出来るようになります。

#コピーアンドペーストする関数 
def copyAndPaste(bookName,sheetName,fromCellRange,toCell):
    workBook = openpyxl.load_workbook(bookName)  #指定したファイル名でエクセルブックを開く
    workSheet = workBook[sheetName]
    #指定したシート名のシートを取得する
    fromStartCell ="" #コピー元開始セル
    fromEndCell = "" #コピー元終了セル
    if fromCellRange.find(':') != -1:        #:が含まれているかどうか判定 
        workCellData = re.split(":",fromCellRange) 
        fromStartCell = workCellData[0]
        fromEndCell = workCellData[1]
        fromStartCell = getRowAndColumn(fromStartCell) #下記で関数を定義している!
        fromEndCell = getRowAndColumn(fromEndCell)
    else:                         #:が含まれていないときに処理される
        fromStartCell = getRowAndColumn(fromCellRange)
        fromEndCell = fromStartCell
    toCell = getRowAndColumn(toCell)
    wrow = 0 #貼り付け行位置計算用の変数
    for i in range(fromStartCell[0],fromEndCell[0]+1):   #行のループ
        wcol = 0 #貼り付け列位置計算用の変数
        for j in range(fromStartCell[1],fromEndCell[1]+1): #列のループ
            workSheet.cell(row = toCell[0] + wrow, column = toCell[1] + wcol).value = workSheet.cell(row = i, column = j).value
            wcol = wcol + 1
        wrow = wrow + 1
    workBook.save(bookName) 
    
#上記の関数内に出てくる関数
def getRowAndColumn(cellAdress):     #指定したセル名から行番号と列番号を取得
    column = re.split("[\d]",cellAdress) #列名の取り出し(リスト)
    column = column[0] #列名を取り出し(文字列)
    row = cellAdress.replace(column,"")  #行番号を取得
    row = int(row)              #行番号を文字列から数値に変換
    column = openpyxl.utils.column_index_from_string(column) #列名を列番号に変換
    return [row,column]          #行番号と列番号をリストで戻す

とりあえずよくわからんでも、上記をコピペして読み込んだ上で下記のファイルで作った関数を使うとそれっぽくできます。

#手元ファイル(販促メモ.xlsx)を読み込み、B2からF7の範囲を選択肢B10に貼りつけ
copyAndPaste("販促メモ.xlsx","Sheet1","B2:F7","B10")

出てくるアウトプットは以下の通りで、上段のデータを下段にコピペすることが出来ます。

この読み込みファイルや指定の変数をかえればコピペは問題なくできるはずです。

尚、今回forループやdefの関数が出てきましたが、何をしているかというとそれぞれ以下の通りです。

  • forループ:繰り返し処理(今回は行と列のセルを一つずつ参照してコピー作業をしています)
  • def関数:定型作業をお気に入り登録のようにまとめます(今回はコピペの作業を登録しています)

これは「python ○○」で検索すると腐るほどでますので都度、何をしたいのかの概要は調べることをお勧めします。

ツマ

なんか急に難しくなったね。。

ワタシ

ただ、コピペするだけで動くので、理解は後でも良いかと。

③ 複数データを読み込み、新タブで出力する

では次にエクセルで言うところの新しいタブを創るみたいな作業をプログラムで実行します。

結論からいうと下記のようなプログラムを組みます。

#シートごとにエクセルブックに書き出し
with pd.ExcelWriter("販促リスト.xlsx",engine="openpyxl",date_format='YYYY/MM/DD',datetime_format='YYYY/MM/DD',mode = "a") as writer: 
    df["合体シート"].to_excel(writer,sheet_name="統合表",index=False)

これで新しいタブはできます。ただそれだけやっても芸がないので、新しいタブに、既存のデータを集約することを想定すると下記のような形で実践できます。

#複数のシートの情報を1つのシートにまとめる
import pandas as pd   
df = pd.read_excel("販促リスト.xlsx",sheet_name=None)
dataList = [] 
sheetsList = list(df.keys())
for sheet in df: #シートループ
    for index,rows in df[sheet].iterrows(): #行ループ
        work = [] 
        for row in rows:#列ループ
            work.append(row) 
        dataList.append(work)
columns = list(df[sheetsList[0]].columns)   #列名をリストで取得
df["合体シート"] = pd.DataFrame(dataList,columns=columns)

#シートごとにエクセルブックに書き出し
with pd.ExcelWriter("販促リスト.xlsx",engine="openpyxl",date_format='YYYY/MM/DD',datetime_format='YYYY/MM/DD',mode = "a") as writer: 
    df["合体シート"].to_excel(writer,sheet_name="合体シート",index=False)

ここでやったのはシンプルに以下のように既にあるタブのセル内容を参照して新たなタブ(合体シート)にコピペして合体する作業です。

簡単ではありますが、貼付けが指定出来、コピペが出来、タブも組合せられれば、基本的なベース作業は自動化できる土台が出来たと思います。

これを元にまずは、現業の集計業務など、身の回りのファイルに置き換えて、まずは自分で組みなおして、自動化する術を腹落ちさせていくのが良いと思います。

ツマ

これはどこの会社でもよくやる作業だね。

まとめ 

上記を活用する際に、理解しておくべきポイントは以下3点でした。

今回の抑えドコ
  • Excelファイルをいじれる関数をインストールする
    まずは専用のライブラリを読み込み環境を整える
  • コピペをするところからやってみる
    範囲選択とコピペの関数を利用して転用する
  • 複数データを読み込み、新タブで出力する
    身の周りのデータを元に試しながら腹落ちさせていく

冒頭申し上げた通り、出来ること一つ一つは大したことないですが、どれもエクセル作業の基礎のパーツになっているかと思います。

そのため、上記をまずは出来る範囲で試しつつも、目の前の仕組を変えられる範囲で少しずつプログラムして、小さなパーツを積み上げる先に完全自動化があると思います。

ご精読頂きありがとうございました!
m(_ _)m

【参考】Python初心者のお勉強のお供

▼PythonでExcelの操作を自動化する▼

【関連】Python×効率化 社内のexcel作業の自動化を試みる①

【関連】Python×効率化 社内のexcel作業の自動化を試みる②

【関連】Python×効率化 社内のexcel作業の自動化を試みる③

【関連】Python×効率化 社内のexcel作業の自動化を試みる④

【関連】Python×効率化 社内のexcel作業の自動化を試みる⑤

上記の内容と併せて実務で活かすという視点では下記の参考図書も合わせて確認すると理解が深まります(-_-)

▼オススメの参考書籍(Kindle)▼

created by Rinker
¥2,138 (2024/04/19 22:40:31時点 Amazon調べ-詳細)

▼おすすめの動画学習(Udemy)

>>ゼロからPythonで学ぶ人工知能と機械学習 【2023年最新版】

>>現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用

>>独学で身につけるPython〜基礎編〜【業務効率化・自動化】

【参考】Python初心者が抑えたいポイント集

Python(主にデータ分析・自動化)に関しては

下記に実践したポイントをまとめています。基本的にコピペするだけでそのまま使えます٩( ᐛ )و

【Python入門】コピペしてそのまま使えるPythonの自動化プログラムまとめ

業務効率化・自動化においてはGoogle Apps Scriptもセットで学ぶことをオススメ!

こちらもコピペしてすぐに使えます!

【GAS入門】コピペしてそのまま使えるGoogle Apps Scriptプログラム一覧

PythonとGoogle Apps Scriptどちらを深めようかを迷っていればこちら!

【徹底比較】PythonとGASをどちらを学ぶべきか?実際に両方を学んで分かった違いとオススメ学習法