スポンサーリンク

パスワード付きのExcelの保護を,バッチで自動的に解除しよう (VBAマクロが見れないブックに対して,パスワードを自動入力)


Excel VBAは,パスワードで閲覧制限をかけることができる。


※その方法:

Excelブック内のマクロをパスワードで保護する方法
http://www.happy2-island.com/excelsmi...

  • VBE上で,ツール>VBAプロジェクトのプロパティ>保護 を開く。
  • 「プロジェクトを表示用にロックする」にチェック。
  • 「プロジェクトのプロパティ表示のためのパスワード」を2箇所入力。
  • OKをクリックし,ブックを保存。


しかし,マクロを修正するたびに,いちいち手動でパスワードを入力するのは面倒。

さらに,「外部からバッチでExcel内部を自動操作したい」という時,パスワードのせいで,操作が妨害される。


以下では,Excelのパスワードを自動的に入力するスクリプトを記述する。(言語はWSH/JScript)




下記のコードを保存し,ダブルクリックすればよい。


break_password.js


/* ---------- 準備 ---------- */


// excelのファイル名と,モジュールの吸出し先パスを指定
var file_dir = "D:\\temp";
var file_name = "hoge.xls";
var file_path = file_dir + "\\" + file_name;


// Excelファイルのパスワードを,SendKeys用の記法で記述
var pass_string = "+abc_123"; // Abc_123
	// SendKeysの特殊キー一覧表
	// http://www.atmarkit.co.jp/fwin2k/operation/wsh05/wsh05_04.html


// ブックを開く
var excel = WScript.CreateObject("Excel.Application");
excel.Visible = true;
excel.Workbooks.Open( file_path );
var book = excel.Workbooks( excel.Workbooks.Count ); 
	// JScript/WSH で,Excelファイルを読み書きしよう
	// http://language-and-engineering.hatenablog.jp/entry/20090717/p1



/* ---------- パスワード解除 ---------- */

var ws = WScript.CreateObject("WScript.Shell");


// Visual Basic Editorを開き,プロジェクトエクスプローラにフォーカス
book.VBProject.VBE.Windows(1).SetFocus();
WScript.Sleep( 500 );


// 一番上のプロジェクトにフォーカス
ws.SendKeys( "{TAB}" );
WScript.Sleep( 200 );


// パスワード入力ダイアログを表示する
ws.SendKeys( "{ENTER}" );
WScript.Sleep( 500 );


// パスワードを入力
ws.SendKeys( pass_string );
WScript.Sleep( 200 );
ws.SendKeys( "{ENTER}" );
WScript.Sleep( 500 );


// パスワード解除完了

実行すると,該当するExcelが開いて,パスワードが解除される。



なお,事前にExcel上で以下の設定を行なっておくこと。

(Excel2003の場合)

ツール>マクロ>セキュリティ>信頼できる発行元>Visual Basic プロジェクトへのアクセスを信頼する をオン

(Excel2007の場合)

リボンの「開発」タブ>マクロのセキュリティ>VBAプロジェクトオブジェクトモデルへのアクセスを信頼する

http://support.microsoft.com/kb/282830/ja

※「プログラミングによるVisual Basicプロジェクトへのアクセスは信頼性に欠けます」というエラーメッセージが出ないようになる。


続いて,コードの内容の補足。

SendKeysについて:

  • 半角アンダーバーは,SendKeysでそのまま送信できる


VBAによるマクロの保護+保護解除について:

VBAでVBAProjectを保護する方法(Excel2000VBA)
http://okwave.jp/qa/q1906926.html

  • VBProject.Protectionは保護状態を取得するだけしかできない。
  • 保護も解除も,SendKeysが一般的


VBAのパスワード解除自動化,SendKeysで苦戦
http://hanatyan.sakura.ne.jp/logbbs1/...

応用

以下と組み合わせれば,「パスワードで保護されたExcelファイルからマクロを自動的に吸い出す」ことも可能。

Excelのマクロを外部に吸い出して保存するバッチ (WSH/JScriptで,VBAのソースコードだけを抜き取る)
http://language-and-engineering.hatenablog.jp/entry/20100524/p1

これで,Excel VBAアプリケーションのリリース・保守作業を効率化することができる。