首页 > 解决方案 > MS Project 2016 - VBA 周期时间问题(提取到 Excel)

问题描述

在 MS Office 2016 中与 MS Project 交互(例如,读取数据并处理它)时,我有许多宏似乎正在减慢。它可能是我的底层代码,用于获取/存储数据的机制,但我不确定并且希望输入。

我只是在编写一个用于将 MSP 数据提取到数组中的新宏(保存在内存中,我认为这将是最快的,但它似乎很难做到这一点)。这个想法是数组内存访问“应该”比从 MS Excel 桥接到需要提取/放置数据时引用的项目更快?也许这是不正确的。

目标:将每个 MS 项目资源的 3 个部分保存在数组中,最终遍历数组并放入 Excel 中以供额外使用/处理。

在我破坏代码进行审查之前,最初的“阅读”从未完全完成(在我的 1300 个资源中的 926 个)。

下面的想法,或与 MSP 2016 参考库的接口?与仅在 MS Excel 中工作相比,它似乎变得非常缓慢。

子程序:

  Private Sub cb_IMSResourceImport_Click()
        Dim Prj As Project
        Set Prj = GetObject(Me.cboMaintainToProject.Value)
        Dim ResourceMatrix() As String
        Prj.Application.WindowActivate Prj.Name

        ReDim ResourceMatrix(Prj.Resources.Count, 2)

    ActiveWorkbook.Sheets("Resource Table").Range("A2:C" & C`Str(ActiveWorkbook.ActiveSheet.UsedRange.Rows.Count)).ClearContents

       For i = 1 To UBound(ResourceMatrix)
            ResourceMatrix(i - 1, 0) = Prj.Resources(i).ID
            ResourceMatrix(i - 1, 1) = Prj.Resources(i).Name
            ResourceMatrix(i - 1, 2) = Prj.Resources(i).Code
       Next i

       For i = 0 To UBound(ResourceMatrix)
            ActiveWorkbook.Sheets("Resource Table").Cells(i + 1, 1).Value = ResourceMatrix(i, 0)
            ActiveWorkbook.Sheets("Resource Table").Cells(i + 1, 2).Value = ResourceMatrix(i, 1)
            ActiveWorkbook.Sheets("Resource Table").Cells(i + 1, 3).Value = ResourceMatrix(i, 2)
       Next i

End Sub

标签: excelvbams-project

解决方案


使用 Project 2013 和包含 2000 个资源的模拟计划,您的代码运行时间不到 2 分钟。也就是说,如果您有许多日程表打开、未进行计算等,则可能需要更长的时间。

但是,还有另一种方法可以非常快速地将诸如此类的数据从 Project 复制到 Excel - 使用剪贴板。

Private Sub ExtractResources()

    Dim prj As MSProject.Project
    Set prj = GetObject(Me.cboMaintainToProject.Value)
    Dim msp As MSProject.Application
    Set msp = prj.Application
    msp.WindowActivate prj.Name

    ActiveWorkbook.Sheets("Resource Table").Range("A2:C" & CStr(ActiveWorkbook.ActiveSheet.UsedRange.Rows.Count)).ClearContents

    msp.ViewApply "Resource Sheet"

    msp.SelectSheet
    msp.EditCopy
    ActiveWorkbook.Sheets("Resource Table").Range("A2").PasteSpecial xlPasteValues

End Sub

注意:修改资源视图(或创建您自己的)以定义要从 Project 中导出的列。如果要导出 ID 列,请检查与资源视图一起使用的表的定义,确保第一列未锁定,否则不会包含在 SelectSheet 方法中。


推荐阅读