プロが教える店舗&オフィスのセキュリティ対策術

VBA超初心者です。

たくさんのシートのあるエクセルで、
シート保護後もフィルタを使用できるようにVBAを設定したいと思ってます。
(現在エクセル2000を使用してます)

ネットで調べてVBAを設定してみました。
しかし下記のようにするとコンパイルエラーになってしまうのですが、
正しい方法を教えていただけると助かります。

Option Explicit

Private Sub Workbook_BeforeClose(Cancel As Boolean)
  Application.CommandBars("Cell").Reset
End Sub

Private Sub Workbook_Open()
  With Application.CommandBars("Cell").Controls.Add( _
           Type:=msoControlButton, Before:=1, Temporary:=True)
    .Caption = "AutoFilter"
    .OnAction = "ThisWorkbook.filter"
  End With
  With Worksheets.Select
    .Unprotect
    .EnableAutoFilter = True
    .Protect UserInterfaceOnly:=True
  End With
End Sub

Private Sub filter()
  On Error Resume Next
  Selection.AutoFilter
End Sub

A 回答 (2件)

変更前:


 With Worksheets.Select
  .Unprotect
  .EnableAutoFilter = True
  .Protect UserInterfaceOnly:=True
 End With

変更後:
 dim h as worksheet
  :
 For Each h In Worksheets
 With h
  .Protect UserInterfaceOnly:=True
  .EnableAutoFilter = True
 End With
 Next
    • good
    • 1
この回答へのお礼

ありがとうございます!
一発でできるようになりました!
とても助かりました!

お礼日時:2011/02/23 10:13

現在は、Excel2000では試していませんが、Excel2000でしたら、以下のようにしたほうがよいでしょうね。



Unprotect も Protect もそれぞれのシートに対して実行してください。

それと、Excelには、予約語そのものはほとんどないものの、filter というプロシージャ名はよろしくありません。せめて、FilterPro とかにしてください。間違いではありませんが、おかしな影響を及ぼすことがあります。

.OnAction = "ThisWorkbook.FilterPr"

Private Sub Workbook_Open()
Dim sh As Variant
  With Application.CommandBars("Cell").Controls.Add( _
           Type:=msoControlButton, Before:=1, Temporary:=True)
    .Caption = "AutoFilter"
    .OnAction = "ThisWorkbook.FilterPr" '名前
  End With
  For Each sh In ThisWorkbook.Worksheets
    With sh
    .Unprotect
    .EnableAutoFilter = True
    .Protect UserInterfaceOnly:=True
    End With
  Next sh
End Sub

Private Sub FilterPr() '名前
    • good
    • 0
この回答へのお礼

ありがとうございます。
ネットで調べたものをいくつか繋げてみたので、
実際の文言の意味はあまり把握してませんでした。

全てのシートに一発で使えるようにしたかったので、
名前(シート名でよろしいのでしょうか?)部分を入力しない方法を探してました。

お礼日時:2011/02/23 10:17

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!