2016-11-29 117 views
1

我对VBA非常陌生,基本上在建立我当前的Excel“合同”时教会了自己。我的目标是根据代表复选框显示或隐藏合同选项列表。我有4个工作表显示/删除范围,共有12个选项。Excel VBA:保护我的工作表显着减慢了我的vba代码

在组织方面,我已经根据每个行动利用了模块。我还将我的所有范围命名为

在我保护我的工作表之前,当我选中一个复选框时,所有4个工作表中的所有4个范围立即显示。当我取消选择时,他们立即清除其内容并隐藏。好极了!

但是,一旦我保护了我的工作表,事情就会慢下来,或者出现错误。在下面的ProtectWorksheet模块中,注释掉的行可以工作,但是从阅读其他堆栈溢出文章中可以更好地使用我拥有的代码。不受保护,它工作得很好。受保护我得到“错误1004”:无法设置Range类的隐藏属性“。如果我使用我的注释掉的代码,同时保护,它的工作原理,但超慢。

从技术上讲,我可以让一切工作......但从用户界面的立场来看,这很糟糕。

以下是我一直在测试的第一份合约选项。请和任何和所有帮助谢谢你!

下Excel对象 - Sheet 2中(数据输入)

Private Sub chkDomesticHotWater_Click() 

ProtectOFF 

Application.ScreenUpdating = False 

Application.Calculation = xlCalculationManual 

    If chkDomesticHotWater = True Then 
    AddDomesticHotWater 
    Else 
    'Remove the lines, clear the data, and move the mouse to the top 
    RemoveDomesticHotWater 
    ClearDomesticHotWater 
    Range("A1").Select 
    End If 

Application.ScreenUpdating = True 

Application.Calculation = xlCalculationAutomatic 

ProtectON 

End Sub 

模块下:复选框

Sub AddDomesticHotWater() 
    [DataInput_DomesticHotWater].EntireRow.Hidden = False 
    [Contract_DomesticHotWater].EntireRow.Hidden = False 
    [Invoice_DomesticHotWater].EntireRow.Hidden = False 
    [ExpectedCost_DomesticHotWater].EntireRow.Hidden = False 
End Sub 
Sub RemoveDomesticHotWater() 
    [DataInput_DomesticHotWater].EntireRow.Hidden = True 
    [Contract_DomesticHotWater].EntireRow.Hidden = True 
    [Invoice_DomesticHotWater].EntireRow.Hidden = True 
    [ExpectedCost_DomesticHotWater].EntireRow.Hidden = True 
End Sub 

根据模块ClearData

Sub ClearDomesticHotWater() 
    Range("DataInput_DomesticHotWater").Select 
    For Each cell In Selection 
    If cell.Interior.Color = RGB(226, 239, 218) Then 
     cell.ClearContents 
    End If 
    Next 
    Range("DomesticHotWaterStart").Select 
End Sub 

模块ProtectWorksheet

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 
+0

当工作表受到保护时,您不能隐藏行,除非您在保护时明确设置了该参数以允许您这样做。 – Kyle

+0

我在我的复选框已被点击的代码的开始处关闭保护。即使受到保护,我将如何设置参数给所有我这样做?我需要允许行的格式吗?谢谢! – Haley

+0

我可以通过更新下面的保护开启/关闭代码来加速它,但是当我点击我的复选框或其他按钮时,它仍然有3-5秒的延迟: Sub ProtectON() Dim ws作为工作表 设置WSArray =表(数组(“数据输入”,“合同”,“发票”,“期望成本”)) 对于WSArray中的每个ws ws.Protect密码=“123” Next End Sub – Haley

回答

0

它应该不会那么慢,虽然我真的不知道你的电脑有多快,数据有多大。但是,这里有一些你可以做得更好的东西:

Sub ClearDomesticHotWater() 

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

End Sub 

并删除所有选择,它们会减慢你的速度。像这样绕过它们: How to avoid using Select in Excel VBA macros

+0

我的数据的大小是上面乘以12的部分,不包括ProtectWorksheet模块。我在我展示/隐藏的单元格中也有很多公式。 谢谢你删除选择文章,我正在阅读,现在 – Haley