VBAでブックにパスワードをつけて保存する方法|SaveAs・Password・WriteResPasswordの使い方

VBAでブックにパスワードを付けて保存するには、SaveAs メソッドの Password(開くパスワード)と WriteResPassword(編集パスワード)を指定するだけです。社外送付用ファイルや誤編集を防ぎたい定型ファイルのセキュリティ設定を自動化できます。

この記事では、次の内容を順番に解説します。

  • SaveAsでパスワード付き保存する基本コード
  • 開くパスワードと編集パスワードの違い
  • シートの保護パスワードをVBAで設定する方法
  • パスワードをInputBoxで入力させる応用パターン

SaveAsでパスワード付き保存するには?

SaveAs メソッドに PasswordWriteResPassword を指定することで、ファイルの保存と同時にパスワードを設定できます。

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を使う方法がより安全です。

まとめ

  • SaveAsPassword で開くパスワード、WriteResPassword で編集パスワードを設定できる
  • FileFormat:=xlOpenXMLWorkbookMacroEnabled を指定しないとマクロが消えるので注意
  • シート単位の保護には ws.Protect Password:="〇〇"、解除は ws.Unprotect
  • パスワードをコードに直書きするのは避け、InputBox か定数管理するとセキュリティが向上する
  • パスワードは必ず別の場所にメモしておく。忘れると自分でも開けなくなる

よくある質問

パスワードを設定したファイルを開くコードはどう書きますか?

Workbooks.Open Filename:="パス¥ファイル名.xlsm", Password:="open123" のように、Open メソッドの Password 引数にパスワードを指定します。

SaveAsを使うとファイル名が変わってしまいます

SaveAs は「名前を付けて保存」なので、Filename に元のファイル名を指定すると上書き保存になります。元のパスとファイル名を ThisWorkbook.FullName で取得して指定するのが安全です。

パスワードを解除(削除)するコードはありますか?

SaveAsPassword:=""(空文字)を指定すると、パスワードを解除して保存できます。ただし解除前に現在のパスワードを知っている(正しく開けている状態)必要があります。

シートを保護したままVBAで書き込みをしたいです

ws.Protect UserInterfaceOnly:=True を使うと、ユーザーからの操作は制限しつつVBAからの書き込みは許可できます。ただしファイルを開き直すとこの設定はリセットされるため、Workbook_Open イベントで毎回設定し直す方法が一般的です。

VBAのコードにパスワードを直書きするのはリスクがありますか?

VBEを開ける人にはコードが見えてしまうため、リスクがあります。VBAプロジェクトにもパスワードをかける(VBEの「ツール」→「プロジェクトのプロパティ」→「保護」タブ)ことでコードを見えにくくできますが、完全な保護ではありません。重要なパスワードはコードに書かず、外部ファイルや設定シートから読み込む設計にするのがよりセキュアです。


動画で学びたい方へ

「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。

VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。

動画で学ぶExcelマクロ|JIMOVEオンラインスクール

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール