ダブルクリックしても標準モジュールが開かない

VBAのソースコードを見る場合、VBAの画面の左側にある標準モジュールやクラスモジュールをダブルクリックや上のコード表示ボタンを押して開きます。

ところが、ブックが壊れている場合には標準モジュールをダブルクリックしてもコードが表示されません。右クリック→エクスポートの操作でもエクスポートされません。ちゃんと操作しているのにです。他のブックは標準モジュールが開くのに、このブックだけ開きません、なんてことが起きます。

原因はマクロ部分が壊れているためのようですが、何が壊れているのかは分かりません。けどどうにか復旧させたいです。

ここでの内容は私が実際に壊れたVBAありのブックを復旧させたときのメモです。試行錯誤したときのものをまとめました。

以下が手順概要です。
1. Macで開いて別名で保存する。
2. Windowsで開いて、開けるなら標準モジュールをエクスポートする。
3. エクスポートしたファイルの文字化け部分をエディタで直す。
4. 修正した標準モジュールをインポートしなおして保存する。


ブックの状況を確認する

ブック自体が保存できるかをまず確認します。どこかのセルに「aaa」とか入力して保存をすると、以下のダイアログでブックが壊れていることが分かります。

このダイアログが出たときは、大体復旧できません。

何度か続行すると以下のダイアログが出て、xlsbファイルが保存されることがあります。

xlsbファイルにはシート部分の入力データや背景色ぐらいが残っている程度で、VBA関連は一切保存されていません。

というわけで、やはり復旧されません。


Macで開けるならMacで保存しなおすWindowsで開けるようになる(開けるけどまだ直ってない)

ただ、理由は分かりませんが、Windowsで「破損しています」と表示されるブックでも、Macで開くと普通に開けることがよくあります。そこで、Macで開き、どこかのセルに「aaa」とか入力して別名で保存します。上書き保存だと本当に壊れたときに怖いので別名にします。

この別名のブックをWindowsで開くとなぜか開けます。標準モジュールなども表示できるようになります。

これで復旧は「大体」完了です。

しかし直ってない箇所があります。それはWindows特有の文字をMacでは正しく解釈できないという問題です。

なお、Macが用意できない場合は、WindowsPCにLinuxのUbuntuをデュアルブート(1のPCに複数のOSをインストールしている状態)して、UbuntuでLibreOfficeやFreeOfficeを使うと同じような修復作業が行えるかもしれません。試してません。


Macでの保存で円マーク部分の文字コードが変わってしまう

VBAで一番多いWindowsとMac間での文字化けの影響が大きいのが円マークです。

これですね。

このWindowsのパス区切り文字の円マークですが、Macでのブック保存時に文字コードが変わってしまいます。

Windowsの円マークは10進数=92、16進数=0x5cで、Macで変わったあとは10進数で128、16進数で0x80になります。0x80は貨幣ユーロの記号として使われることがあります。Windowsでは元の円マークの0x5cはバックスラッシュと同じ文字コードのため、今回と同様にシステム開発でよく問題になります。

ただ、そのあたりはどうでもいいので、とにかく変わっちゃったものは仕方ありません。いい感じに修正するツールがあるのかもしれませんが、ここでは自力で直す方法を採ります。

Macで変換された0x80文字はVBAの画面では表示上は空文字として扱われます。実際には1バイト0x80があるのに何も入力されていないように見えます。

こんな感じです。本来はダブルクォーテーションの間に円マークがあるのですが、0x80になっているため見えません。

本来は以下が正しい状態です。ちなみに、上のようになっている箇所を行ごと一度削除して、円マークを書き直せば直ります。




標準モジュールやクラスモジュールをエクスポートしてテキストファイル化する

上の絵のように、VBAの画面ではどこに0x80があるのかを探すことが出来ないため、標準モジュールやクラスモジュールを全てエクスポートしてテキストファイルとして見れるようにします。

エクスポートはVBAの画面で標準モジュールやクラスモジュールを右クリックしてエクスポートを選択して、保存先を選べばそこにbasファイルやclsファイルが出力されます。

1ファイルずつエクスポートするのが面倒な場合は「標準モジュール等の一括エクスポート」をご参照ください。


テキストエディタで0x80を円マークに置換する

エクスポートした標準モジュールは.bas、クラスモジュールは.clsの拡張子が付いています。

これらのファイルをバイナリエディタで開きます。ここではImHexを使います。ImHexはフリーの高機能なバイナリエディタです。海外のアプリですが言語設定で日本語対応しています。

ImHexリンク:https://imhex.werwolv.net/

バイナリエディタで元の円マークがあった0x80を16進数で検索します。ImHexの場合は以下のように、左右に16進数とASCII文字が表示されます。

あとは0x80の部分を0x92(Windowsの円マーク)に置換します。

数が多くて大変な場合はテキストエディタで置換しても構いません。ここではサクラエディタを使います。サクラエディタはフリーの高機能エディタです。

サクラエディタのリンク:https://sakura-editor.github.io/

サクラエディタで開いて元々円マークだった場所を調べます。そうすると1文字の点で表示されている箇所があります。

この点の部分を円マークに置換します。

置換後はこんな感じになります。

バイナリエディタで置換しても構いません。

この置換作業をエクスポートした全てのファイルに対して行います。


編集後のbasファイルとclsファイルをインポートしなおす

Macで修復したブックを開き、VBAの画面で標準モジュールとクラスモジュールを全て解放し、サクラエディタで修正したbasファイルとclsファイルをインポートします。

全てのインポートが終わったら保存します。

これで修復完了です。