前任者が作ったマクロが止まった。エラーの内容を調べる前に、5秒で確かめておいたほうがいいことがあります。
そのマクロの中身を、あなたは見られる状態でしょうか。
■ まず確認すること(30秒)
1. ファイルを開く
2. Alt キーを押しながら F11 を押す(VBAの画面が開きます)
3. 左側の枠にある「標準モジュール」を開き、中の項目をダブルクリックする
ここでコードがそのまま表示されたら、中身は見られる状態です。次の章に進んでください。
パスワードの入力を求められたら、そのマクロは保護されています。作った人がパスワードを知っている、あるいはどこかに記録が残っているなら問題ありません。誰も知らない場合は、話が変わります。
■ パスワードが分からないと、何が起きるのか
Microsoftは、パスワードで保護された文書について、次のように明記しています。
「パスワードを紛失または失念した場合、そのパスワードで保護された文書は復元できない」
「Microsoftは、パスワードが設定された文書を取り出すサービスを提供しておらず、そうしたサービスや手順に関する情報も提供しない」
これはWordの保護文書についての案内ですが、パスワードの扱いに対するMicrosoftの立場がはっきり分かります。VBAプロジェクトのパスワードについても、公式に案内された復旧手段は見当たりませんでした。
この場合に取りうる道は、次の3つです。
・正しいパスワードを使う
・保護される前のコピーに戻る
・内容を新しいブックに作り直す
つまり、パスワードが分からないままでは、中身を読んで直すという進め方ができません。次に書く「保護される前のコピー」が見つかれば修理に戻れますが、見つからない場合は作り直しを検討することになります。ここが最初の分かれ目です。
■ 探すべきは、解除方法ではなくコピー
この状況で費用対効果がいちばん高いのは、保護される前のファイルを探すことです。次の順に当たると見つかることがあります。
・共有フォルダやクラウドの「以前のバージョン」「版の履歴」
・前任者が誰かに送ったメールの添付ファイル
・年度別・月別に分けて保存されている過去のフォルダ
・バックアップ、または使われなくなった旧PC
・同じ部署の別の人が持っている「自分用にコピーしたもの」
1つでも保護前のコピーが見つかれば、修理できる可能性が戻ってきます。
■ 中身が開けた場合に、あまり書かれていない2つの原因
シート名の変更、行の挿入、保存形式の間違い、マクロの無効化。このあたりはよく解説されています。その先で見落とされやすいのが、次の2つです。
【1】参照設定に「MISSING:」が付いている
ファイルを別のパソコンに移した、あるいはOfficeを入れ替えたあとに起こります。マクロが使っていた外部の部品が、その環境には無い状態です。
VBAの画面で「ツール」→「参照設定」を開いてください。一覧の上のほうに「MISSING:」で始まる項目があれば、それが原因です。この状態だと、そこと無関係な行でエラーが出ることもあり、原因を追いにくくなります。
【2】64ビット版に移ったあとの Declare 文
古いマクロが外部の機能を呼び出している場合、64ビット版のOfficeでは書き方を更新する必要があります。
Microsoftは、64ビット版のOfficeで実行する場合、すべての Declare 文に PtrSafe キーワードを付ける必要があると明記しています。実際に表示されるメッセージは、次のものです。
The code in this project must be updated for use on 64-bit systems. Please review and update Declare statements and then mark them with the PtrSafe attribute.
(このプロジェクトのコードは64ビットシステム用に更新する必要があります。Declare ステートメントを見直して更新し、PtrSafe 属性を付けてください、という内容です)
さらに、PtrSafe を付けるだけでは足りません。ポインタやハンドルを扱う引数と戻り値は LongPtr に、64ビット整数は LongLong に直す必要があると明示されています。
Officeを新しくした直後に急に動かなくなった、という場合は真っ先に疑うところです。
■ おまけ:正しいパスワードなのに弾かれる場合
パスワードは合っているはずなのに「Invalid password」と表示される、という不具合がMicrosoftから公表されています。Excel・Word・PowerPointのMicrosoft 365版、Office 2019、2016、2013、Office LTSC2021が対象です。
これは現行のOffice 2019・Office LTSC2021・Microsoft 365では修正済みで、Office 2016は2022年9月6日の更新、Office 2013は2022年10月4日の更新で解消されています。更新を当てていない環境なら、まず更新を試す価値があります。
■ 直すか、作り直すか
判断の目安です。
作り直しに寄せたほうがよい場合
・パスワードが分からず、保護前のコピーも見つからない
・作った人がおらず、何をしているのか誰も説明できない
・毎年のように手を入れていて、つぎはぎが積み重なっている
修理で足りることが多い場合
・中身が開けて、エラーの出る場所が特定できている
・直近で変えたこと(シート名、フォルダ、Officeの更新)に心当たりがある
・普段は動いていて、特定の条件のときだけ止まる
■ 相談するときに、これがあると早いです
・エラーメッセージの画面をそのまま撮った画像(文言と番号が重要です)
・いつから、どの操作で止まるか
・直近で変えたこと(PC、Officeの更新、フォルダの移動、シート名)
・パスワードの有無(この記事の手順で確認できます)
・実データでない、形式だけ同じサンプル
最後の項目は特に大切です。患者情報や取引先情報など、そのままお預かりする必要のないものは、匿名化やダミーに置き換えたもので十分に調べられます。
■ 出典
いずれもMicrosoftの公式ドキュメントです。下の原題で検索すると本文を確認できます。
・Microsoft サポート「You cannot recover a document that is protected with a password if the password is lost in Word」
(パスワードを紛失した保護文書は復元できない。取り出すサービスは提供しない)
・Microsoft サポート「Error Invalid password when opening a VBA project using the correct password」
(正しいパスワードでも弾かれる既知の不具合と、修正が入った時期)
・Microsoft Learn「The code in this project must be updated for use on 64-bit systems」
(64ビット環境で表示されるエラーの全文)
・Microsoft Learn「PtrSafe keyword (VBA)」
(64ビット版OfficeではDeclare文にPtrSafeが必須。LongPtr・LongLongへの変更も必要)
■ ご相談について
中身が開けて、原因の見当をつけたい場合は「動かなくなったExcelマクロを診断・修正します」でお受けしています。作った人がいなくても、動作から追って原因を切り分けます。
パスワードが分からず、保護される前のコピーも見つからない場合は「毎月のExcel作業をVBAで自動化します」または「業務に合わせた管理表をExcelで作成します」で、今の運用に合わせて組み直すことができます。どちらもVBAのコードは全文をお渡しします。次に困ったとき、私以外の人でも中を見られる状態にしておくためです。
どちらに当たるか分からない段階でも構いません。まずは症状だけお知らせください。