我有一个启用宏的Excel工作簿,可以打开一系列MSProject文件,将过滤器应用于特定列,并将可见范围的部分复制到Excel。复制操作的代码如下所示:
For Each Task In ActiveSelection.Tasks
If Not Task Is Nothing Then
TargetWS.Cells(Row, 3) = Task.PercentComplete / 100
TargetWS.Cells(Row, 4) = Task.Name
TargetWS.Cells(Row, 5) = Task.Start
TargetWS.Cells(Row, 6) = Task.Finish
TargetWS.Cells(Row, 7) = Task.BaselineFinish
Row = Row + 1
End If
Next Task
基本上,我循环遍历过滤范围中的每一行,并一次复制一列。你可以想象,这需要很长时间。
我希望用我在Excel VBA中使用的标准操作集替换这个迭代方法:定义第一个&最后一行,然后对我想要的每一列使用一个复制操作。这将大大减少完成任务所需的复制操作数量,这应该会提高速度。
在Excel VBA中,我想要的代码看起来像这样,定义了最后一行:
TargetWS.Range("A2:" & LastRow).Copy Destination:= (destination cells)
我知道如何在Project中找到最后一个可见任务,但我不熟悉范围选择。有人可以填补空白吗?
谢谢!
答案 0 :(得分:0)
您当前的方法采用合理的方法,因此请尝试提高性能,而不是更改方法。
现在代码中最慢的部分并不是你逐个循环完成任务,而是你逐个单元地写入Excel。您可以采取的第一步是将单个任务的所有数据写入一个:
TargetWS.Range("C" & Row & ":G" & Row) = Array(Task.PercentComplete / 100, _
Task.Name, Task.Start, Task.Finish, _
Task.BaselineFinish)
一旦您对此感到满意,您就可以继续一次编写数据块。要执行此操作,请将数据存储在二维数组中,并在完成循环任务后将其写入Excel。 (注意,如果您有数千个任务,则可能需要以较小的块来编写数据。)
此外,请确保您已在Excel中关闭计算。这可以提高性能,因为可以关闭屏幕更新。只需确保在代码完成后重置两个应用程序设置(即使完成时也会出错)。
最后一个提示,避免命名变量与对象相同(例如名为Task的Task
对象。)