パスワード付きの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アプリケーションのリリース・保守作業を効率化することができる。