我正在使用由其他人开发的相当小的工作表。在这个工作表中,我有约。 500行和100列(这些值动态变化)。
该文档根据同一工作簿中另一个工作表中的命名范围将验证列表添加到某些单元格。这目前有效,但速度很慢。
我想要定位的细胞是在A列的同一行上具有特定值的细胞。单元格的“标题”中也应该有一个特定的名称。
目前,我使用find语句查找所有正确的列,然后对于每个列,我检查A列中的值是否正确,如果是,则添加范围。
现在回答问题;我怎样才能加快速度呢?当工作表处于最大状态时,完成代码需要一分多钟,而且当您打开工作表时会发生这种情况,使用工作表的人会抱怨。 :)
Application.ScreenUpdating = False
Application.EnableEvents = False
Sheets(A).Activate
Sheets(A).Unprotect Password:=Str_SheetPassword
'Get each data ranges
Set Rg_TitleRange = ...
Set Rg_dataRange = ...
'Loop on each column that contains the keyword name
Set Rg_ActionFound = Rg_TitleRange.Find(Str_ColName, LookIn:=xlFormulas, _
lookAt:=xlWhole, SearchOrder:=xlByRows, MatchCase:=True)
If Not Rg_ActionFound Is Nothing Then
'Loop on each action column
Do
'For each data row, update the cells with validation list
For Int_RowIndex = 0 To Rg_dataRange.Rows.Count - 1
'Change cells wich are at the intersection of test definition row and action name column.
If Rg_dataRange(Int_RowIndex, 1) = Str_RowName Then
Set Val_ActionValidationList = Rg_dataRange(Int_RowIndex, Rg_ActionFound.Column).Validation
Val_ActionValidationList.Delete
Rg_dataRange(Int_RowIndex, Rg_ActionFound.Column).Validation.Add _
Type:=xlValidateList, Formula1:=("=" + Str_ValidationList)
End If
Next
'Loop end actions
Int_PreviousActionFoundColumn = Rg_ActionFound.Column
Set Rg_ActionFound = Rg_TitleRange.Find(CommonDataAndFunctionMod.Str_ActionNameRowLabel, Rg_ActionFound, LookIn:=xlValues, lookAt:=xlWhole, SearchOrder:=xlByRows, MatchCase:=True)
Loop While Rg_ActionFound.Column > Int_PreviousActionFoundColumn
End If
Application.ScreenUpdating = True
Application.EnableEvents = True
我已经测试过只是注释掉添加验证的行,所以我很确定行是时间消费者(主要是)。我会接受任何建议。
提前谢谢!
答案 0 :(得分:0)
经过一些尝试后,我最终重做代码,以便此例程在某些其他事件上运行,从而消除启动时的加载时间。验证仅在现在需要时更新。
谢谢大家的建议!
答案 1 :(得分:-1)
当你在循环中使用Loop时,总是会减慢代码的速度。想到不同的算法尝试使用Exit Loop
和Exit Do
何时缩短循环时间。