Python の oletools で日本語の VBA を出力する方法

VBA はどこにある?

以下の記事がとても参考になる。

実務であまり役に立たないVBAの内部の話 - Qiita

マクロの実体は vbaProject.bin というバイナリファイルの中にあるらしく、これを解析すると VBA を取得することができる。

このファイルは Compound File Binary Format というファイル形式で仕様は効果されているらしい。
時間があるときに確認してみたい。

[MS-CFB]: Compound File Binary File Format

oletools で VBA を出力する方法

vbaProject.bin を自分で解析して VBA を出力するのは大変なので oletools というライブラリを使用する。
このライブラリは olefile というパーサを使いやすくしたもの。

ただし、このライブラリで VBA を出力すると以下の記事にもあるように日本語は文字化けをしてしまう。

ExcelマクロのVBAソースコードをAzure DevOpsでバージョン管理する方法

この記事では extract_macros を自作することで対応をしていたが、以下のように bytes2str を置き換えることでも日本語することができた。
記述量も少なく手軽に実行できるので記事にしておく。

import os
import oletools.olevba as vba

# ------------------------------------------------------------------
# 定数
OUT_DIR = "./out"
"""出力するフォルダ"""

# ------------------------------------------------------------------
# 日本語出力用の設定
def _bytes2str(bytes_string: bytes, encoding="utf-8"):
    # ShiftJis でデコードする
    return bytes_string.decode("shift_jis", errors="replace")

# VBA を文字列に変換する関数を置き換える
vba.bytes2str = _bytes2str

# ------------------------------------------------------------------
# 処理
vba_parser = vba.VBA_Parser("./assets/sample.xlsm")

vba_modules = vba_parser.extract_all_macros() if vba_parser.detect_vba_macros() else []

for _, _, filename, contents in vba_modules:
    file = os.path.join(OUT_DIR, filename + ".vb")
    os.makedirs(os.path.dirname(file), exist_ok=True)
    with open(file, mode="w", encoding="utf-8") as fp:
        fp.write(vba.filter_vba(contents))

サンプルコードは以下に置いておく。

GitHub - uttne/how-to-output-japanese-vba-with-oletools

その他の参考

コメント

このブログの人気の投稿

better-sqlite3 を AWS の Lambda で動かす

Amazon Linux 2 に PostgreSQL をインストールする