⚠️ 注意事項(必読)

🚫 悪用厳禁 — 必ず読んでください

本記事で解説する手法は、自分が作成・管理しているファイル、または正当な権限を有するファイルに対してのみ使用してください。

他者のファイルへの無断アクセス・解析・改ざんは以下の法律に抵触する可能性があります。

  • 不正競争防止法(営業秘密の侵害)
  • 不正アクセス禁止法
  • 著作権法(プログラムの無断複製・改変)
  • 刑法(電子計算機損壊等業務妨害罪 など)

また、作業前に必ずファイルのバックアップを取得してください。本記事の内容を実行したことによる損害について、筆者は一切の責任を負いません。

.xlsm 形式の構造

.xlsm(Excel マクロ有効ブック)は、実体は ZIP アーカイブです。 拡張子を .zip に変更して展開すると内部構造を確認できます。

xl/vbaProject.bin
VBA コードとパスワードが格納されたバイナリファイル。これ単体が .xls 相当の OLE2 形式。
xl/workbook.xml
ブック情報(シート名・定義名など)を格納した XML。
[Content_Types].xml
ZIP 内のファイル種別を定義する設定ファイル。

💡 ポイント

vbaProject.bin.xls の VBA 部分と同じバイナリ形式です。そのため、取り出して DPB=DPx= に書き換えるアプローチが有効です。

必要なツール

ツール用途備考
7-Zip / Windows 標準 ZIP 展開 ZIP 解凍・再圧縮 Windows 標準の圧縮機能でも可
HxD vbaProject.bin のバイナリ編集 無料。公式サイトから入手
Python 3.x(任意) 方法2の自動化 標準ライブラリ(zipfile / shutil)のみ使用

方法1:ZIP展開 + バイナリ編集(手動)

⚠️ 作業前にバックアップを取る

元の .xlsm ファイルを必ず別フォルダにコピーしてから作業してください。

  1. Excel ファイル(.xlsm)を閉じる
    Excel で対象ファイルが開かれている場合は必ず閉じてください。
  2. 拡張子を .zip に変更する
    例:sample.xlsmsample.zip
    (エクスプローラーで拡張子を表示し、直接リネームします。確認ダイアログが出たら「はい」を選択)
  3. ZIP ファイルを展開する
    右クリック →「すべて展開」などで展開します。展開先フォルダ名は任意でかまいません(例:sample_extracted)。
  4. xl/vbaProject.bin を取り出す
    展開したフォルダの xl フォルダ内に vbaProject.bin があります。このファイルをデスクトップなど作業しやすい場所にコピーします。
  5. HxD で vbaProject.bin を開き DPB= を検索・置換する
    HxD を起動 → vbaProject.bin を開く → 検索(Ctrl+F)→「テキスト」タブで DPB= を検索 → 置換(Ctrl+R)で DPB=DPx= に置換 → 保存(Ctrl+S)。
  6. 編集した vbaProject.bin を展開フォルダに戻す
    デスクトップで編集したファイルを、展開フォルダの xl/ フォルダに上書きコピーします。
  7. 展開フォルダを ZIP に再圧縮する
    展開フォルダの中身を選択して右クリック →「圧縮」を選びます。

    ⚠️ 圧縮の注意点

    フォルダ自体を圧縮すると ZIP 内に余分なフォルダ階層ができて Excel で開けなくなります。フォルダの中身([Content_Types].xml や xl フォルダ など)を選択した状態で圧縮してください。

  8. ZIP の拡張子を .xlsm に戻す
    作成した ZIP ファイルを sample.xlsm にリネームします。
  9. Excel で開き VBE のパスワードをリセットする
    Excel で開くと「パスワードが不正です」ダイアログが出る場合は「はい」をクリックします。 Alt + F11 で VBE を開き、「ツール → VBAプロジェクトのプロパティ → 保護タブ」からパスワードを空欄にして OK → 上書き保存して完了です。

方法2:Python スクリプトで自動化

手順を Python で自動化できます。標準ライブラリのみを使用するため、追加のインストールは不要です。

🚫 再掲:悪用厳禁

このスクリプトは自分が管理するファイルにのみ使用してください。他者のファイルへの無断使用は法律違反となる可能性があります。

Python — xlsm_unlock.py
"""
xlsm_unlock.py
=============
.xlsm ファイルの VBA プロジェクトパスワードを解除するスクリプト。

使用方法:
  python xlsm_unlock.py sample.xlsm

注意:
  - 自分が管理するファイルにのみ使用してください。
  - 実行前に必ずバックアップを取ってください。
  - 本スクリプトの利用による損害について筆者は責任を負いません。
"""

import sys
import shutil
import zipfile
import os
import tempfile


def unlock_xlsm(xlsm_path: str) -> None:
    # バックアップ作成
    backup_path = xlsm_path + ".bak"
    shutil.copy2(xlsm_path, backup_path)
    print(f"[INFO] バックアップ作成: {backup_path}")

    with tempfile.TemporaryDirectory() as tmpdir:
        # ZIP として展開
        with zipfile.ZipFile(xlsm_path, "r") as z:
            z.extractall(tmpdir)
        print("[INFO] 展開完了")

        # vbaProject.bin を探す
        vba_bin_path = os.path.join(tmpdir, "xl", "vbaProject.bin")
        if not os.path.exists(vba_bin_path):
            print("[ERROR] vbaProject.bin が見つかりません。VBA が含まれていない可能性があります。")
            return

        # DPB= を DPx= に置換
        with open(vba_bin_path, "rb") as f:
            data = f.read()

        count = data.count(b"DPB=")
        if count == 0:
            print("[INFO] DPB= が見つかりませんでした。パスワードが設定されていないかもしれません。")
            return

        new_data = data.replace(b"DPB=", b"DPx=")
        with open(vba_bin_path, "wb") as f:
            f.write(new_data)
        print(f"[INFO] DPB= を {count} 箇所 DPx= に置換しました")

        # 再圧縮して .xlsm に戻す
        output_path = xlsm_path.replace(".xlsm", "_unlocked.xlsm")
        with zipfile.ZipFile(output_path, "w", zipfile.ZIP_DEFLATED) as zout:
            for root, dirs, files in os.walk(tmpdir):
                for file in files:
                    file_full = os.path.join(root, file)
                    arcname = os.path.relpath(file_full, tmpdir)
                    zout.write(file_full, arcname)
        print(f"[INFO] 出力ファイル: {output_path}")
        print("[INFO] 完了。Excel で開いてパスワードをリセットしてください。")


if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("使用方法: python xlsm_unlock.py <ファイルパス.xlsm>")
        sys.exit(1)
    unlock_xlsm(sys.argv[1])

実行方法

Shell
# スクリプトと同じフォルダに .xlsm を置いて実行
python xlsm_unlock.py sample.xlsm

# 実行後に sample_unlocked.xlsm が生成される
# Excel で開いて VBE → ツール → VBAプロジェクトのプロパティ → 保護タブ でパスワードを空欄に

スクリプトの特徴

元ファイルを .bak として自動バックアップします。出力は _unlocked.xlsm という別ファイルなので元ファイルは変更されません。Python 標準ライブラリのみで動作するため追加インストール不要です。

よくあるエラーと対処法

症状原因対処法
Excel で「修復」ダイアログが出る ZIP 再圧縮の構造ミス(フォルダ階層が余分) 展開フォルダの中身を選択して再圧縮する(フォルダ自体を選ばない)
vbaProject.bin が見つからない 展開先の xl フォルダを探していない 展開フォルダ直下の xl/ フォルダ内を確認
DPB= が見つからない パスワードが未設定 VBE でパスワードの有無を確認
ファイルが開けなくなった バイナリ編集ミス または 再圧縮ミス バックアップから復元する
Python スクリプトで BadZipFile エラー ファイルが .xlsm でない / 壊れている 拡張子と形式を確認。.xls の場合は PART 02 の方法を使う

.xls との比較まとめ

項目.xls.xlsm
ファイル構造バイナリ(OLE2)ZIP + vbaProject.bin(OLE2)
解除難易度★★☆(中)★★★(やや高)
必要ツールバイナリエディタのみZIP解凍ツール + バイナリエディタ(または Python)
主な操作.xls を直接 HxD で開いて書き換え展開 → vbaProject.bin 編集 → 再圧縮
Python 自動化可能(やや複雑)本記事のスクリプトで簡単に自動化可能
解除手順記事PART 02本記事

まとめ

.xlsm 形式の VBA パスワード解除は、ZIP 展開 → vbaProject.bin のバイナリ編集(DPB=DPx=)→ 再圧縮という3ステップで完結します。 Python スクリプトを使えばこの操作を自動化でき、複数ファイルの処理も容易です。

どちらの方法でも、必ず自分が管理するファイルのみに使用すること、そして事前のバックアップを怠らないことを再度お願いします。

シリーズを最初から読む

パスワードの設定方法から確認したい方は PART 01 からご覧ください。

← PART 01 — VBAパスワードの設定方法

← PART 02 — .xls形式のVBAパスワード解除