【问题标题】:MS Project 2016 - VBA Cycle Time Issues (Extraction to Excel)MS Project 2016 - VBA 周期时间问题(提取到 Excel)
【发布时间】:2019-05-29 02:50:00
【问题描述】:

在 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

【问题讨论】:

    标签: excel vba ms-project


    【解决方案1】:

    使用 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 方法中。

    【讨论】:

    • 所以我已经讨论过这种方法,我需要去看看它是否更快。我有一种感觉,在许多情况下,基于 Excel 标题中的用户列选择使用 VBA 构建自定义表,并且简单地复制/粘贴数据可能会更快。我想知道交叉点在哪里之后。当然,数组拉取变得更有效的数据存在列/行限制。
    猜你喜欢
    • 1970-01-01
    • 2016-08-16
    • 2017-11-21
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    • 2020-12-12
    • 1970-01-01
    • 2021-07-23
    相关资源
    最近更新 更多