【问题标题】:Using Tasks to Add Excel Data with Same ID to MS Project - VBA使用任务将具有相同 ID 的 Excel 数据添加到 MS 项目 - VBA
【发布时间】:2020-07-01 07:21:45
【问题描述】:

在 Excel 中,我在“A”列中的 ID 编号从第二行开始(第一行 = 标题)。在“T”列中,我在同一行上有该 ID 的持续时间。

在 MS Project 中,我有一个 ID 列和一个空的持续时间列。我想在正确的 ID 行上添加从 excel 到 MS Project 的持续时间。

我想我可以通过使用任务和 For..To 循环来做到这一点。我将需要使用 excel 中的 ID 在 MS Project 中查找任务,然后在 MS Project 中的相应任务中写入来自 excel 的持续时间。到目前为止,在一些帮助下,我拥有的代码是:

'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

【问题讨论】:

    标签: excel vba ms-project


    【解决方案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 分钟/小时)。

    【讨论】:

    • 为了使整个过程更容易,excel中的日期已经在“实际开始”和“实际完成”下的自己的列中。许多实际的开始日期和结束日期都是“NA”,这会使 DateDifference 不起作用吗?如果它可以工作,我是否能够保持相同的 For To 功能并将日期变量更改为等于 MS Project 中的单元格?例如:date1 = .Cells(i, "Actual Start")
    • 还有结果会打印在哪里?我需要事先做一个专栏吗?
    • 您是否真的需要更新实际开始日期和实际完成日期而不是持续时间?如果需要,您可以将 TotalMinutes 或 WorkingMinutes 变量存储在 Excel 中;我会为此更新代码。
    • 目前没有以分钟为单位的实际持续时间列,并且 MS Project 中的实际持续时间列没有输出正确的输出。所以最初我将数据导出到 excel 并在那里进行 DateDiff 计算,然后尝试使用 ID 将其输出回 MS Project,因为复制和粘贴列不会将持续时间附加到正确的 ID 号。
    • 如果您尝试使用 Excel 中的实际数据来确定您的日程安排,请设置实际开始、实际完成和/或完成百分比字段。直接设置 Actual Duration 列并不常见。
    猜你喜欢
    • 2015-03-20
    • 2015-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-21
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多