⚠️ 注意事項(必読)
🚫 悪用厳禁 — 必ず読んでください
本記事で解説する手法は、自分が作成・管理しているファイル、または正当な権限を有するファイルに対してのみ使用してください。
他者のファイルへの無断アクセス・解析・改ざんは以下の法律に抵触する可能性があります。
- 不正競争防止法(営業秘密の侵害)
- 不正アクセス禁止法
- 著作権法(プログラムの無断複製・改変)
- 刑法(電子計算機損壊等業務妨害罪 など)
また、作業前に必ずファイルのバックアップを取得してください。本記事の内容を実行したことによる損害について、筆者は一切の責任を負いません。
.xlsm 形式の構造
.xlsm(Excel マクロ有効ブック)は、実体は ZIP アーカイブです。
拡張子を .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 ファイルを必ず別フォルダにコピーしてから作業してください。
-
Excel ファイル(.xlsm)を閉じる
Excel で対象ファイルが開かれている場合は必ず閉じてください。 -
拡張子を
.zipに変更する
例:sample.xlsm→sample.zip
(エクスプローラーで拡張子を表示し、直接リネームします。確認ダイアログが出たら「はい」を選択) -
ZIP ファイルを展開する
右クリック →「すべて展開」などで展開します。展開先フォルダ名は任意でかまいません(例:sample_extracted)。 -
xl/vbaProject.binを取り出す
展開したフォルダのxlフォルダ内にvbaProject.binがあります。このファイルをデスクトップなど作業しやすい場所にコピーします。 -
HxD で
vbaProject.binを開きDPB=を検索・置換する
HxD を起動 →vbaProject.binを開く → 検索(Ctrl+F)→「テキスト」タブでDPB=を検索 → 置換(Ctrl+R)でDPB=をDPx=に置換 → 保存(Ctrl+S)。 -
編集した
vbaProject.binを展開フォルダに戻す
デスクトップで編集したファイルを、展開フォルダのxl/フォルダに上書きコピーします。 -
展開フォルダを ZIP に再圧縮する
展開フォルダの中身を選択して右クリック →「圧縮」を選びます。⚠️ 圧縮の注意点
フォルダ自体を圧縮すると ZIP 内に余分なフォルダ階層ができて Excel で開けなくなります。フォルダの中身([Content_Types].xml や xl フォルダ など)を選択した状態で圧縮してください。
-
ZIP の拡張子を
.xlsmに戻す
作成した ZIP ファイルをsample.xlsmにリネームします。 -
Excel で開き VBE のパスワードをリセットする
Excel で開くと「パスワードが不正です」ダイアログが出る場合は「はい」をクリックします。Alt + F11で VBE を開き、「ツール → VBAプロジェクトのプロパティ → 保護タブ」からパスワードを空欄にして OK → 上書き保存して完了です。
方法2:Python スクリプトで自動化
手順を Python で自動化できます。標準ライブラリのみを使用するため、追加のインストールは不要です。
🚫 再掲:悪用厳禁
このスクリプトは自分が管理するファイルにのみ使用してください。他者のファイルへの無断使用は法律違反となる可能性があります。
"""
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])
実行方法
# スクリプトと同じフォルダに .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 からご覧ください。