トップ > 汎用コード > 全ワークシートを一括保護・保護解除

全ワークシートを一括保護・保護解除2023.07.28

アクティブブックの全ワークシートを一括で保護・保護解除するマクロです。

[指定フォルダ内の全ブックの全ワークシートを一括保護・保護解除]はこちら

サンプルコード1を実行すると、アクティブブックの全ワークシートを対象に保護・保護解除する処理が実行されます。
シートを保護するか、保護解除するかは、コード内の定数(赤字部)で設定します。またシートの保護や保護解除にパスワードを要する場合には、コード内の定数にパスワードを記載します。


【お薦め】マクロ・プロシージャを管理する無料のツール!
 Excelマクロ管理ツール

サンプルコード1

コードの貼り付け場所

'--------------------------------------------------------------------------------
' 実行マクロ 対象ブックの全ワークシートをパスワード 1234 で保護
'--------------------------------------------------------------------------------
Sub ExampleOfUse1()
    
    '保護・保護解除設定 (True:保護 False:保護解除)
    Const C_PROTECT As Boolean = True

    '保護・保護解除パスワード
    Const C_PASSWORD As String = "1234"
    
    'アクティブブックの全ワークシートをパスワード 1234 で保護
    Dim varResult As Variant
    varResult = ProtectUnprotectAllWorksheets(ActiveWorkbook, C_PROTECT, C_PASSWORD)
    
    Dim strMessage As String
    If IsArray(varResult) Then
        '戻り値が配列の場合はエラー有
        strMessage = "次のシートでエラーが発生しました。" & vbLf & vbLf
        strMessage = strMessage & Join(varResult, vbLf)
    Else
        '戻り値が配列でない場合は全ワークシートで処理成功
        strMessage = "全てのシートでの処理に成功しました"
    End If
    
    'メッセージ表示
    MsgBox strMessage, _
           vbInformation, _
           IIf(C_PROTECT, "シートの保護", "シートの保護解除")
End Sub

'-------------------------------------------------------------------------------- ' 対象ブックの全ワークシートを保護・保護解除 '-------------------------------------------------------------------------------- '[引数] ' WB :対象ブック ' Protect :保護・保護解除設定 ' True :保護 ' False:保護解除 ' Password :保護・保護解除パスワード 省略すると空白 '[戻り値] ' Empty :成功 ' 1次元配列:失敗 保護・保護解除エラーのシート名が格納された1次元配列 '[作成日] ' 2023/07/23 ' https://excel.syogyoumujou.com/vba/protect_all_worksheets.html '-------------------------------------------------------------------------------- Function ProtectUnprotectAllWorksheets(ByRef WB As Workbook, _ ByVal Protect As Boolean, _ Optional Password As String = "") As Variant Dim Sh As Worksheet Dim varArray1d() As Variant Dim lngErrorCount As Long On Error Resume Next '指定シートの全ワークシートを対象に処理実行 For Each Sh In WB.Worksheets If Protect Then '保護 'シートが保護されていなければシートを保護 If Not Sh.ProtectContents Then Sh.Protect Password Else '保護解除 'シートが保護されていたらシートの保護解除 If Sh.ProtectContents Then Sh.Unprotect Password 'エラーの場合はシート名を記録 If Err.Number <> 0 Then Err.Clear ReDim Preserve varArray1d(lngErrorCount) varArray1d(lngErrorCount) = Sh.Name lngErrorCount = lngErrorCount + 1 End If End If Next On Error GoTo 0 'エラーがあった場合は配列を戻り値に指定 If 0 < lngErrorCount Then ProtectUnprotectAllWorksheets = varArray1d End Function

指定フォルダ内の全ブックの全ワークシートを一括保護・保護解除

サンプルコード2を実行すると、フォルダ選択ダイアログボックスが表示されます。フォルダを選択すると、フォルダ内の全Excelファイル(xlsx,xls,xlsm)の全シートを対象に一括で保護・保護解除処理が実行されます。
シートを保護するか、保護解除するかは、コード内の定数(赤字部)で設定します。またシートの保護や保護解除にパスワードを要する場合には、コード内の定数にパスワードを記載します。

サンプルコード2

'--------------------------------------------------------------------------------
' 実行マクロ2 指定フォルダの全ブックの全ワークシートをパスワード 1234 で保護
'--------------------------------------------------------------------------------
Sub ExampleOfUse2()

    '保護・保護解除設定 (True:保護 False:保護解除)
    Const C_PROTECT As Boolean = True

    '保護・保護解除パスワード
    Const C_PASSWORD As String = "1234"

    'フォルダ選択とフォルダ内のファイルパスを取得
    Dim strFolderPath As String
    Dim varFileName   As Variant
    varFileName = GetFileNameOfOneFolder(strFolderPath, "フォルダの選択")

    'フォルダ選択で「キャンセル」を選択した場合は抜ける
    If strFolderPath = "" Then Exit Sub

    'ファイルが見つからない場合は抜ける
    If Not IsArray(varFileName) Then
        MsgBox "ファイルが見つかりません", vbInformation
        Exit Sub
    End If

    'フォルダパスにフォルダ区切り文字追加
    strFolderPath = strFolderPath & Application.PathSeparator

    Dim i          As Long
    Dim WB         As Workbook
    Dim varResult  As Variant
    Dim strSuccess As String
    Dim strError   As String

    '画面更新の停止とイベントマクロを無効に設定
    Application.ScreenUpdating = False
    Application.EnableEvents = False

    With CreateObject("Scripting.FileSystemObject")
        For i = 0 To UBound(varFileName)
            Select Case .GetExtensionName(varFileName(i)) '拡張子取得
            Case "xlsx", "xls", "xlsm"
                'ブックを開く
                Set WB = Workbooks.Open(strFolderPath & varFileName(i))

                '対象ブックの全ワークシートをパスワード 1234 で保護
                varResult = ProtectUnprotectAllWorksheets(WB, C_PROTECT, C_PASSWORD)

                If IsArray(varResult) Then
                    'エラーの場合はブック名とシート名を記録
                    strError = strError & "ブック名:" & WB.Name & vbLf
                    strError = strError & Join$(varResult, vbLf) & vbLf
                Else
                    '成功した場合はブック名を記録
                    strSuccess = strSuccess & WB.Name & vbLf
                End If
                WB.Save
                WB.Close
            End Select
        Next
    End With

    '画面更新の再開とイベントマクロを有効に設定
    Application.EnableEvents = True
    Application.ScreenUpdating = True

    '成功したブック名の表示
    If strSuccess <> "" Then
        MsgBox "次のブックの処理に成功しました" & vbLf & strSuccess, vbInformation
    End If
    
    'エラーが発生した場合
    If strError <> "" Then
        'エラー情報をイミディエイトウィンドウに書き出し
        Debug.Print strError

        'エラー情報のセル出力確認
        If MsgBox("処理を終了しました" & vbLf & _
                  "エラー情報をセルに書き出しますか", _
                  vbQuestion + vbYesNo) = vbYes Then
             varResult = Split(strError, vbLf)
             For i = 0 To UBound(varResult)
                Cells(i + 1, "A").Value = varResult(i)
             Next
        End If
    End If

End Sub

'-------------------------------------------------------------------------------- ' 単一フォルダ内のファイル名を取得する関数 '-------------------------------------------------------------------------------- '[引数] ' FolderPath:対象フォルダパス ' 省略すると参照ダイアログボックスでフォルダを指定 ' Title :ダイアログボックスのタイトル(既定:参照) '[戻り値] ' GetFileNameOfOneFolder:Variant型 ' ファイル名を格納した1次元配列 ' ファイルが見つからない場合はEmptyを返す '[作成日] ' 2023/01/02 '-------------------------------------------------------------------------------- Function GetFileNameOfOneFolder(Optional FolderPath As String = "", _ Optional Title As String = "参照") As Variant 'FileSystemオブジェクトの生成 Dim FSO As Object Set FSO = CreateObject("Scripting.FileSystemObject") 'FolderPathのフォルダが存在しなければ参照ダイアログボックスでフォルダを取得 If Not FSO.FolderExists(FolderPath) Then '参照ダイアログボックス With Application.FileDialog(msoFileDialogFolderPicker) .Title = Title If .Show Then FolderPath = .SelectedItems(1) Else Exit Function End With End If 'ファイル名取得 Dim f As Object Dim lngFilesCount As Long 'ファイル数カウント用 Dim varFilesName() As Variant 'ファイル名格納用配列 With FSO.GetFolder(FolderPath) If 0 < .Files.Count Then For Each f In .Files ReDim Preserve varFilesName(lngFilesCount) varFilesName(lngFilesCount) = f.Name lngFilesCount = lngFilesCount + 1 Next GetFileNameOfOneFolder = varFilesName End If End With End Function
'-------------------------------------------------------------------------------- ' 対象ブックの全ワークシートを保護・保護解除 '-------------------------------------------------------------------------------- '[引数] ' WB :対象ブック ' Protect :保護・保護解除設定 ' True :保護 ' False:保護解除 ' Password :保護・保護解除パスワード 省略すると空白 '[戻り値] ' Empty :成功 ' 1次元配列:失敗 保護・保護解除エラーのシート名が格納された1次元配列 '[作成日] ' 2023/07/23 ' https://excel.syogyoumujou.com/vba/protect_all_worksheets.html '-------------------------------------------------------------------------------- Function ProtectUnprotectAllWorksheets(ByRef WB As Workbook, _ ByVal Protect As Boolean, _ Optional Password As String = "") As Variant Dim Sh As Worksheet Dim varArray1d() As Variant Dim lngErrorCount As Long On Error Resume Next '指定シートの全ワークシートを対象に処理実行 For Each Sh In WB.Worksheets If Protect Then '保護 'シートが保護されていなければシートを保護 If Not Sh.ProtectContents Then Sh.Protect Password Else '保護解除 'シートが保護されていたらシートの保護解除 If Sh.ProtectContents Then Sh.Unprotect Password 'エラーの場合はシート名を記録 If Err.Number <> 0 Then Err.Clear ReDim Preserve varArray1d(lngErrorCount) varArray1d(lngErrorCount) = Sh.Name lngErrorCount = lngErrorCount + 1 End If End If Next On Error GoTo 0 'エラーがあった場合は配列を戻り値に指定 If 0 < lngErrorCount Then ProtectUnprotectAllWorksheets = varArray1d End Function

ページトップへ戻る

Excel 汎用コード

Copyright(C) 2009- 坂江 保 All Rights Reserved.