0

У меня есть рабочая книга Excel с макросами, которая открывает серию файлов MSProject, применяет фильтры к определенному столбцу и копирует части видимого диапазона в 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) 

Я знаю, как найти последнюю видимую задачу в проекте, но не знаком с выбора диапазона. Может ли кто-то заполнить пробелы?

Спасибо!

+0

Одна из проблем, с которой вы столкнетесь с этим методом, заключается в том, что для копирования столбца данных из Project сначала необходимо убедиться, что он находится в активной таблице. Если вы не можете быть на 100% уверены, что представление не изменилось, вам нужно создать/изменить таблицу с помощью кода. –

ответ

0

Ваш текущий метод использует надежный подход, поэтому вместо изменения метода попробуйте улучшить производительность.

Самая медленная часть вашего кода прямо сейчас - это не то, что вы выполняете задачи один за другим, это то, что вы пишете в Excel по ячейкам. Первый шаг, который вы можете сделать, это записать все данные для одной задачи в одном:

TargetWS.Range("C" & Row & ":G" & Row) = Array(Task.PercentComplete/100, _ 
               Task.Name, Task.Start, Task.Finish, _ 
               Task.BaselineFinish) 

Как только Вы освоитесь с этим, то вы можете перейти к написанию блоков данных одновременно. Для этого сохраните данные в 2-мерном массиве и напишите только в Excel, когда вы закончите выполнение задач. (Обратите внимание, что если у вас много тысяч задач, вам может потребоваться записать данные в более мелкие куски.)

Кроме того, убедитесь, что вы выбрали калькулятор в Excel. Это улучшит производительность, а также отключит обновления экрана. Просто убедитесь, что вы сбросили оба параметра приложения, когда ваш код завершен (даже если он заканчивается с ошибкой).

Один из последних советов, не считая переменных имен такими же, как объекты (например, объект Task с именем Task).

+0

Спасибо, это именно то, что я искал. Я чувствую себя немного глупо, не подумав об этом сам! У меня уже есть калькуляция и обновление экрана, но я также буду использовать ваше предложение, чтобы быть осторожным в именах переменных. – Luke

Смежные вопросы