【问题标题】:How to export Excel predecessor data to MS Project?如何将 Excel 前身数据导出到 MS Project?
【发布时间】:2022-07-08 00:33:59
【问题描述】:

我的工作簿中有四列。例如ID 列可以忽略。

ID Task Name Resource Names Predecessors
1 Task1 Employee1 2
2 SubTask1 Employee2
3 Task2 Employee1 4,5
4 SubTask2 Employee2
5 SubTask3 Employee2

我希望创建一个 Excel 宏来将内容导出到 MS Project 中。

我只能在网络上找到关于转移任务的分享。

我的代码,归功于#madschedules,仅包含任务。

Sub createNewMSPFromExcelData()

' First go turn on the MS Project reference library

' Declare variables
Dim pjApp As MSProject.Application
Dim pjProject As MSProject.Project
Dim pjtasklist As MSProject.Tasks
Dim pjtask As MSProject.Task
'Dim pjpredlist As MSProject.TaskDependencies
'Dim pjpredlist As TaskDependencies
Dim pjpred As TaskDependency
Dim xlrange As Range
Dim xlrow As Long
Dim counter As Integer

'open MS Project application
Set pjApp = New MSProject.Application
pjApp.Visible = True

' Add a new project file
Set pjProject = pjApp.Projects.Add
Set pjtasklist = pjProject.Tasks


'Loop through all the Excel Data in the worksheet
counter = 2
Do Until Cells(counter, 1) = ""
    Debug.Print Cells(counter, 1).Value & "   " & Cells(counter, 2).Value & "   " & Cells(counter, 3).Value

    ' Add new task into MS Project from Excel Value
    pjtasklist.Add (Cells(counter, 2).Value)
    pjpred.Add (Cells(counter, 3).Value)

    counter = counter + 1
Loop

MsgBox ("There are " & pjtasklist.Count & vbNewLine & _
       " tasks in our new project")

End Sub

MS Project 中的预期数据

为了回答前人的问题,我目前正在做一个涉及多层次的电子原理图设计项目。因此,要在层次结构上工作,我需要确保在进行下一个层次之前完成子层次结构的活动,因此我将前辈的详细信息从原理图导出到 Excel 中。

【问题讨论】:

  • 我不确定如何在 MS Project 的“资源名称”和“前身”中定义内容。它目前仅适用于任务。顺便说一句,我不是脚本人,主要是在网上搜索一些想法并尝试启用它:)。谢谢

标签: excel vba import export ms-project


【解决方案1】:

添加任务然后设置任务属性的关键是在添加任务对象后获取对它的引用。所以而不是:

pjtasklist.Add (Cells(counter, 2).Value)

Set pjtask = pjtasklist.Add (Cells(counter, 2).Value)
pjtask.ResourceNames = Cells(counter, 3).Value

但是,在继续之前,需要明确任务、子任务和前任。在调度中,子任务被认为是汇总任务下的任务。摘要任务用于对项目任务的相关子集进行分组。摘要任务的开始和结束日期是根据其子任务的最早开始和最晚结束计算的。

前置任务是必须在另一个任务可以开始之前发生的任务。以前的任务几乎总是应该首先输入,以便时间表按时间顺序读取。因此,很少会看到一个任务的前任 ID 值高于它自己的值。相反,Excel 表会更好,其中 OL = OutlineLevel:

ID Task Name Resource Names Predecessors OL
1 Task1 Employee1 1
2 SubTask1 Employee2 2
3 Task2 Employee1 1
4 SubTask2 Employee2 2
5 SubTask3 Employee2 4 2

这会产生如下典型的调度结构:

最后,这里是将上面的表格变成时间表的代码:

Sub createNewMSPFromExcelData()

Dim pjApp As MSProject.Application
Dim pjProject As MSProject.Project
Dim pjtasklist As MSProject.Tasks
Dim pjtask As MSProject.Task
Dim counter As Integer

Set pjApp = New MSProject.Application
pjApp.Visible = True

Set pjProject = pjApp.Projects.Add
Set pjtasklist = pjProject.Tasks

counter = 2
Do Until Cells(counter, 1) = ""

    Set pjtask = pjtasklist.Add(Cells(counter, 2).Value)
    pjtask.ResourceNames = Cells(counter, 3).Value
    pjtask.Predecessors = Cells(counter, 4).Value
    pjtask.OutlineLevel = Cells(counter, 5).Value

    counter = counter + 1
Loop

MsgBox ("There are " & pjtasklist.Count & vbNewLine & _
       " tasks in our new project")

End Sub

【讨论】:

  • 非常感谢瑞秋。感谢提供的答案。我使用代码进行了快速试验,但我看到“运行时错误 91” - 执行 `'pjtask.ResourceNames = Cells(counter, 3).Value pjtask.Predecessors = Cells 时未设置对象变量或块变量(counter, 4).Value pjtask.OutlineLevel = Cells(counter, 5).Value' `
  • 它上面的行是否有效? Set pjtask = pjtasklist.Add(Cells(counter, 2).Value) 确保你有 Set pjtask = … 否则对象变量 pjtask 将不会被设置。
  • 非常好,感谢 Rachel 指出我错过的那一行。我能够将数据移动到相应的列中,但不幸的是它不是我们想要的。每当一个任务有前任时,它会根据前任项目自动添加任务行(空行),因此决定了 ID 和引用。作为可选方案,是否可以将内容粘贴到 MS Project 中?我可以最后粘贴前辈信息以避免自动添加任务行。再次感谢瑞秋。
  • 我想我设法让复制/粘贴工作'' var = Range("Y1").Value Range("AA2").Select Selection.Resize(var).Copy pjApp.Visible = True SelectTaskField Row:=0, Column:="Resource Names" EditPaste ''。
猜你喜欢
  • 2021-07-23
  • 1970-01-01
  • 2011-10-22
  • 2017-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-11
  • 1970-01-01
相关资源
最近更新 更多