将MSProject信息复制到Excel

将MSProject信息复制到Excel,excel,vba,copy-paste,ms-project,Excel,Vba,Copy Paste,Ms Project,我有一个启用宏的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

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


谢谢

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

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

TargetWS.Range("C" & Row & ":G" & Row) = Array(Task.PercentComplete / 100, _
                                               Task.Name, Task.Start, Task.Finish, _
                                               Task.BaselineFinish)
一旦您熟悉了这一点,就可以一次编写数据块了。为此,请将数据存储在二维数组中,并仅在完成任务循环后将其写入Excel。(注意,如果您有数千个任务,则可能需要以较小的数据块写入数据。)

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


最后一个技巧是,避免将变量命名为与对象相同的名称(例如
任务
对象命名任务)。

此方法将面临的问题之一是,为了从Project复制数据列,首先需要确保它位于活动表中。如果您不能100%确定视图没有更改,则需要通过代码创建/修改表。谢谢,这正是我要找的。我自己没有想到这件事,觉得有点傻!我已经关闭了计算和屏幕更新,但我也会使用您的建议来小心变量名。