【问题标题】:How do I automatically create Summary and Subtasks in Microsoft Project using VBA如何使用 VBA 在 Microsoft Project 中自动创建摘要和子任务
【发布时间】:2018-12-10 16:47:26
【问题描述】:

所以我在 Microsoft Excel 中有一个包含各种信息的时间线。我创建了一个我自己的自定义类型的数组,它读取了这些数据,但现在我需要将我的数组输出到 Project 中。

我的数组包含如下自定义数据类型:

输入自定义类型

  1. 摘要名称(子任务将在各自的摘要下 任务)
  2. 子任务数
  3. 另一个名为 TaskList() 的数组

这个名为 TaskList() 的数组将包含与任务数量一样多的子任务。 TaskList 中相应数组索引的所有子任务都属于相同的摘要名称,并且格式如下:

键入任务列表

  1. 子任务名称
  2. 开始日期
  3. 结束日期

鉴于我拥有所有必要的信息(姓名/摘要名称/开始和结束日期)并且能够在 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

【问题讨论】:

  • 这个问题不应该被搁置,因为 OP 只漏掉了一小部分答案。

标签: vba ms-project


【解决方案1】:

如果您使用 Excel,您的数据可能在工作表中。如果是这样,将其移动到自定义类型的数组会增加不必要的复杂性。也就是说,如果您坚持使用类型,请知道您的 Summary 任务类型的三个元素是不相关的: beginDate 和 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

【讨论】:

    【解决方案2】:

    我不确定你的问题是什么,但我会解决这个问题:

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

    【讨论】:

    • 嘿,我刚刚在原始问题中添加了一些代码。由于我的数组中已经有数据,因此无需查看电子表格。此外,这是在项目中完成的,因此我们不需要创建对象(“MsProject.Application”)。如果您需要更多代码来更好地理解我的问题,请告诉我。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-01
    • 1970-01-01
    • 2021-12-22
    • 2021-06-06
    • 2014-11-11
    • 2015-10-28
    相关资源
    最近更新 更多