Ccmmutty logo
Commutty IT
1
4 min read

Excelマクロが嫌いで、Pythonだったら。

https://cdn.magicode.io/media/notebox/blob_aBa1jNK

前置き。

16年ほどシステム開発をしてい、一度もExcelファイルとの触れ合わないプロジェクトに携わったことがないのでですが。
そんなもんなんですかね?
それはさておき。

本題

業務をしていると、Excelで以下をするのは日常なのかなと。
設計書を書く、テスト仕様書を書く、レビュー表を書く、課題表を書くetc.
そうしていると、一覧を作ったり、集計をしたりも必ず出てくるわけです。
一覧作成、集計作業を手動でちまちまやるのがかったるくなってくると、
出てきてしまうのが、Excelマクロ(vba)なのかなと。
Excelのウィンドウメニュー「開発」から出てきてしまうというのもあるので。

そこで一つ変化を。

せっかく手作業を自動化するのだから、自身の好きなプログラムでやってみようと思ったのがことの発端です。
単純にvbaがそこまで好きくないってのもありましたが。

例えば、pdfに出力する。

複数のExcelファイルをいっこいっこ開いてpdfに印刷するとか。
結構使えます。
Excelファイル名に「_」で案件名、カテゴリ名などが含まれている時、
カテゴリ名ごとにフォルダを作成し、シートごとにpdfにしているソースです。
from operator import index
import shutil
import win32com.client
import shutil
import os

# pythonからExcel操作をするときのおまじない
# このおまじないによりvbaの各種メソッドが利用できるようになる。
# なので、基本マクロをpythonで作る感覚になる。
excel = win32com.client.Dispatch("Excel.Application")

# TODO:適宜パスは変更をば。
input_path = '【】'
output_path = '【】'

files = []
html = ''

# outputディレクトリ内のフォルダを削除
for dir_name in os.listdir(output_path):
    if os.path.isdir(os.path.join(output_path, dir_name)):
        shutil.rmtree(os.path.join(output_path, dir_name))

# inputディレクトリ内の拡張子xlsxファイルを抽出
for filename in os.listdir(input_path):
    if os.path.isfile(os.path.join(input_path, filename)):
        name, ext = os.path.splitext(filename)
        if ext == '.xlsx':
            files.append(filename)

for i in range(0, len(files)):
    # ファイル名と拡張子を取得
    name, ext = os.path.splitext(files[i])
    try:
        # pathで指定したフォルダ内にあるexcelファイルを取得
        xlsx = excel.Workbooks.Open(input_path + '/' + files[i])

        # _で分割し、最後の要素をフォルダ名とする。
        dirname = name.split('_')[-1]
        # pdfファイル接頭番号
        prefix = 1

        for j in range(1, xlsx.Worksheets.Count + 1):
            # 表示シートを選択
            if xlsx.WorkSheets(j).Visible == -1:
                # シートを選択
                xlsx.WorkSheets(j).Select()

                # PDFファイル名生成 (左からの連番 + _ + シート名)
                outputFileName = str(prefix) + '_' + xlsx.WorkSheets(j).name

                # ブックごとのフォルダ作成
                if not os.path.exists(output_path + '/' + dirname):
                    os.mkdir(output_path + '/' + dirname)

                # pdf 印刷(0)
                xlsx.ActiveSheet.ExportAsFixedFormat(
                    0, output_path + '/' + dirname + '/' + outputFileName)

                prefix += 1

    except Exception as e:
        print(e)
    finally:
        # 保存しないで閉じる(SaveChanges=0)
        xlsx.Close(SaveChanges=0)
そこまで難しくもなく、vbaで書くよりなんとなくやりやすいってだけかもですが。
気分転換としてはいいのかなと思い、結構業務中こんなことしてます。
pythonだけじゃなく、bashだったり、PowerShellだったり。
ガッツリ自身が開発しているわけではないので、こういう細々したものくらいは
自分でつくろうかなぁと日々思っているわけです。

おち

こんなんだったら、chatGPTに聞いてしまえば答え教えてくれますw
ぜひ、自身の作業効率化のために、隣にchatGPTを置いてみてください。

Discussion

コメントにはログインが必要です。