MS Project 2016 - VBA 周期时间问题(提取到 Excel)

MS Project 2016 - VBA Cycle Time Issues (Extraction to Excel)

在 MS Office 2016与 MS Project(例如,读取数据和处理数据)交互时,我有许多 宏似乎变慢了。它可能是我的基础代码,obtaining/storing 数据的机制,但我不确定并且会感谢输入。

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

目标:将每个 MS 项目资源的 3 个部分保存在数组中,最终遍历数组并放入 Excel 以获得额外的 use/processing。

最初的 'read' 在我打破代码进行审查之前从未完全完成(在我的 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

使用 Project 2013 和包含 2000 个资源的 mocked-up 计划,您的代码 运行 花费了不到 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 列,请检查与资源视图一起使用的 table 的定义,以确保第一列未被锁定,否则它不会包含在 SelectSheet 方法中。