MS Project 2016 - проблемы времени цикла VBA (извлечение в Excel) - PullRequest
1 голос
/ 17 мая 2019

У меня есть многочисленные макросы , которые, кажется, замедляются при взаимодействии с MS Project (например, чтение данных и их обработка) в MS Office 2016 .Это может быть мой основной код, механизмы для получения / хранения данных, но я не уверен и был бы признателен за ввод.

Я просто писал новый макрос для извлечения данных MSP в массив (хранящийся в памятиЯ думал, что это будет быстрее, но, похоже, изо всех сил пытался даже сделать это).Идея заключается в том, что доступ к памяти массива «должен» быть быстрее, чем переход из MS Excel в проект, на который ссылаются при необходимости извлечения / размещения данных?Возможно, это неверно.

Цель: удерживать 3 части каждого ресурса MS Project в массиве, в конечном итоге перебирать массив и помещать в Excel для дополнительного использования / обработки.

Первоначальное «чтение» никогда не завершалось (на 926 из моих 1300 ресурсов) до того, как я нарушил код для проверки.

Идеи ниже или для взаимодействия с MSP2016 Справочная библиотека?Кажется, он стал очень медленным по сравнению с работой в 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

1 Ответ

0 голосов
/ 28 мая 2019

Используя 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.

...