Excel VBA の保護とは?
MS-OfficeではVBA (Visual Basic for Applications) によるプログラミングが可能です。これによりさまざまな機能拡張ができるわけですが、その際 VBA にパスワードを設定可能です。パスワード設定された VBA のプログラムコードは、閲覧したり変更したりする事ができなくなります。これは VBE (Visual Basic Edtor) を起動し、「ツール(T) > VBAProject のプロパティ(E) > 保護」で表示される、以下のダイアログボックスで設定します。
このパスワードを解除する方法について色々調べたので、メモとして記事を残しておきます。
Excel VBA のパスワードは解除できるのか?
結論として可能です。また保護すべきプログラムコードやリテラルは暗号化されていないので解除できなくてもなんとなく内容を読めてしまいます。VBA のパスワードは利用者が誤って内容を改変したりできないようにするフールプルーフ(安全対策) 程度の役割しかもっていないと考えるべきです。
なぜ解除したいのか?
人それぞれ色々な動機があるようです。
社内に古くからあるアプリケーションで、誰もパスワードが分からない
多くの人がこれで困っているようです。
VBS 等、外部のスクリプトから操作したい
VBAにパスワードが設定されていると、CreateObject() して外部からアクセスしたい場合にも制限が掛かります。これが弊害になっているケースもあるようです。
解除方法一覧
当初、特定のオブジェクトにパスワードを設定する VBA の標準的なメソッドがあるのでは無いかと思ってましたが、それは見つかりませんでした。その反面、色々な方法があるようです。
バイナリファイルを書き換えてパスワードを無効にする
エクセルファイル内には "DPB="
という文字列が存在しており、この後に続く文字列が暗号化されたパスワードです。これを書き換えてパスワードを無効にする。あるいは、新しいパスワードを設定するという方法です。
- http://d.hatena.ne.jp/cojicoji0228/20100209/1265717104
- https://codeday.me/jp/qa/20190127/169259.html
SendKeys を利用してパスワードを自動入力する方法
キーボードの動作を API でエミュレートし、パスワードを自動入力しています。あらかじめパスワードを知っている事が前提です。
パスワード評価関数の戻り値を変更する
VBA ではパスワード保護されているスクリプト等にアクセスがあった時、パスワード入力用のダイアログボックスを表示します。その関数の戻り値を強引に書き換えて通過させるという技です。
- https://www.saka-en.com/office/excel-vba-password-unlock/
- https://stackoverflow.com/questions/1026483/is-there-a-way-to-crack-the-password-on-an-excel-vba-project/27508116#27508116
まとめ
Excel VBA のパスワード解除は可能です。しかし VBA 自体がメソッドを提供しているわけではないため、色々な工夫が必要です。
今回、私は最終納品物がパスワード保護されたエクセルファイルであるプロジェクトにおいて、どのようにバージョン管理し、いつパスワードを設定するかという問題を解決する過程で解除方法について調査しました。パスワードの自動設定についても調べたので、またそのうち記事にしたいと思います。