MS Project меняет рабочие значения Назначения при добавлении новых через VBA - PullRequest
3 голосов
/ 09 декабря 2011

У меня проблема с VBA при использовании MS Project 2007. У меня есть задача Task с 2 заданиями, включая ресурсы Foo (2 дня работы) и Bar (5 дней работы).Task установлен на фиксированная работа .Теперь при добавлении дополнительных или удалении Назначений вручную в / из Задачи все работает как положено, ничего сложного не происходит.При использовании VBA, подобно следующему, рабочие значения других назначений изменяются.

' 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

До выполнения сценария:

Task:
  Foo 16h
  Bar 40h

После выполнение сценария:

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

Итак, актуальный вопрос, что я должен делать по-другому, чтобы сохранить рабочие значения других назначений?

Ответы [ 2 ]

1 голос
/ 09 декабря 2011

Поскольку для задачи установлено значение «Фиксированная работа», при добавлении назначения ресурса общая работа для задачи будет оставаться неизменной.Проблема возникает, когда вы хотите добавить ресурс и увеличить общий объем работы для задачи.

Что происходит в этом случае, так это то, что общая работа составила 56 часов.Вы добавляете назначение, и общая работа все еще 56h.Соотношение работы такое же: 40%, 100% и 100%, что составляет 9,33, 23,33 и 23,33 часа.Затем работа для последнего назначения увеличивается до 80 часов, а общая работа для задачи теперь составляет 112,67 часа.

Причина, по которой вы работаете так, как задумано в пользовательском интерфейсе, заключается в том, что вы не просто добавляете новыйназначение и настройка его работы, но с точки зрения MS Project вы также (пере) настраиваете работу на существующих ресурсах.

Решение для выполнения этого в VBA состоит в том, чтобы эмулировать именно то, что происходит вПользовательский интерфейс - который включает в себя сброс работы для существующих ресурсов:

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
0 голосов
/ 28 сентября 2016

На самом деле более простая проблема - это управляемое усилием. Установите задание на фиксированные единицы и израсходованные усилия, и оригинальный код работает нормально.

...