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
変更前:
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
現在は、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() '名前
お礼
ありがとうございます! 一発でできるようになりました! とても助かりました!