この記事でわかること
- VBAでブックに読み取りパスワード(Password)を自動設定できる
- 書き込みパスワード(WriteResPassword)との違いと使い分けがわかる
- フォルダ内の複数ブックにパスワードを一括設定できる(実務版)
対象: Excel 2016以降 / Microsoft 365、Windows 10/11
—
どんな場面で使う?
- 月末の報告書を複数ブックに分けて保存するとき、全ファイルにパスワードを一括で設定したい
- 社外に送るExcelファイルに読み取りパスワードをかけ忘れるリスクをゼロにしたい
- 期末で古いパスワードを新しいものに一括変更したい
- 共有フォルダのファイルに書き込みパスワードだけ設定して「閲覧はOK・編集は制限」にしたい
—
完成イメージ(Before / After)
Before(手動でパスワード設定):
- Excelファイルを開く
- 「ファイル」→「名前を付けて保存」→「ツール」→「全般オプション」
- 読み取りパスワードを手入力
- 保存して閉じる
- 次のファイルを開いて同じ操作を繰り返す…(10ファイルなら10回)
- 1つかけ忘れてヒヤリ
After(VBAで自動設定):
- マクロを実行
- フォルダ内の全ブックにパスワードが一括設定される
- かけ忘れゼロ。作業時間は5秒
対象フォルダ(C:\Users\(ユーザー名)\Desktop\報告書\):
売上報告_東京.xlsx ← パスワード設定済み
売上報告_大阪.xlsx ← パスワード設定済み
売上報告_名古屋.xlsx ← パスワード設定済み
—
月末の報告書を10個のブックに分けて保存し、それぞれに手作業でパスワードをかけていた。パスワード入力画面で毎回同じ文字列を打ち込む作業が地味に面倒で、しかも1つかけ忘れてヒヤリとしたことがある。
VBAなら SaveAs の Password 引数にパスワードを渡すだけで、保存と同時にパスワードが設定される。フォルダ内の全ブックをループすれば一括処理もできる。10ファイル分の作業が5秒で終わるようになった。
この記事では、1つのブックにパスワードを設定する基本版、パスワードの解除・変更ができる応用版、フォルダ内の複数ブックに一括設定する実務版を順に紹介する。
パスワードのかけ忘れは、VBAに任せればゼロにできる。
なお、ブック全体ではなくシート単位で保護をかけたい場合は 特定シートだけ保護・解除する方法 を参照。本記事では「ブックを開くときのパスワード」に特化する。
—
実行前の準備
バックアップを取る
SaveAsでパスワード付き保存すると、元のファイルが上書きされる場合がある。必ずファイルのコピーを別フォルダに保存してから実行する。
パスワードを控えておく
パスワードを忘れるとファイルが開けなくなる。設定するパスワードは必ずメモやパスワード管理ツールに記録しておくこと。
Excelをマクロ有効ブック(.xlsm)で保存する
拡張子が .xlsx のままだとマクロが保存できない。
- 「ファイル」→「名前を付けて保存」
- ファイルの種類を「Excelマクロ有効ブック (*.xlsm)」に変更
- 保存
—
手順(コピペ → 実行まで約5分)
VBE(コードを書く画面)を開く
- Excelで
Alt + F11を押す - VBE(Visual Basic Editor)が開く
標準モジュールを挿入する
- VBEのメニュー →「挿入」→「標準モジュール」
- 白い画面(コードウィンドウ)が表示される
コードを貼り付けて実行する
- コードウィンドウに、下のコードをそのままコピペする
Alt + F8→ マクロ名を選んで「実行」
ボタンに割り当てれば毎回Alt+F8を押さなくて済む。方法は マクロをボタン1つで実行する方法 を参照。
—
コード(基本版)– SaveAsでブックにパスワードを設定
まずはこれだけで動く。SaveAs の Password 引数にパスワードを渡すだけで、読み取りパスワード付きのブックとして保存される。参照設定は不要。
'============================================================
' ■ ブックに読み取りパスワードを設定(基本版)
' → SaveAs の Password 引数でパスワード付き保存
' → 参照設定不要。VBA標準機能のみ
'============================================================
Sub SetBookPassword()
'--- ★書き換えポイント ---
Dim savePath As String
savePath = "C:\Users\(ユーザー名)\Desktop\報告書\" '← 保存先フォルダ(末尾に\)
Dim fileName As String
fileName = "売上報告.xlsm" '← ファイル名
Dim pw As String
pw = "myPass123" '← 設定するパスワード
'--- ★ここまで ---
'--- フルパスを組み立て
Dim fullPath As String
fullPath = savePath & fileName
'--- 保存先フォルダの存在チェック
If Dir(savePath, vbDirectory) = "" Then
MsgBox "保存先フォルダが見つかりません:" & savePath, vbExclamation
Exit Sub
End If
'--- 確認ダイアログ
If MsgBox("以下のファイルにパスワードを設定して保存します。" & vbCrLf & vbCrLf & _
"ファイル:" & fullPath & vbCrLf & _
"パスワード:" & pw & vbCrLf & vbCrLf & _
"実行しますか?", vbYesNo + vbQuestion) = vbNo Then
Exit Sub
End If
'--- パスワード付きで保存
On Error GoTo ErrHandler
Application.DisplayAlerts = False
ThisWorkbook.SaveAs Filename:=fullPath, _
FileFormat:=xlOpenXMLWorkbookMacroEnabled, _
Password:=pw
Application.DisplayAlerts = True
MsgBox "パスワードを設定して保存しました:" & vbCrLf & fullPath, vbInformation
Exit Sub
ErrHandler:
Application.DisplayAlerts = True
MsgBox "エラーが発生しました:" & vbCrLf & Err.Description, vbExclamation
End Sub
書き換えポイント
| 変数 | 説明 | 初期値 |
|---|---|---|
savePath |
保存先フォルダ(末尾に \) |
"C:\Users\(ユーザー名)\Desktop\報告書\" |
fileName |
保存するファイル名 | "売上報告.xlsm" |
pw |
設定するパスワード | "myPass123" |
コードの流れ
- 保存先とファイル名を指定:
savePathとfileNameでフルパスを組み立てる - フォルダ存在チェック:
Dir(savePath, vbDirectory)で保存先の存在を確認 - 確認ダイアログ: パスワードとファイル名を表示して最終確認
- SaveAs でパスワード付き保存:
Password:=pwで読み取りパスワードを設定 - エラーハンドリング: エラー発生時も
DisplayAlertsを必ずTrueに戻す
ポイント:
Password引数は「読み取りパスワード」。このパスワードを知らないとファイルを開けない- 書き込みパスワード(読み取り専用で開くことは可能)を設定したい場合は
WriteResPassword引数を使う。応用版で解説する FileFormat:=xlOpenXMLWorkbookMacroEnabledは .xlsm 形式。.xlsx で保存する場合はxlOpenXMLWorkbook(51)に変更する
Password と WriteResPassword の違い
| 引数 | パスワードの種類 | パスワードなしで開くと |
|---|---|---|
Password |
読み取りパスワード | ファイルが開けない |
WriteResPassword |
書き込みパスワード | 「読み取り専用」で開ける |
—
コード(応用版)– パスワードの解除・変更
パターン1:パスワードを解除する
既にパスワードが設定されているブックから、パスワードを解除して保存し直す。Password:="" のように空文字を渡すとパスワードが解除される。
'============================================================
' ■ ブックのパスワードを解除(応用版)
' → Password:="" で読み取りパスワードを解除
' → WriteResPassword:="" で書き込みパスワードも同時に解除
'============================================================
Sub RemoveBookPassword()
'--- ★書き換えポイント ---
Dim currentPw As String
currentPw = "myPass123" '← 現在設定されているパスワード
'--- ★ここまで ---
'--- 確認ダイアログ
If MsgBox("このブックのパスワードを解除して上書き保存します。" & vbCrLf & vbCrLf & _
"実行しますか?", vbYesNo + vbQuestion) = vbNo Then
Exit Sub
End If
'--- パスワードなしで上書き保存
On Error GoTo ErrHandler
Application.DisplayAlerts = False
ThisWorkbook.SaveAs Filename:=ThisWorkbook.FullName, _
FileFormat:=ThisWorkbook.FileFormat, _
Password:="", _
WriteResPassword:=""
Application.DisplayAlerts = True
MsgBox "パスワードを解除しました。", vbInformation
Exit Sub
ErrHandler:
Application.DisplayAlerts = True
MsgBox "エラーが発生しました:" & vbCrLf & Err.Description, vbExclamation
End Sub
ポイント:
Password:=""で読み取りパスワードを解除、WriteResPassword:=""で書き込みパスワードを解除ThisWorkbook.FullNameで現在のファイルパスをそのまま使い、上書き保存するThisWorkbook.FileFormatで現在のファイル形式を維持する- パスワード付きブックをVBAで開くには
Workbooks.OpenのPassword引数にパスワードを渡す
パターン2:パスワードを変更する
現在のパスワードを新しいパスワードに変更する。新しいパスワードを指定して SaveAs で上書き保存するだけでよい。
'============================================================
' ■ ブックのパスワードを変更(応用版)
' → 新しいパスワードを指定してSaveAsで上書き保存
'============================================================
Sub ChangeBookPassword()
'--- ★書き換えポイント ---
Dim newPw As String
newPw = "newPass456" '← 新しいパスワード
Dim newWritePw As String
newWritePw = "newWrite789" '← 新しい書き込みパスワード(不要なら "" )
'--- ★ここまで ---
'--- 確認ダイアログ
If MsgBox("パスワードを変更して上書き保存します。" & vbCrLf & vbCrLf & _
"新しい読み取りパスワード:" & newPw & vbCrLf & _
"新しい書き込みパスワード:" & IIf(newWritePw = "", "(なし)", newWritePw) & vbCrLf & vbCrLf & _
"実行しますか?", vbYesNo + vbQuestion) = vbNo Then
Exit Sub
End If
'--- 新しいパスワードで上書き保存
On Error GoTo ErrHandler
Application.DisplayAlerts = False
ThisWorkbook.SaveAs Filename:=ThisWorkbook.FullName, _
FileFormat:=ThisWorkbook.FileFormat, _
Password:=newPw, _
WriteResPassword:=newWritePw
Application.DisplayAlerts = True
MsgBox "パスワードを変更しました。" & vbCrLf & _
"新しいパスワードを忘れないように記録してください。", vbInformation
Exit Sub
ErrHandler:
Application.DisplayAlerts = True
MsgBox "エラーが発生しました:" & vbCrLf & Err.Description, vbExclamation
End Sub
ポイント:
- 新しいパスワードを
Password引数に渡してSaveAsするだけで変更完了 - 書き込みパスワードが不要な場合は
newWritePw = ""にすればよい - パスワード変更後は必ず新しいパスワードを記録すること。忘れるとファイルが開けなくなる
—
コード(実務版)– フォルダ内の複数ブックに一括パスワード設定
フォルダに入れた複数のExcelブックに、一括でパスワードを設定する。月末の報告書など、複数ファイルにまとめてパスワードをかけたいときに使える。
以前、10個のブックに1つずつ手作業でパスワードをかけていた。パスワード入力画面を10回開いて、毎回同じ文字列を打ち込む。地味に面倒なだけでなく、1つかけ忘れてしまったことがある。このマクロを使い始めてからは、フォルダにファイルを入れて実行するだけ。10ファイル分の作業が5秒で終わる。
'============================================================
' ■ フォルダ内の複数ブックに一括パスワード設定(実務版)
' → 指定フォルダ内の全Excelブックにパスワードを設定
' → 読み取りパスワード+書き込みパスワードの両方に対応
' → 処理結果をメッセージで表示
' → エラーが出たファイルはスキップして続行
'============================================================
Sub SetPasswordToAllBooks()
'--- ★書き換えポイント1: 対象フォルダ ---
Dim folderPath As String
folderPath = "C:\Users\(ユーザー名)\Desktop\報告書\" '← 末尾に\
'--- ★ここまで ---
'--- ★書き換えポイント2: パスワード ---
Dim readPw As String
readPw = "readPass123" '← 読み取りパスワード(不要なら "" )
Dim writePw As String
writePw = "" '← 書き込みパスワード(不要なら "" )
'--- ★ここまで ---
'--- ★書き換えポイント3: 対象拡張子 ---
Dim targetExt As String
targetExt = "*.xlsx" '← 対象ファイルの拡張子パターン
'--- ★ここまで ---
'--- フォルダ存在チェック
If Dir(folderPath, vbDirectory) = "" Then
MsgBox "フォルダが見つかりません:" & folderPath, vbExclamation
Exit Sub
End If
'--- 対象ファイル数を事前確認
Dim fileCount As Long
fileCount = 0
Dim tmp As String
tmp = Dir(folderPath & targetExt)
Do While tmp <> ""
fileCount = fileCount + 1
tmp = Dir()
Loop
If fileCount = 0 Then
MsgBox "対象ファイルが見つかりません:" & folderPath & targetExt, vbExclamation
Exit Sub
End If
'--- 確認ダイアログ
If MsgBox(fileCount & " 個のファイルにパスワードを設定します。" & vbCrLf & vbCrLf & _
"フォルダ:" & folderPath & vbCrLf & _
"読み取りパスワード:" & IIf(readPw = "", "(なし)", readPw) & vbCrLf & _
"書き込みパスワード:" & IIf(writePw = "", "(なし)", writePw) & vbCrLf & vbCrLf & _
"実行しますか?", vbYesNo + vbQuestion) = vbNo Then
Exit Sub
End If
'--- ファイル名を配列に格納(Dir関数はループ中に再呼び出しできないため)
Dim fileNames() As String
ReDim fileNames(1 To fileCount)
Dim i As Long
i = 0
tmp = Dir(folderPath & targetExt)
Do While tmp <> ""
i = i + 1
fileNames(i) = tmp
tmp = Dir()
Loop
'--- 一括パスワード設定
Dim successCount As Long
Dim errorCount As Long
Dim errorFiles As String
successCount = 0
errorCount = 0
errorFiles = ""
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Dim wb As Workbook
Dim j As Long
For j = 1 To fileCount
'--- ステータスバーに進捗表示
Application.StatusBar = "パスワード設定中... (" & j & "/" & fileCount & ") " & fileNames(j)
On Error Resume Next
'--- ファイルを開く
Set wb = Workbooks.Open(folderPath & fileNames(j))
If Err.Number <> 0 Then
errorCount = errorCount + 1
errorFiles = errorFiles & fileNames(j) & "(開けない)" & vbCrLf
Err.Clear
GoTo NextFile
End If
'--- パスワード付きで上書き保存
wb.SaveAs Filename:=folderPath & fileNames(j), _
FileFormat:=wb.FileFormat, _
Password:=readPw, _
WriteResPassword:=writePw
If Err.Number <> 0 Then
errorCount = errorCount + 1
errorFiles = errorFiles & fileNames(j) & "(保存エラー)" & vbCrLf
Err.Clear
wb.Close SaveChanges:=False
GoTo NextFile
End If
wb.Close SaveChanges:=False
successCount = successCount + 1
On Error GoTo 0
NextFile:
Next j
Application.ScreenUpdating = True
Application.DisplayAlerts = True
Application.StatusBar = False
'--- 結果表示
Dim resultMsg As String
resultMsg = "パスワード設定が完了しました。" & vbCrLf & vbCrLf & _
"成功:" & successCount & " ファイル" & vbCrLf & _
"エラー:" & errorCount & " ファイル"
If errorFiles <> "" Then
resultMsg = resultMsg & vbCrLf & vbCrLf & "【エラーファイル】" & vbCrLf & errorFiles
End If
MsgBox resultMsg, vbInformation
End Sub
書き換えポイント
| 変数 | 説明 | 初期値 |
|---|---|---|
folderPath |
対象フォルダ(末尾に \) |
"C:\Users\(ユーザー名)\Desktop\報告書\" |
readPw |
読み取りパスワード(不要なら "") |
"readPass123" |
writePw |
書き込みパスワード(不要なら "") |
""(設定しない) |
targetExt |
対象ファイルの拡張子パターン | "*.xlsx" |
コードの流れ
- フォルダ存在チェック: 対象フォルダがなければエラー通知して終了
- 対象ファイル数の事前確認: Dir関数でファイル数をカウント。0件なら終了
- 確認ダイアログ: ファイル数・パスワード・フォルダを表示して最終確認
- ファイル名を配列に格納: Dir関数はWorkbooks.Open内で再呼び出しできないため、先にファイル名を配列に保存
- 一括処理ループ: 各ファイルを開く → パスワード付きでSaveAs → 閉じる
- エラーハンドリング: エラーが出たファイルはスキップして次のファイルに進む
- 結果表示: 成功数・エラー数・エラーファイル名を表示
ポイント:
- Dir関数は
Workbooks.Openの内部でリセットされるため、先にファイル名を配列に格納している。これを知らないと2ファイル目以降が処理されない Application.ScreenUpdating = Falseで画面更新を止めて高速化readPw = ""にすれば読み取りパスワードなし、writePw = ""にすれば書き込みパスワードなしで保存される。両方""ならパスワード解除と同じ効果- SaveAsの応用として、日付付きファイル名で保存する方法は 日付やセル値でファイル名を付けて自動保存する方法 を参照
—
よくある落とし穴5選
1. SaveAsで元ファイルを上書きしてしまった
自分も経験がある。パスワード付きで保存したあと、パスワードなし版のファイルがなくなっていた。同じファイル名で SaveAs を実行したためだ。
原因: SaveAs は「名前を付けて保存」なので、同じパスに同じファイル名で保存すると上書きされる。Application.DisplayAlerts = False にしていると上書き確認もスキップされる。
対策: 実行前に必ずバックアップを取る。または保存先を別フォルダにする。
2. パスワードを忘れてファイルが開けない
原因: VBAコード内にパスワードをハードコードしていたが、そのマクロブックを閉じてしまい、パスワードがわからなくなった。
対策: パスワードは必ずメモやパスワード管理ツールに記録しておく。VBAコード内のパスワードは Alt + F11 でVBEを開けば確認できるが、マクロブック自体を閉じてしまうと見られない。
3. シート保護とブックパスワードを混同する
原因: ws.Protect Password:="pass" はシート保護(セル編集の制限)であり、ブックを開くときのパスワードではない。両者は別物。
対策: ブックを開くときのパスワードは SaveAs の Password 引数で設定する。シート単位の保護は 特定シートだけ保護・解除する方法 を参照。
4. FileFormatと拡張子が一致せずエラー
原因: .xlsx ファイルなのに FileFormat:=xlOpenXMLWorkbookMacroEnabled(52、.xlsm用)を指定した。または .xlsm ファイルに xlOpenXMLWorkbook(51、.xlsx用)を指定した。
対策: 拡張子と FileFormat 定数を合わせる。
| 拡張子 | FileFormat定数 | 値 |
|---|---|---|
| .xlsm | xlOpenXMLWorkbookMacroEnabled | 52 |
| .xlsx | xlOpenXMLWorkbook | 51 |
| .xls | xlExcel8 | 56 |
実務版コードでは wb.FileFormat で元のファイル形式を取得しているため、この問題は起きない。
5. Dir関数がWorkbooks.Open内でリセットされる
原因: Dir関数でファイルを列挙しながらWorkbooks.Openを実行すると、Dir関数の内部状態がリセットされ、2ファイル目以降が取得できなくなる。
対策: 先にDir関数で全ファイル名を配列に格納してからループ処理する。実務版コードではこのパターンを採用している。
VBAでパスワード設定したのにファイルが保護されないときの対処法
「SaveAsでパスワードを設定したのに、ファイルを開くときにパスワードを聞かれない」という場合、原因は Password 引数ではなく WriteResPassword 引数を使っていることが多い。WriteResPassword は書き込みパスワードなので、読み取り専用では開けてしまう。ファイルを開くこと自体を制限したい場合は Password 引数を使うこと。
VBAでパスワード付きブックを開けないときの対処法
「Workbooks.Openでパスワード付きブックを開こうとしたらダイアログが出て止まる」という場合、原因は Password 引数を指定していないことだ。Workbooks.Open "ファイルパス", Password:="パスワード" のように引数でパスワードを渡せば、ダイアログなしで開ける。
—
FAQ
Q1: 読み取りパスワードと書き込みパスワードの違いは?
Password は読み取りパスワード。このパスワードを知らないとファイルを開けない。WriteResPassword は書き込みパスワード。パスワードなしでもファイルを「読み取り専用」で開ける。編集して保存するにはパスワードが必要。
用途に応じて使い分ける:
- 社外に送るファイル:
Password(読み取りパスワード)で開くこと自体を制限 - 社内共有ファイル:
WriteResPassword(書き込みパスワード)で閲覧はOK、編集は制限
Q2: パスワード付きブックをVBAで開くには?
Workbooks.Open の Password 引数にパスワードを渡す:
Dim wb As Workbook
Set wb = Workbooks.Open("C:\test\sample.xlsx", Password:="myPass123")
書き込みパスワードが設定されている場合は WriteResPassword も指定する:
Set wb = Workbooks.Open("C:\test\sample.xlsx", _
Password:="readPass", _
WriteResPassword:="writePass")
Q3: .xlsxファイルにもパスワードをかけられる?
かけられる。FileFormat:=xlOpenXMLWorkbook(51)を指定する。実務版コードでは wb.FileFormat で元の形式を取得しているため、.xlsx でも .xlsm でもそのまま動作する。
Q4: パスワードの強度に制限はある?
Excel 2016以降では最大255文字。英字(大文字・小文字)・数字・記号が使える。ただし、Excelのパスワード保護はあくまで簡易的なもの。機密性の高いファイルには、ZIP暗号化や専用のDRM製品を併用することを検討する。
Q5: マクロブック(.xlsm)自体にパスワードをかけると、マクロは動く?
パスワードで保護されたブックを開いてパスワードを入力すれば、マクロは通常通り動作する。ただし、ブックを開けない状態ではマクロも実行できない。Workbook_Open イベントで自動実行する場合は、ブックを開く際にパスワードの入力が必要になる。
—
まとめ
この記事で、VBAを使ってブックにパスワードを自動で設定・解除できるようになった。
- 基本版:
SaveAs Password:="pass"で読み取りパスワードを設定 - 応用版:
Password:=""でパスワード解除、新しいパスワードで変更 - 実務版: フォルダ内の複数ブックに一括パスワード設定(エラー時スキップ付き)
重要:パスワードを忘れるとファイルが開けなくなる。設定後は必ずパスワードを記録すること。
関連記事
- 特定シートだけ保護・解除する方法 — シート単位で保護・解除したい場合
- 日付やセル値でファイル名を付けて自動保存する方法 — SaveAsでファイル名に日付を付けて保存
- Excelファイルを自動で開いて処理して閉じる方法 — パスワード付きブックの自動オープン処理
- フォルダ内ファイル一覧を自動取得する方法 — 対象フォルダのファイル一覧を取得してから一括処理
- ファイルやフォルダの存在を確認してから処理する方法 — 保存先フォルダの存在チェック
—
次にやりたくなること
- 特定シートだけ保護・解除する方法: ブック全体ではなくシート単位で保護をかけたい場合に使える。UserInterfaceOnlyでVBAからの編集も許可できる
- 日付やセル値でファイル名を付けて自動保存する方法: パスワード設定と同時に、日付付きファイル名で保存すれば管理がさらに楽になる
- Excelファイルを自動で開いて処理して閉じる方法: パスワード付きブックをVBAで自動オープンして処理したい場合
- フォルダ内ファイル一覧を自動取得する方法: 対象フォルダのファイルを一覧化してからパスワード設定対象を絞り込みたい場合
- ファイルやフォルダの存在を確認してから処理する方法: 保存先フォルダの存在チェックを強化したい場合
—
もっとカスタマイズしたい場合
「部署ごとに異なるパスワードを設定したい」「パスワードの強度ルールを統一したい」「定期的にパスワードを自動変更したい」「パスワード一覧をExcelで管理して読み込みたい」など、業務に合わせたカスタマイズが必要な場合は、ココナラで相談できます。
相談時に以下の情報があるとスムーズです:
- Excel のバージョン / OS
- パスワードを設定するファイルの数と形式(.xlsx / .xlsm)
- 読み取りパスワード・書き込みパスワードのどちらが必要か
- パスワードの管理方法(共通 / ファイルごとに異なる)


コメント