VBAでブックにパスワードを付けて保存するには、SaveAs メソッドの Password(開くパスワード)と WriteResPassword(編集パスワード)を指定するだけです。社外送付用ファイルや誤編集を防ぎたい定型ファイルのセキュリティ設定を自動化できます。
この記事では、次の内容を順番に解説します。
- SaveAsでパスワード付き保存する基本コード
- 開くパスワードと編集パスワードの違い
- シートの保護パスワードをVBAで設定する方法
- パスワードをInputBoxで入力させる応用パターン
SaveAsでパスワード付き保存するには?
SaveAs メソッドに Password と WriteResPassword を指定することで、ファイルの保存と同時にパスワードを設定できます。
Sub SaveWithPassword()
Dim savePath As String
savePath = ThisWorkbook.Path & "¥SecureBook.xlsm"
ThisWorkbook.SaveAs _
Filename:=savePath, _
FileFormat:=xlOpenXMLWorkbookMacroEnabled, _
Password:="open123", _
WriteResPassword:="edit123", _
ReadOnlyRecommended:=True
MsgBox "パスワード付きで保存しました。"
End Sub
| 引数 | 内容 | 省略した場合 |
|---|---|---|
Password | ファイルを開くときのパスワード | パスワードなしで開ける |
WriteResPassword | 上書き保存・編集するためのパスワード | 誰でも編集できる |
ReadOnlyRecommended | 読み取り専用を推奨するか(True/False) | 推奨ダイアログは表示されない |
FileFormat | 保存形式(マクロ有効ブックは xlOpenXMLWorkbookMacroEnabled) | 既存の形式で保存される |
シートの保護パスワードをVBAで設定するには?
ブック全体のパスワードとは別に、特定のシートを編集できないよう保護することもできます。Worksheet.Protect メソッドを使います。
Sub ProtectSheets()
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
ws.Protect Password:="sheet456", _
UserInterfaceOnly:=False, _
DrawingObjects:=True, _
Contents:=True
Next ws
MsgBox "全シートを保護しました。"
End Sub
'シートの保護を解除する
Sub UnprotectSheets()
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
ws.Unprotect Password:="sheet456"
Next ws
MsgBox "全シートの保護を解除しました。"
End Sub
パスワードをInputBoxで入力させるには?
パスワードをコードに直接書くと、VBEを開いた人に見られてしまいます。より安全にするには実行時にInputBoxで入力させる方法が有効です。
Sub SaveWithInputPassword()
Dim pw As String
Dim savePath As String
'パスワードを入力させる
pw = InputBox("保存時のパスワードを入力してください。", "パスワード設定")
If pw = "" Then
MsgBox "パスワードが入力されませんでした。保存を中止します。", vbExclamation
Exit Sub
End If
savePath = ThisWorkbook.Path & "¥SecureBook_" & Format(Date, "yyyymmdd") & ".xlsm"
ThisWorkbook.SaveAs _
Filename:=savePath, _
FileFormat:=xlOpenXMLWorkbookMacroEnabled, _
Password:=pw
MsgBox "パスワード付きで保存しました:" & savePath
End Sub
注意:InputBoxで入力した内容は画面上にそのまま表示されます。パスワードを入力しているところを見られたくない場合は、ユーザーフォームにPasswordChar(*で隠す設定)付きのTextBoxを使う方法がより安全です。
まとめ
SaveAsのPasswordで開くパスワード、WriteResPasswordで編集パスワードを設定できるFileFormat:=xlOpenXMLWorkbookMacroEnabledを指定しないとマクロが消えるので注意- シート単位の保護には
ws.Protect Password:="〇〇"、解除はws.Unprotect - パスワードをコードに直書きするのは避け、InputBox か定数管理するとセキュリティが向上する
- パスワードは必ず別の場所にメモしておく。忘れると自分でも開けなくなる
よくある質問
パスワードを設定したファイルを開くコードはどう書きますか?
Workbooks.Open Filename:="パス¥ファイル名.xlsm", Password:="open123" のように、Open メソッドの Password 引数にパスワードを指定します。
SaveAsを使うとファイル名が変わってしまいます
SaveAs は「名前を付けて保存」なので、Filename に元のファイル名を指定すると上書き保存になります。元のパスとファイル名を ThisWorkbook.FullName で取得して指定するのが安全です。
パスワードを解除(削除)するコードはありますか?
SaveAs で Password:=""(空文字)を指定すると、パスワードを解除して保存できます。ただし解除前に現在のパスワードを知っている(正しく開けている状態)必要があります。
シートを保護したままVBAで書き込みをしたいです
ws.Protect UserInterfaceOnly:=True を使うと、ユーザーからの操作は制限しつつVBAからの書き込みは許可できます。ただしファイルを開き直すとこの設定はリセットされるため、Workbook_Open イベントで毎回設定し直す方法が一般的です。
VBAのコードにパスワードを直書きするのはリスクがありますか?
VBEを開ける人にはコードが見えてしまうため、リスクがあります。VBAプロジェクトにもパスワードをかける(VBEの「ツール」→「プロジェクトのプロパティ」→「保護」タブ)ことでコードを見えにくくできますが、完全な保護ではありません。重要なパスワードはコードに書かず、外部ファイルや設定シートから読み込む設計にするのがよりセキュアです。
動画で学びたい方へ
「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。
VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。



