正在将 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
对象)。
我有一个启用宏的 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
对象)。