Как автоматически создавать Сводку и Подзадачи в Microsoft Project с использованием VBA - PullRequest
0 голосов
/ 02 июля 2018

Итак, у меня есть временная шкала в Microsoft Excel, которая содержит различную информацию. Я создал массив своего собственного пользовательского типа, который читает эти данные, но теперь мне нужно вывести мой массив в Project.

Мой массив состоит из пользовательского типа данных следующим образом:

Тип нестандартный

  1. Сводное имя (Подзадача будет идти под их соответствующим резюме задача)
  2. Количество подзадач
  3. Другой массив с именем TaskList ()

Этот массив с именем TaskList () будет содержать столько же подзадач, сколько и количество задач. Все подзадачи в TaskList для соответствующего индекса массива принадлежат одному и тому же итоговому имени и будут иметь следующий формат:

Тип taskList

  1. Имя подзадачи
  2. startDate
  3. ENDDATE

Как бы я поступил сейчас, если бы у меня была вся необходимая информация (имя / итоговое имя / даты начала и окончания), и я был бы способен в VBA автоматически выполнить цикл и вставить это в MS Project?

Большое спасибо,

Мои пользовательские структуры:

Type TimelineInfo
    taskName As String
    dateStart As Date
    dateEnd As Date
End Type

Type resourceSummary
    beginningDate As Date
    endingDate As Date
    resourceName As String
    numberOfTasks As Integer
    taskList() As TimelineInfo
End Type

resourceSummary будет Сводной задачей, а все задачи в taskList () будут находиться под соответствующим кратким именем ресурса.

Я объявил эти две переменные,

Dim timelineArray() As TimelineInfo
Dim groupsArray() As resourceSummary

groupsArray индексируется от 0 до 7, что означает, что необходимо выполнить 8 суммарных задач с таким количеством подзадач внутри них. Массив уже заполнен данными, теперь мне просто нужно вывести его в проект.

z = 1

For i = LBound(groupsArray) To UBound(groupsArray)
    For j = 0 To (groupsArray(i).number - 1)
        tempName = groupsArray(i).taskList(j).taskName
        pj.Tasks.Add Name:=tempName, before:=z
        pj.Tasks(z).Start = groupsArray(i).taskList(j).date
        pj.Tasks(z).Finish = groupsArray(i).taskList(j).dateEnd
        z = z + 1
    Next j
Next i

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

beginningDate As Date
endingDate As Date
resourceName As String

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Если вы работаете из Excel, скорее всего, ваши данные находятся на рабочем листе. Если это так, перемещение его в массивы пользовательских типов добавляет ненужную сложность. Тем не менее, если вы настаиваете на использовании типов, знайте, что три элемента вашего типа задачи Сводка не имеют значения: .

Вот код для добавления задач в новый проект из ваших массивов пользовательских типов:

Sub AddTasks()

Dim i As Integer
Dim j As Integer
Dim z As Integer

For i = LBound(groupsArray) To UBound(groupsArray)
    z = z + 1
    pj.Tasks.Add groupsArray(i).resourceName
    pj.Tasks(z).OutlineLevel = 1
    For j = LBound(groupsArray(i).taskList) To UBound(groupsArray(i).taskList)
        z = z + 1
        pj.Tasks.Add groupsArray(i).taskList(j).taskName
        pj.Tasks(z).Start = groupsArray(i).taskList(j).dateStart
        pj.Tasks(z).Finish = groupsArray(i).taskList(j).dateEnd
        pj.Tasks(z).OutlineLevel = 2
    Next j
Next i

End Sub

Это предполагает, что pj объявлен как MSProject.Project и что он не содержит задач.

Вот код, который я использовал для макетирования данных примера:

Dim groupsArray(4) As resourceSummary
Dim timelineArray(2) As TimelineInfo

Sub MockUpData()

Dim i As Integer
For i = 0 To 2
    timelineArray(i).taskName = "Sub task " & i
    timelineArray(i).dateStart = Date + i * 7
    timelineArray(i).dateEnd = (Date + i * 7) + 4
Next i
For i = 0 To 4
    groupsArray(i).resourceName = "Summary " & i
    groupsArray(i).taskList = timelineArray
Next i

End Sub
0 голосов
/ 02 июля 2018

Я не уверен в вашей проблеме, но я буду работать с этим:

   Proj.Find "UniqueID", "equals", pj.Tasks(z-7).ID
   SelectRow pj.Tasks(z-7).ID, False, z
   OutlineIndent
...