正在将 MSProject 信息复制到 Excel

Copying MSProject information to Excel

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

谢谢!

您当前的方法采用了合理的方法,因此与其更改方法,不如尝试提高性能。

现在代码中最慢的部分不是您逐个循环执行任务,而是逐个单元地写入 Excel。您可以采取的第一步是一次写入单个任务的所有数据:

TargetWS.Range("C" & Row & ":G" & Row) = Array(Task.PercentComplete / 100, _
                                               Task.Name, Task.Start, Task.Finish, _
                                               Task.BaselineFinish)

一旦您对此感到满意,您就可以继续一次写入数据块。为此,将数据存储在一个二维数组中,并且仅在完成任务循环后才将其写入 Excel。 (请注意,如果您有数千个任务,则可能需要将数据写入较小的块中。)

此外,请确保您已在 Excel 中关闭计算。这将提高性能,因为可以关闭屏幕更新。只需确保在代码完成后重置两个应用程序设置(即使它完成时出现错误)。

最后一个提示,避免将变量命名为与对象相同的名称(例如,名为 Task 的 Task 对象)。