2012-04-25 102 views
4

我是vba的新手 - 我从字面上只做了3天。在Excel 2003 vba中插入新行非常慢

无论如何,我有几个表单从用户那里获取一些数据,然后我将它们写到单独的“日志”工作表的第一行。我正在使用这个:

With Worksheets("Log") 
    .Unprotect 
    .Range("A2").EntireRow.Insert Shift:=xlDown 
    .Range("A2") = varToken 
    .Range("B2") = varAction 
    .Range("C2") = varLocation 
    .Range("D2") = varTracking 
    .Range("E2") = Date 
    .Range("F2") = Time 
    .Range("G2") = varPerson 
    .Range("H2") = varOverride 
    .Protect 
End With 

麻烦的是,它弹到日志表半秒钟,然后花费时间来写。

我把它写入日志顶行的原因是,我使用varToken的100个lookup(有100个不同的标记来查找)在前面的表单中汇总了数据,它们查找第一个即顶部)条目。

如果更快,我可以写入日志表的底部,但是后来我需要一个代码来替换100个将查找最后提及的令牌的代码,这些代码可能会有数千行和数千行,奔驰!

在此先感谢!

回答

10

我相信你的Vlookups正在放慢这个过程,因为他们每次写入单元格时都会重新计算它们。试试这个

With Application 
    .ScreenUpdating = False 
    .Calculation = xlCalculationManual 
End With 

With Worksheets("Log") 
    .Unprotect 
    .Range("A2").EntireRow.Insert Shift:=xlDown 
    .Range("A2") = varToken 
    .Range("B2") = varAction 
    .Range("C2") = varLocation 
    .Range("D2") = varTracking 
    .Range("E2") = Date 
    .Range("F2") = Time 
    .Range("G2") = varPerson 
    .Range("H2") = varOverride 
    .Protect 
End With 

With Application 
    .ScreenUpdating = True 
    .Calculation = xlCalculationAutomatic 
End With 
+2

虽然这不太可能失败,但在更改应用程序设置时最好使用错误处理程序。 (是的,我知道你知道!) – assylias 2012-04-25 14:36:51

+0

+ 1 @assylias:是的,总是处理错误是一个很好的观点。 :) – 2012-04-25 14:37:56

+0

辉煌 - 谢谢!对它进行排序。我可以问什么assylias意味着错误处理程序? – 2012-04-25 15:07:49