2010 Excel VBA-如果工作簿已受保护,则结束子问题

2010 Excel VBA-如果工作簿已受保护,则结束子问题,vba,excel,Vba,Excel,我有一个按钮,它使用下面的sub-ProtectAll_管理代码 管理员已保护工作簿时,如果不检查工作簿是否已被保护,则会发生错误。因此,我需要一个消息框来告诉管理员工作簿已经受到保护。下面的代码将向我提供一条消息,说明它已受到保护,即使它尚未受到保护。如果我去掉下面几行代码,它将正常运行,但我又回到了原点,它将出错,因为一个列已经对我的调用mcr\u hiderowscollans\u ADMIN隐藏。i、 我希望这个子程序是分开的,因为有很多工作表需要隐藏列和行 If ActiveWork

我有一个按钮,它使用下面的sub-ProtectAll_管理代码

管理员已保护工作簿时,如果不检查工作簿是否已被保护,则会发生错误。因此,我需要一个消息框来告诉管理员工作簿已经受到保护。下面的代码将向我提供一条消息,说明它已受到保护,即使它尚未受到保护。如果我去掉下面几行代码,它将正常运行,但我又回到了原点,它将出错,因为一个列已经对我的调用mcr\u hiderowscollans\u ADMIN隐藏。i、 我希望这个子程序是分开的,因为有很多工作表需要隐藏列和行

 If ActiveWorkbook.ProtectStructure Then End
    MsgBox ActiveWorkbook.Name & " is already protected.", _
        vbCritical
 Exit Sub
下面是完整的代码,我非常感谢有人的敏锐眼光:

Sub ProtectAll_ADMIN()

     Dim S As Object

     If ActiveWorkbook.ProtectStructure Then End
       MsgBox ActiveWorkbook.Name & " is already protected.", _
        vbCritical
     Exit Sub

     ' To Hide all rows and columns for editing
     Call mcr_HideRowsColumns_ADMIN

     Dim pWord1 As String, pWord2 As String
        pWord1 = InputBox("Please Enter the password")
     If pWord1 = "" Then Exit Sub
        pWord2 = InputBox("Please re-enter the password")

     If pWord2 = "" Then Exit Sub
     'Make certain passwords are identical
     If InStr(1, pWord2, pWord1, 0) = 0 Or _
        InStr(1, pWord1, pWord2, 0) = 0 Then
          MsgBox "You entered different passwords. No action taken!"
     Exit Sub
     End If
     For Each ws In Worksheets
         ws.Protect Password:=pWord1
     Next
         MsgBox "All Sheets are Protected."
     Exit Sub

    '-------------------------------------------
    Sheets("Home").Select
    Range("A1").Select

 End Sub

有什么想法吗?谢谢大家!

我稍微重新设计了您的代码:

Sub ProtectAll_ADMIN()
Dim ws As Worksheet
Dim pWord1 As String
Dim pWord2 As String

For Each ws In Worksheets
    If ws.ProtectContents Then
        MsgBox ActiveWorkbook.Name & " is already protected.", vbCritical
        Exit Sub
    End If
Next ws

' To Hide all rows and columns for editing
Call mcr_HideRowsColumns_ADMIN

pWord1 = InputBox("Please Enter the password")
If pWord1 = "" Then Exit Sub

pWord2 = InputBox("Please re-enter the password")
If pWord2 = "" Then Exit Sub

'Make certain passwords are identical
If InStr(1, pWord2, pWord1, 0) = 0 Or InStr(1, pWord1, pWord2, 0) = 0 Then
    MsgBox "You entered different passwords. No action taken!"
    Exit Sub
End If

For Each ws In Worksheets
     ws.Protect Password:=pWord1
Next

MsgBox "All Sheets are Protected."

End Sub

我不知道你为什么用End?它不应该是这样的:如果是ActiveWorkbook.ProtectStructure,那么MsgBox ActiveWorkbook.Name&已经受保护,vbCritical Exit子端If@RADO感谢您的尝试,这实际上会给我一个编译错误:如果没有块,结束如果我重新设计并测试了您的代码,它会工作。以前不起作用的原因:您测试了工作簿保护,然后设置了工作表保护。这是两个不同的对象。正如@RADO所说,ProtectStructure只是告诉您工作表的顺序是否受到保护,如果受到保护,您将结束代码执行。如果不是,你会显示一条消息说它是,然后返回到任何调用子例程的地方。这很好。我还尝试使用了Else,并在末尾添加了EndIf,这使它也能正常工作,但我认为前面提到的内容非常干净,所以再次感谢您。