2011-12-09 46 views
3

使用MS Project 2007的VBA时出现问题。我有一个任务Task,其中包含资源Foo(工作2天)和Bar(5天工作)。 Task设置为固定作业。现在,当手动添加或从任务中删除任务时,所有工作都按预期工作,没有什么奇怪的事情发生。当使用VBA时,如下所示,其他作业的工作值会改变。执行脚本通过VBA添加新项目时MS项目更改分配的工作值

Task: 
    Foo 16h 
    Bar 40h 

后:

Task: 
    Foo 9,33h 
    Bar 23,33h 
    Baz 80h 

因此,实际的问题,我有什么,为了做到不同,以

' Adding an Assignment with the "Baz" Resource and 10d of work 
Sub AddAssignment() 
    Dim tskTask As Task 
    Dim rsResource As Resource 
    Dim asAssignment As Assignment 

    Set tskTask = ActiveProject.Tasks(1) 
    Set rsResource = ActiveProject.Resources("Baz") 
    Set asAssignment = tskTask.Assignments.Add(tskTask.ID, rsResource.ID) 
    asAssignment.Work = "10d" 
End Sub 

执行脚本前保持其他作业的工作价值?

回答

2

因为任务设置为Fixed Work,所以当您添加资源分配时,它将使任务的总工作保持不变。当您想添加资源并增加任务的总工作量时,就会出现问题。

在这种情况下发生的事情是总共工作56小时。你添加一个作业,总的工作仍然是56小时。工作比例相同:分别为40%,100%和100%,达到9.33小时,23.33小时和23.33小时。然后,最后一项任务的工作时间增加到80小时,目前该任务的总工作时间为112.67小时。

它按照用户界面的意图工作的原因是因为您不只是添加新的作业并设置其工作,而是从MS Project的角度来看,您也正在(重新)设置工作现有资源。

解决在VBA这样做是模仿到底发生了什么在UI - 包括重置工作,为现有资源:

Sub AddAssignment() 
    Dim tskTask As Task 
    Dim rsResource As Resource 
    Dim asAssignment As Assignment 
    Dim colAssn As Collection 
    Dim iIdx As Integer 

    Set tskTask = ActiveProject.Tasks(7) 
    Set rsResource = ActiveProject.Resources("Baz") 
    Set colAssn = New Collection 
    For Each asAssignment In tskTask.Assignments 
     colAssn.Add asAssignment.Work 
    Next asAssignment 
    Set asAssignment = tskTask.Assignments.Add(tskTask.ID, rsResource.ID) 
    colAssn.Add 10 * 8 * 60 ' work is stored as minutes 
    For iIdx = 1 To colAssn.Count 
     tskTask.Assignments(iIdx).Work = colAssn(iIdx) 
    Next iIdx 
End Sub 
+1

啊,我明白了!尝试了你的方式,并偶然发现一个小问题。当添加一个新的Assignment时,'tskTask.Assignments'的索引可能会改变,所以实际的Assignment与之前没有相同的索引位置。我没有进一步调查,但现在正在使用Dictionary,它肯定会将正确的资源映射到正确的工作量并进行设置。很好的答案,非常感谢,谢谢瑞秋! – tbuehlmann

+1

哦,和FYI,[this](http://pastie.org/3004565)是我现在的工作代码。 – tbuehlmann

+0

我想知道资源的顺序......感谢您分享您的解决方案。 –

0

其实简单的问题是努力推动。将任务设置为固定单位,努力赶走,原始代码正常工作。