Использование задач для добавления данных 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 минут / час).