Excel VBA:保护工作表会显著降低VBA代码的速度

Excel VBA:保护工作表会显著降低VBA代码的速度,vba,excel,password-protection,Vba,Excel,Password Protection,我对VBA非常陌生,在构建当前Excel“合同”时基本上自学了。我的目标是创建一个合同选项列表,根据其代表复选框显示或隐藏这些选项。我在4个工作表中显示/删除的范围共有12个选项 在组织方面,我使用了基于每个动作的模块。我还命名了我所有的范围 在保护工作表之前,当我选中复选框时,所有4个工作表中的所有4个范围都会立即显示。当我取消选择时,它们会立即清除内容并隐藏。耶 然而,一旦我保护了我的工作表,事情要么会慢到爬行,要么会出错。在我下面的ProtectWorksheet模块中,注释掉的行可以工作

我对VBA非常陌生,在构建当前Excel“合同”时基本上自学了。我的目标是创建一个合同选项列表,根据其代表复选框显示或隐藏这些选项。我在4个工作表中显示/删除的范围共有12个选项

在组织方面,我使用了基于每个动作的模块。我还命名了我所有的范围

在保护工作表之前,当我选中复选框时,所有4个工作表中的所有4个范围都会立即显示。当我取消选择时,它们会立即清除内容并隐藏。耶

然而,一旦我保护了我的工作表,事情要么会慢到爬行,要么会出错。在我下面的ProtectWorksheet模块中,注释掉的行可以工作,但是从阅读其他堆栈溢出文章来看,使用我的代码似乎更好。没有保护,它工作得很好。我收到“错误1004”:无法设置Range类的隐藏属性。如果我改为在受保护时使用注释掉的代码,它可以工作,但速度非常慢

从技术上讲,我可以让一切正常工作……但从用户界面的角度来看,这太糟糕了

下面是我一直在测试的第一个合同选项。请并感谢您的帮助

在Excel对象下-表2(数据输入)

模块下:复选框

在ClearData模块下

在模块工作表下

Sub ProtectON()
Dim ws As Worksheet
Dim pwd As String

pwd = "123" ' Put your password here
For Each ws In Worksheets
  ws.Protect Password:=pwd, UserInterfaceOnly:=True
Next ws

'Worksheets("Data Input").Protect Password:="123"
'Worksheets("Contract").Protect Password:="123"
'Worksheets("Invoice").Protect Password:="123"
'Worksheets("Expected Cost").Protect Password:="123"
End Sub

Sub ProtectOFF()
Dim ws As Worksheet
Dim pwd As String

pwd = "123" ' Put your password here
For Each ws In Worksheets
  ws.Unprotect Password:=pwd
Next ws
'Worksheets("Data Input").Unprotect Password:="123"
'Worksheets("Contract").Unprotect Password:="123"
'Worksheets("Invoice").Unprotect Password:="123"
'Worksheets("Expected Cost").Unprotect Password:="123"
End Sub
编辑
通过更新下面的“保护开/关”代码,我可以稍微加快速度,但当我单击复选框时,仍然会延迟3-5秒:

Sub ProtectON()
    Dim ws As Worksheet
    Set WSArray = Sheets(Array("Data Input", "Contract", "Invoice", "Expected Cost"))
    For Each ws In WSArray
         ws.Protect Password:="123"
    Next
End Sub

Sub ProtectOFF()
    Dim ws As Worksheet
    Set WSArray = Sheets(Array("Data Input", "Contract", "Invoice", "Expected Cost"))
    For Each ws In WSArray
     ws.Unprotect Password:="123"
    Next
End Sub
编辑-解决方案? 所以我不认为这是最佳实践,也没有真正“解决”我的延迟,但我找到了一个解决办法。我通过启用保护但允许行格式设置,消除了单击复选框时的延迟。从技术上讲,我的工作表不再100%受到用户修补的保护,但我认为,在点击之后,消除这种恼人的等待时间是值得的

Sub ProtectON()

Dim ws As Worksheet
Set WSArray = Sheets(Array("Data Input", "Contract", "Invoice", "Expected Cost"))
For Each ws In WSArray
     ws.Protect Password:="123", AllowFormattingRows:=True
Next

End Sub

它不应该那么慢,尽管我真的不知道你的电脑有多快,数据有多大。但是,以下是您可以改进的地方:

Sub ClearDomesticHotWater()

    For Each cell In [DataInput_DomesticHotWater]
    If cell.Interior.Color = RGB(226, 239, 218) Then
        cell.ClearContents
    End If
    Next

End Sub
并删除所有选择,它们会减慢您的速度。像这样绕过他们:

它不应该那么慢,尽管我真的不知道你的电脑有多快,数据有多大。但是,以下是您可以改进的地方:

Sub ClearDomesticHotWater()

    For Each cell In [DataInput_DomesticHotWater]
    If cell.Interior.Color = RGB(226, 239, 218) Then
        cell.ClearContents
    End If
    Next

End Sub
并删除所有选择,它们会减慢您的速度。像这样绕过他们:

当工作表受到保护时,您不能隐藏行,除非您在保护时明确设置该参数以允许您这样做。我在“已单击代码”复选框的开头关闭保护。即使受到保护,我如何将参数设置为所有我这样做?我需要允许行的格式设置吗?谢谢通过更新下面的保护开/关代码,我可以稍微加快速度,但当我单击复选框或其他按钮时,仍然会有3-5秒的延迟:Sub ProtectON()Dim ws As worket WSArray=Sheets(数组(“数据输入”、“合同”、“发票”、“预期成本”))对于WSArray ws.Protect Password:=“123”Next End sub工作表受保护时无法隐藏行,除非您在保护时明确设置该参数以允许您这样做。我在已单击复选框代码的开头关闭保护。即使受到保护,我如何将参数设置为所有我这样做?我需要允许行的格式设置吗?谢谢通过更新下面的保护开/关代码,我可以稍微加快速度,但当我单击复选框或其他按钮时,仍然会有3-5秒的延迟:Sub ProtectON()Dim ws As worket WSArray=Sheets(数组(“数据输入”、“合同”、“发票”、“预期成本”))对于WSArray ws.Protect Password中的每个ws:=“123”Next End SUBST我的数据的大小是上面乘以12个部分,不包括ProtectWorksheet模块。我在显示/隐藏的单元格中也有大量公式。感谢您的文章,我现在正在通读,我的数据大小是上面乘以12个部分,不包括ProtectWorksheet模块。我在显示/隐藏的单元格中也有大量公式。谢谢你的文章,我正在通读
Sub ProtectON()

Dim ws As Worksheet
Set WSArray = Sheets(Array("Data Input", "Contract", "Invoice", "Expected Cost"))
For Each ws In WSArray
     ws.Protect Password:="123", AllowFormattingRows:=True
Next

End Sub
Sub ClearDomesticHotWater()

    For Each cell In [DataInput_DomesticHotWater]
    If cell.Interior.Color = RGB(226, 239, 218) Then
        cell.ClearContents
    End If
    Next

End Sub