先の「Excel VBA 複数シートを別々のブックに保存」記事では、Excel VBAコードの一例をご紹介しました。
今回は、それと同様な動作をする Pythonで実行するコードを作ってみます。

VBAで実現できるのだから、何も Pythonでさせなくても良いのでは?
確かにそうですね。
でも、VBAコードを組み込むということは、そのブックを「マクロ有効ブック」形式で保存しないといけないし、複数シートのブックにその都度 VBAコードを組み入れないといけないという面倒が付きまといます。
Pythonコードを作れば、“外部”から Excelブックを操作することができ、Excelブックを壊さずにデータを取り出すこともできます。

さて、今回は、Pythonの Excelを操作するライブラリで最も多く使われる「OpenPyxl」を使って Pythonコードを作ってみます。

いきなりですが、サンプルコードを示します。(下図)

 

上図は Visual Studio Code (VScode)で表示したもので、コピペして練習される方のためにコードを下に貼り付けておきました。

import os
import openpyxl

filename = '元のブック.xlsx'
foldername = os.path.splitext(filename)[0]
foldername = os.path.dirname(__file__) + '\\' + foldername
filename = os.path.dirname(__file__) + '\\' + filename
# フォルダが存在していなければ作成
os.makedirs(foldername, exist_ok=True)
# 対象ブックの読み込み
wb0 = openpyxl.load_workbook(filename=filename)

for n in range(0, len(wb0.worksheets)):
    ws0 = wb0.worksheets[n]
    wb1 = openpyxl.Workbook()
    ws1 = wb1.worksheets[0]

    for i in range(1, ws0.max_row+1):
        for j in range(1, ws0.max_column+1):
            ws1.cell(row=i, column=j).value = ws0.cell(row=i, column=j).value
    ws1.title = wb0.sheetnames[n]
    wb1.save(foldername + '\\' + ws0.title + '.xlsx')
    wb1.close()
wb0.close()

まだ、ライブラリ「OpenPyxl」をインストールしていない環境であるなら、コマンドプロンプトなどで「pip install openpyxl」を実行しておいてください。

上記コードは一例であって、他の手順でもシートごとに分割して保存する機能は実現できることはお含みおきください。

少しだけ解説しておきます。

「元のブック.xlsx」というのが、複数のシート「東京」「千葉」「埼玉」を含むブックで、各シートにはそれぞれにデータが入力されています。
7行めで、このブックの名前「元のブック」をフォルダ名とするフォルダを作成しています。
そして、11行めで「元のブック.xlsx」を読み込んでいます。

13~23行の for文でワークシートの数だけ繰り返しデータを保存ブックのシートにコピーしています。

実は、「OpenPyxl」には「copy_worksheet」という機能が備わっているのですが、これは同じブック内でシートをコピーするもので、別ブックへのコピーはできない仕様になっています。
そのため、上記コードでは、各シートに含まれる全データセルについて(今回はその値のみ)コピーしています。

このコードを実行すると、「元のブック.xlsx」ブックが置かれているフォルダ内に「元のブック」フォルダが作成され、その中に「東京」「千葉」「埼玉」という各シートの名前を付けられたブックが作成され、それぞれのブックには同じ名前のシートが含まれています。

なお、「OpenPyxl」についての説明は、コチラからアクセスできます。

次回は、Googleドライブ上で Pythonコードを試せる「Colaboratory」で同様な動作を試してみます。