【问题标题】:Identifying specific resources that are overallocated in MS Project using TimeScale使用 TimeScale 识别 MS Project 中过度分配的特定资源
【发布时间】:2019-04-12 05:33:00
【问题描述】:

我有多个资源(学习者、辅导员和房间)分配给任务(培训课程),我想确定哪些是重复预订的,然后将它们添加到文本列中。

我正在使用 TimeScale 方法,并且我目前正在尝试计算重复预订,方法是假设在该会话的给定开始和结束日期内,任何资源的时间超过分配给它们的会话长度双重预订。

但是我不知道如何确定他们被分配的总时间。 pjTimeScale 属性似乎没有返回我需要的东西。使用 pjTimescaleHours 是最接近应该返回的实际值。

我错过了什么?还是有更好的方法?

Sub Overallocations()
'T.Text19 is the Overallocation column
'Identify the overallocations and the source ID
Dim T As Task
Dim R As Resource
Dim tsvs As TimeScaleValues

Dim asn As Assignment

For Each T In ActiveProject.Tasks
T.Text19 = ""
Next T

'Start the allocation of Rooms process
For Each T In ActiveProject.Tasks

i = 0

Application.StatusBar = "Checking Session No." & T.ID
'Checks to see if the task is a valid Module session and if it has been 
confirmed. Skips if not a session or if its a confirmed session
If Left(T.Name, 1) <> "M" Then
    GoTo SkipT
End If

For Each R In T.Resources

    Set tsvs = R.TimeScaleData(T.Start, T.Finish, pjResourceTimescaledWork, 
pjTimescaleHours)
    Duration = (T.Finish - T.Start) * 60 * 24


    If tsvs(1).Value > Duration + 1 Then  'THIS IS WHAT IS NOT WORKING
        If T.Text19 = "" Then
            T.Text19 = R.Name
        Else
            T.Text19 = T.Text19 & ", " & R.Name
        End If
    End If
Next R

SkipT:
Next T 'Next Task

MsgBox "The identification of overallocation has been completed.", 
vbInformation, "Resource Overallocation Complete"

End Sub

【问题讨论】:

    标签: vba ms-project


    【解决方案1】:

    我有多个资源(学习者、引导者和房间)分配给任务(培训课程),我想确定哪些是重复预订的...

    换句话说,需要确定分配给重叠培训课程的学习者、引导者和房间。

    虽然这可以使用TimeScaleData 方法完成,但更简单的方法是查找重叠会话。培训课程重叠的情况有四种:

    • B 类在 A 类之前开始,并在 A 类仍在运行时结束。
    • B 类在 A 类运行时开始,在 A 类之后结束。
    • B 类在 A 类运行时开始和结束。
    • B 类在 A 类之前开始,在 A 类之后结束。

    所有四种情况都可以用一个通用表达式来识别: Class B starts before Class A ends and Class B ends after Class A starts;见下图。

    这是适用于此方法的代码:

    Sub IdentifyOverlappingAssignments()
    
    Dim T As Task
    Dim R As Resource
    
    For Each T In ActiveProject.Tasks
    
        Application.StatusBar = "Checking Session No." & T.ID
    
        T.Text19 = vbNullString
    
        'Checks to see if the task is a valid Module session and if it has been confirmed.
        If Left(T.Name, 1) = "M" Then
    
            For Each R In T.Resources
    
                ' check to see if this resource is assigned to another task
                ' at all during the duration of this task
                Dim asn As Assignment
                For Each asn In R.Assignments
                    If asn.Task.UniqueID <> T.UniqueID Then
                        ' do the tasks overlap?
                        If asn.Task.Finish > T.Start And asn.Task.Start < T.Finish Then
                            If T.Text19 = "" Then
                                T.Text19 = R.Name & " (" & asn.Task.ID & ")"
                            Else
                                T.Text19 = T.Text19 & ", " & R.Name & " (" & asn.Task.ID & ")"
                            End If
                        End If
                    End If
                Next asn
    
            Next R
        End If
    Next T
    
    MsgBox "The identification of overallocation has been completed." _
        , vbInformation, "Resource Overallocation Complete"
    
    End Sub
    

    注意:在这种情况下使用 TimeScaleData 会出现问题,原因包括:1) 资源可以以 50% 的使用率分配,并且不会被识别为重复预订,因为不会过度分配, 2) 如果课程在半小时开始(例如上午 10:30 - 下午 12:00),您需要将时间刻度值缩小到分钟,因为使用 pjTimescaleHours 将返回整小时(例如时间刻度值将从10:00 AM),这是一个很容易引入代码的错误。

    【讨论】:

    • BTW 用于查找重叠资源预订的逻辑也可用于识别给定范围内的任务。例如,用它来“列出未来 90 天内正在处理的所有任务”。
    【解决方案2】:

    两件事,一个关于代码的指针和一个问题。

    1. 如果您要...下一步通过任务集合记住 放一个 If..Then 就像这个一样在里面捕捉空白行。 PM 喜欢空白行,他们会错误地输出您的代码。我也这样做 用于资源,因为有时他们也会在那里放置空白行。

    2. 我能问一下你为什么这样做而不是使用内置 项目中的“过度分配”功能?如果分配了资源 在任何给定小时内工作超过 1 小时,则该资源将 自动被标记为他们所在的任何任务 分配的。这是很酷的代码,但应该是不必要的,除非我 缺少一些东西。

    代码:

    Sub Foo()
    Dim T As Task
    Dim R As Resource
        For Each T In ActiveProject.Tasks
            If Not (T Is Nothing) Then
                'Task stuff
                For Each R In T.Resources
                    If Not (R Is Nothing) Then
                        Resource Stuff
                    End If
                Next R
            End If
        Next T
    End Sub
    

    【讨论】:

      猜你喜欢
      • 2021-07-07
      • 1970-01-01
      • 2014-05-14
      • 2019-03-11
      • 2017-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-23
      相关资源
      最近更新 更多