2

A12からRの最後の行まで、すべてのシートで特定のセルをロックするマクロを書きたいと思います。

エラー 1004: 「オブジェクト '_Worksheet' のメソッド 'Range' が失敗しました」

列をなして

LastRow = wSheet.Cells.Find(What:="*", After:=[A1], SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row).

誰か助けてくれませんか?ありがとう!

Option Explicit

Sub ProtectAll()

Dim wSheet          As Worksheet
Dim Pwd             As String
Dim LastRow         As Integer

Pwd = InputBox("Enter your password to protect all worksheets", "Password Input")
For Each wSheet In Worksheets
LastRow = wSheet.Cells.Find(What:="*", After:=[A1], SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
    wSheet.Range(Cells(12, 1), Cells(LastRow, 18)).Select
    wSheet.Protect Password:=Pwd, AllowFiltering:=True
Next wSheet

End Sub
4

1 に答える 1

3

シートが空白の場合、現在、設定時に少なくとも 1 つの空白でないセルが見つかると想定しているため、コードは失敗しますLastRow

代わりに範囲オブジェクトを使用してみてください。使用するNot Nothing前にそれをテストしてくださいLastRow

更新: 完全を期すために、シートが既に保護されているかどうかを確認するチェックを追加しました。保護されている場合は、これらをスキップして削除します

Option Explicit

Sub ProtectAll()

Dim wSheet          As Worksheet
Dim Pwd             As String
Dim rng1 As Range
Dim strProt As String

Pwd = InputBox("Enter your password to protect all worksheets", "Password Input")
For Each wSheet In Worksheets
Set rng1 = wSheet.Cells.Find(What:="*", After:=wSheet.[A1], SearchOrder:=xlByRows, SearchDirection:=xlPrevious)
If Not rng1 Is Nothing Then
With wSheet
If .ProtectContents Then
strProt = strProt & .Name & vbNewLine
Else
    .Range(.Cells(12, 1), .Cells(rng1.Row, 18)).Locked = True
    .Protect Password:=Pwd, AllowFiltering:=True
End If
End With
End If
Next wSheet

If Len(strProt) > 0 Then MsgBox strProt, , "These sheet were already protected so were skipped"

End Sub
于 2013-07-03T11:26:17.743 に答える