Использование задач для добавления данных Excel с одинаковым идентификатором в MS Project - VBA

В Excel у меня есть номера идентификаторов в столбце "А", начиная со второй строки (первая строка = заголовок). В столбце "T" у меня есть продолжительность для этого идентификатора в той же строке.

В MS Project у меня есть столбец ID и пустой столбец продолжительности. Я хочу добавить продолжительность от Excel до MS Project на правильную строку идентификатора.

Я думаю, что могу сделать это, используя задачи и цикл For..To. Мне нужно будет использовать идентификатор в Excel для поиска задачи в MS Project, а затем записать продолжительность из Excel в соответствующей задаче в MS Project. Пока, с некоторой помощью, код, который я имею:

'Find duration and assign to ID in Excel
For i = 2 To lastRow
date1 = .Cells(i, 15)
date2 = .Cells(i, 16)
    If .Cells(i, 18).Value = "No" Then
    answer = DateDiff("n", date1, date2)
    .Cells(i, 20) = answer
    End If
durationID = .Cells(i,1).Value
Next i

'Open MS Project and add Duration column
set wb = ActiveWorkBook
Set ws = wb.Sheets("Task_Table1")
Set appProj = CreateObject("Msproject.Application")
appProj.FileOpen "File1.mpp"
Set aProg = appProj.ActiveProject
appProj.Visible = True


lastTask = ActiveProject.Tasks.Count
taskID = ActiveProject.Tasks.ID

'Load Durations into MS Project to appropriate ID task
lastTask = ActiveProject.Tasks.Count
For i = 1 to lastTask
    If taskID = Application.Workbooks("File1").Sheets("Task_Table1").Cells(i, 1).Value Then
    answer.Copy
    appProj.SelectCell.ActiveCell
    end if
Next i

1 ответ

Решение

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

'Open MS Project
Set appProj = CreateObject("MSProject.Application")
appProj.FileOpen "File1.mpp"
Set aProg = appProj.ActiveProject
appProj.Visible = True

'Find duration and assign to task
Dim Duration As Long
Dim tsk as MSProject.Task
With ws
    For i = 2 To lastRow
        date1 = .Cells(i, 15)
        date2 = .Cells(i, 16)
        ' get a reference to the task object using the ID stored in Column A
        Set tsk = aProg.Tasks(.Cells(i, 1).Value)
        ' Update duration 
        If .Cells(i, 18).Value = "No" And IsDate(date1) And IsDate(date2) Then
            TotalMinutes = DateDiff("n", date1, date2)
            WorkingMinutes = appProj.DateDifference(date1, date2)
            .Cells(i, 20) = WorkingMinutes 
            tsk.Duration = WorkingMinutes
        End If
        ' update Actual Start and/or Actual Finish
        If IsDate(date1) Then
            tsk.ActualStart = date1
        End If
        If IsDate(date2) Then
            tsk.ActualFinish = date2
        End If
    Next i
End With

Обратите внимание, что есть два расчета для продолжительности. VBA DateDiff функция возвращает общее количество минут между двумя датами, тогда как MS Project DateDifference Функция возвращает количество рабочих минут между двумя датами. Последнее, вероятно, то, что вы хотите использовать. В противном случае 1-дневная продолжительность (всего 1440 минут) превратится в 3-дневную задачу (1440 = 3 дня * 8 часов * 60 минут / час).

Другие вопросы по тегам