如何使用VBA在Microsoft Project中自动创建摘要和子任务

时间:2018-07-02 12:39:58

标签: ms-project microsoft-project-vba

因此,我在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 :(得分:0)

我不确定您的问题是什么,但是我将根据此工作:

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

答案 1 :(得分:0)

如果使用Excel,则您的数据可能在工作表中。如果是这样,将其移动到自定义类型的数组会增加不必要的复杂性。就是说,如果您坚持使用类型,请知道您的摘要任务类型的三个元素是不相关的:BeginningDate和endDate是摘要任务的计算字段,并且您应该删除numberOfTasks,因为已经有了该信息作为taskList数组的大小

这是从自定义类型数组中将任务添加到新项目中的代码:

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