Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Excel 2016)
シート保護の許可項目情報の取得について
投稿日時: 18/02/22 09:30:58
投稿者: Shun-ya

いつもお世話になっております。以下に質問させてください。
 
私が開発するExcelマクロは基本的に全てのシートが保護されています。
ユーザーの操作を制御するためで、そのようなファイルがいくつもあります。
よって、修正作業等の効率化を図る(手動でシートの保護/解除をする手間を省く)ために、ワンクリックでシートの保護/解除ができるよう、クイックツールアクセルバーにマクロを登録しております。
 

Sub SheetUnprotect()

    ActiveSheet.Unprotect Password:="abc"  'シート保護解除

End Sub

Sub SheetProtect()

    ActiveSheet.Protect Password:="abc"  'シート保護

End Sub

ところが、シートによっては「許可する操作項目」が異なるため、上記のコードでは誤った保護のされ方をしてしまいます。これを避けるため、シートが保護されていた時の「許可する操作項目」を取得できないものでしょうか。
 
(1) シートの保護
・ロックされていないセル範囲の選択ON
・並べ替えON
・オートフィルタON
(2) シート保護の解除
(3) 再度シート保護
 
上記を手動で行った場合、(3)で「許可する操作項目」のON/OFFがデフォルトで(1)で設定した内容になります。この情報を取得してシートの保護を行いたいというのが目的です。
 
良い方法がございましたら教えてください。
以上、何卒よろしくお願い申し上げます。

回答
投稿日時: 18/02/22 11:46:16
投稿者: WinArrow
投稿者のウェブサイトに移動

 
シートオブジェクトの中に
「Protection」があります。
その中に
設定した内容に該当するプロパティがあります。
  
たとえば、
AllowSorting
保護されたワークシートで並べ替えオプションが使用できる場合は True を返します。値の取得のみ可能です。
  
これは、保護した結果の情報です。
この情報で保護を制御・・・保護を掛けた後で何かするということはできないでしょう。
  
若し、保護を制御したいのでしたら、
どこかに、保護を制御したい内容(シート毎に)を持つ必要があります。
その情報を基に
↓のようなコードを編集することになると思います。
 (上記のプロパティは、値の取得のみです)
  
     ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
         , AllowFormattingCells:=True, AllowFormattingColumns:=True, _
         AllowFormattingRows:=True, AllowInsertingColumns:=True, AllowInsertingRows _
         :=True, AllowDeletingColumns:=True, AllowDeletingRows:=True
 
 

回答
投稿日時: 18/02/22 13:25:59
投稿者: hatch315
メールを送信

 
Sub Macro1()
            Sheet1.Protect _
                   DrawingObjects:=False, _
                   Contents:=True, _
                   Scenarios:=False, _
                   AllowFormattingCells:=True, _
                   AllowFormattingColumns:=True, _
                   AllowFormattingRows:=True, _
                   AllowInsertingColumns:=True, _
                   AllowInsertingRows:=True, _
                   AllowInsertingHyperlinks:=True, _
                   AllowDeletingColumns:=True, _
                   AllowDeletingRows:=True, _
                   AllowSorting:=True, _
                   AllowFiltering:=True, _
                   AllowUsingPivotTables:=True
 
           'シート保護の状態
            Debug.Print Sheet1.ProtectContents
            Debug.Print vbLf
             
           '各プロパティ
            Debug.Print Sheet1.ProtectDrawingObjects
            Debug.Print Sheet1.ProtectContents
            Debug.Print Sheet1.ProtectScenarios
            Debug.Print Sheet1.Protection.AllowFormattingCells
            Debug.Print Sheet1.Protection.AllowFormattingColumns
            Debug.Print Sheet1.Protection.AllowFormattingRows
            Debug.Print Sheet1.Protection.AllowInsertingColumns
            Debug.Print Sheet1.Protection.AllowInsertingRows
            Debug.Print Sheet1.Protection.AllowInsertingHyperlinks
            Debug.Print Sheet1.Protection.AllowDeletingColumns
            Debug.Print Sheet1.Protection.AllowDeletingRows
            Debug.Print Sheet1.Protection.AllowSorting
            Debug.Print Sheet1.Protection.AllowFiltering
            Debug.Print Sheet1.Protection.AllowUsingPivotTables
 
            Sheet1.Unprotect
             
            Debug.Print vbLf
             
           'シート保護の状態
            Debug.Print Sheet1.ProtectContents
            Debug.Print vbLf
             
           '各プロパティ
            Debug.Print Sheet1.ProtectDrawingObjects
            Debug.Print Sheet1.ProtectContents
            Debug.Print Sheet1.ProtectScenarios
            Debug.Print Sheet1.Protection.AllowFormattingCells
            Debug.Print Sheet1.Protection.AllowFormattingColumns
            Debug.Print Sheet1.Protection.AllowFormattingRows
            Debug.Print Sheet1.Protection.AllowInsertingColumns
            Debug.Print Sheet1.Protection.AllowInsertingRows
            Debug.Print Sheet1.Protection.AllowInsertingHyperlinks
            Debug.Print Sheet1.Protection.AllowDeletingColumns
            Debug.Print Sheet1.Protection.AllowDeletingRows
            Debug.Print Sheet1.Protection.AllowSorting
            Debug.Print Sheet1.Protection.AllowFiltering
            Debug.Print Sheet1.Protection.AllowUsingPivotTables
End Sub

投稿日時: 18/02/23 00:28:06
投稿者: Shun-ya

WinArrowさま、hatch315さま
 
アドバイスいただき感謝いたします。大変助かりました。
おかげさまで以下のコードで解決することが出来ました。
 

With ActiveSheet
   .Protect Password:="abc", _
    AllowFormattingCells:=.Protection.AllowFormattingCells, _
    AllowFormattingColumns:=.Protection.AllowFormattingColumns, _
    AllowFormattingRows:=.Protection.AllowFormattingRows, _
    AllowInsertingColumns:=.Protection.AllowInsertingColumns, _
    AllowInsertingRows:=.Protection.AllowInsertingRows, _
    AllowInsertingHyperlinks:=.Protection.AllowInsertingHyperlinks, _
    AllowDeletingColumns:=.Protection.AllowDeletingColumns, _
    AllowDeletingRows:=.Protection.AllowDeletingRows, _
    AllowSorting:=.Protection.AllowSorting, _
    AllowFiltering:=.Protection.AllowFiltering, _
    AllowUsingPivotTables:=.Protection.AllowUsingPivotTables
End With

DrawingObjects、Contents、Scenariosは省略しました(省略しても問題なさそう)。
Contentsを指定する意味など、これらについてはさらに疑問が残りますが、今回は解決とさせていただきます。
 
また何かございましたら、何卒よろしくお願い申し上げます。