将MS Project信息复制到Excel

时间:2015-01-19 18:18:45

标签: excel excel-vba copy-paste ms-project microsoft-project-vba vba

我有一个启用宏的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中找到最后一个可见任务,但我不熟悉范围选择。有人可以填补空白吗?

谢谢!

1 个答案:

答案 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对象。)