【发布时间】:2015-09-01 12:21:33
【问题描述】:
我有一个 VBA 宏,可以将数据写入已清除的工作表,但它真的很慢!
我正在从 Project Professional 实例化 Excel。
Set xlApp = New Excel.Application
xlApp.ScreenUpdating = False
Dim NewBook As Excel.WorkBook
Dim ws As Excel.Worksheet
Set NewBook = xlApp.Workbooks.Add()
With NewBook
.Title = "SomeData"
Set ws = NewBook.Worksheets.Add()
ws.Name = "SomeData"
End With
xlApp.Calculation = xlCalculationManual 'I am setting this to manual here
RowNumber=2
Some random foreach cycle
ws.Cells(RowNumber, 1).Value = some value
ws.Cells(RowNumber, 2).Value = some value
ws.Cells(RowNumber, 3).Value = some value
...............
ws.Cells(RowNumber, 12).Value = some value
RowNumber=RowNumber+1
Next
我的问题是,foreach 循环有点大。最后,我会得到大约 29000 行。在相当不错的计算机上完成此操作需要超过 25 分钟。
有没有什么技巧可以加快单元格的写入速度? 我做了以下事情:
xlApp.ScreenUpdating = False
xlApp.Calculation = xlCalculationManual
我是否以错误的方式引用单元格?是否有可能写一整行而不是单个单元格?
这样会更快吗?
我已经测试了我的代码,foreach 循环非常快(我将值写入了一些随机变量),所以我知道,写入单元格是一直占用的时间。
如果您需要更多信息,代码片段请告诉我。
感谢您的宝贵时间。
【问题讨论】:
-
这样做
ws.Range(Cells(1, RowNumber), Cells(12, Number))=arr其中arr是some value值的数组,例如Dim arr(1 to 100) as Long。或者如果可能的话ws.Range(Cells(firstRow, RowNumber), Cells(lastRow, Number))=twoDimensionalArray -
可能值得考虑实施进度条。好吧,稍微把事情放下来,但要让用户放心,例程正在进行中。
-
我不知道这是否适用于你,但对我来说,我设置了
.Value = ""。每个调用都占用了 30-40 毫秒(很小,但将其放入数百个项目的循环中!)。我把它改成了.ClearContents,现在调用需要0ms。
标签: vba excel ms-project