Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
项目时间比例数据VBA使用_Vba_Time_Project - Fatal编程技术网

项目时间比例数据VBA使用

项目时间比例数据VBA使用,vba,time,project,Vba,Time,Project,使用API,我希望用pjTaskTimescaledBaselineRemainingTasks中的一些时间刻度数据填充spead工作表,不管它是如何结束的 我想查看项目和提取日期、pjTaskTimescaledBaselineRemainingTasks、pjTaskTimescaledRemainingTasks和pjTaskTimescaledRemainingActualTasks,以便创建一个燃尽图 起初我认为pjTaskTimescaledBaselineRemainingTask

使用API,我希望用pjTaskTimescaledBaselineRemainingTasks中的一些时间刻度数据填充spead工作表,不管它是如何结束的

我想查看项目和提取日期、pjTaskTimescaledBaselineRemainingTasks、pjTaskTimescaledRemainingTasks和pjTaskTimescaledRemainingActualTasks,以便创建一个燃尽图

起初我认为pjTaskTimescaledBaselineRemainingTasks是application.resources对象的一部分,但现在我不太确定

我知道。我也需要在同一张表格中列出的开始是应用程序任务的一部分

我认为这是失败的,因为我没有正确地处理该字段,即它不是T.PjTaskTimescaledData.pjTaskTimescaledBaselineRemainingTasks

我已经看过api文档,但还没有完全理解嵌套是如何工作的,有人能帮我吗

谢谢

人族

Set Pj = ActiveProject

For Each T In Pj.Tasks

XlSheet.Cells(i, 2).Value = T.Start
XlSheet.Cells(i, 3).Value = T.PjTaskTimescaledData(pjTaskTimescaledBaselineRemainingTasks)

Next T
根据Malcolm的反馈更新代码

Sub GetFinishesPerDay()
'Malcolm Farrelle
Const DateValue = 0
Const BLFinish = 1
Const FFinish = 2
Const ACFinish = 3
Dim TaskFinishes() As Date
Dim FinishesPerDate() As Variant
Dim t As Task
Dim p As Project
Dim x As Integer
Dim startdt As Date
Dim finishdt As Date
Dim dt As Date
Dim ThisIndex As Integer
ReDim TaskFinishes(4, 0)
ReDim FinishesPerDate(3, 0)
Set p = ActiveProject
startdt = p.Finish
finishdt = p.Start

Set XlSheet = xlBook.Worksheets("Burndown_Data")
XlSheet.Activate
xlApp.StatusBar = "Updating Burndown Data"

'and the column headings in row 2
XlSheet.Cells(2, 2).Value = "Date"
XlSheet.Cells(3, 2).Value = "Baseline Remaining Tasks" 'BLFinish
XlSheet.Cells(4, 2).Value = "Remaining Tasks" 'FFinish
XlSheet.Cells(5, 2).Value = "Remaining Actual Tasks"


i = 3

'Malcolm Farrelle
For Each t In p.Tasks
    If Not t Is Nothing Then
        'Do not consider any "blank lines" in the project, these are not actually tasks and code will fail
        If Not t.Summary Then
            'Check the finish and baselinefinish dates and set the "startdt" and "finishdt"
            'variables with the earliest start and latest finish of the whole data set
            If t.Finish < startdt Then startdt = t.Finish
            If t.Finish > finishdt Then finishdt = t.Finish
            If t.BaselineFinish <> "NA" Then
                If t.BaselineFinish < startdt Then startdt = t.BaselineFinish
                If t.BaselineFinish > finishdt Then finishdt = t.BaselineFinish
            End If

            'Consider only non-summary tasks - if required add another check to exclude milestones
            ThisIndex = UBound(TaskFinishes, 2) + 1
            ReDim Preserve TaskFinishes(3, ThisIndex)
            If t.BaselineFinish <> "NA" Then TaskFinishes(BLFinish, ThisIndex) = t.BaselineFinish
            TaskFinishes(FFinish, ThisIndex) = t.Finish
            If t.ActualFinish <> "NA" Then TaskFinishes(ACFinish, ThisIndex) = t.ActualFinish
        End If
    End If
Next t


'construct an array of Finishes and Baseline Finishes per date
For dt = Format(startdt, "dd/mmm/yy") To Format(finishdt, "dd/mmm/yy")
    'Using "Format" removes the "HH:MM" component of the itterating "dt" date
    ThisIndex = UBound(FinishesPerDate, 2) + 1
    ReDim Preserve FinishesPerDate(4, ThisIndex)
    FinishesPerDate(FFinish, ThisIndex) = 0
    FinishesPerDate(BLFinish, ThisIndex) = 0
    FinishesPerDate(ACFinish, ThisIndex) = 0
    For x = 1 To UBound(TaskFinishes, 2)
        FinishesPerDate(DateValue, ThisIndex) = dt
        If TaskFinishes(BLFinish, x) <> 0 Then
            'task (i) has a baseline finish
            If TaskFinishes(BLFinish, x) >= dt And TaskFinishes(BLFinish, x) < dt + 1 Then
                'and it finishes on date "dt"
                FinishesPerDate(BLFinish, ThisIndex) = FinishesPerDate(BLFinish, ThisIndex) + 1
            End If
        End If
        If TaskFinishes(FFinish, x) >= dt And TaskFinishes(FFinish, x) < dt + 1 Then
            FinishesPerDate(FFinish, ThisIndex) = FinishesPerDate(FFinish, ThisIndex) + 1
        End If
    Next x
Next dt
Set p = Nothing


'Preview the data
For x = 1 To UBound(FinishesPerDate, 2)
    Debug.Print FinishesPerDate(DateValue, x), "BL: " & FinishesPerDate(BLFinish, x), "FF: " & FinishesPerDate(FFinish, x)
    'control/g


                    XlSheet.Cells(2, i).Value = FinishesPerDate(DateValue, x)
                    XlSheet.Cells(3, i).Value = FinishesPerDate(BLFinish, x)
                    XlSheet.Cells(4, i).Value = FinishesPerDate(FFinish, x)
                    XlSheet.Cells(5, i).Value = FinishesPerDate(ACFinish, x)
                    i = i + 1

Next x
End Sub

这悬念快把我累死了。我不确定OP想要什么,所以我猜了一下。如果OP想知道在最早的预测[finish]或[Baseline finish]日期和最晚的Foreacast[finish]或[Baseline finish]日期之间的每一天有多少任务是基线化完成的,并且预计将在这两天完成,则应提供以下信息。OP中的时间刻度数据是深红色的kipper:

Sub GetFinishesPerDay()
'Malcolm Farrelle
Const DateValue = 0
Const BLFinish = 1
Const FFinish = 2
Dim TaskFinishes() As Date
Dim FinishesPerDate() As Variant
Dim t As Task
Dim p As Project
Dim i As Integer
Dim startdt As Date
Dim finishdt As Date
Dim dt As Date
Dim ThisIndex As Integer
ReDim TaskFinishes(2, 0)
ReDim FinishesPerDate(3, 0)
Set p = ActiveProject
startdt = p.Finish
finishdt = p.Start
For Each t In p.Tasks
    If Not t Is Nothing Then
        'Do not consider any "blank lines" in the project, these are not actually tasks and code will fail
        If Not t.Summary Then
            'Check the finish and baselinefinish dates and set the "startdt" and "finishdt"
            'variables with the earliest start and latest finish of the whole data set
            If t.Finish < startdt Then startdt = t.Finish
            If t.Finish > finishdt Then finishdt = t.Finish
            If t.BaselineFinish <> "NA" Then
                If t.BaselineFinish < startdt Then startdt = t.BaselineFinish
                If t.BaselineFinish > finishdt Then finishdt = t.BaselineFinish
            End If
            'Consider only non-summary tasks - if required add another check to exclude milestones
            ThisIndex = UBound(TaskFinishes, 2) + 1
            ReDim Preserve TaskFinishes(2, ThisIndex)
            If t.BaselineFinish <> "NA" Then TaskFinishes(BLFinish, ThisIndex) = t.BaselineFinish
            TaskFinishes(FFinish, ThisIndex) = t.Finish
        End If
    End If
Next t
'construct an array of Finishes and Baseline Finishes per date
For dt = Format(startdt, "dd/mmm/yy") To Format(finishdt, "dd/mmm/yy")
    'Using "Format" removes the "HH:MM" component of the itterating "dt" date
    ThisIndex = UBound(FinishesPerDate, 2) + 1
    ReDim Preserve FinishesPerDate(3, ThisIndex)
    FinishesPerDate(FFinish, ThisIndex) = 0
    FinishesPerDate(BLFinish, ThisIndex) = 0
    For i = 1 To UBound(TaskFinishes, 2)
        FinishesPerDate(DateValue, ThisIndex) = dt
        If TaskFinishes(BLFinish, i) <> 0 Then
            'task (i) has a baseline finish
            If TaskFinishes(BLFinish, i) >= dt And TaskFinishes(BLFinish, i) < dt + 1 Then
                'and it finishes on date "dt"
                FinishesPerDate(BLFinish, ThisIndex) = FinishesPerDate(BLFinish, ThisIndex) + 1
            End If
        End If
        If TaskFinishes(FFinish, i) >= dt And TaskFinishes(FFinish, i) < dt + 1 Then
            FinishesPerDate(FFinish, ThisIndex) = FinishesPerDate(FFinish, ThisIndex) + 1
        End If
    Next i
Next dt
Set p = Nothing
'Preview the data
For i = 1 To UBound(FinishesPerDate, 2)
    Debug.Print FinishesPerDate(DateValue, i), "BL: " & FinishesPerDate(BLFinish, i), "FF: " & FinishesPerDate(FFinish, i)
Next i
End Sub

从哪里开始?一些建议:在循环中增加i。研究TimescaleData-你需要分配一个TimescaleValues变量,然后选择各个值,按天、周、月或你感兴趣的任何值。最后-你到底想实现什么?pjTaskTimescaledBaselineRemainingTasks不是一件事,我也不清楚您希望它是什么:-而且-如果您使用早期绑定,我只会在开发中使用,您可以利用intellisence查看每个对象的可用方法和属性hi@MalcolmFarrelle-最后我想导出数据,以使我能够在Excel而不是MS Project中创建燃耗图表。为此,我需要具有以下特征的时间刻度数据:日期、基线剩余任务、剩余任务、剩余实际任务。谢谢你的反馈。谢谢Malcom Crimson Kipper-爱它lol。。。我来看看这个。根据你的想法,我可能走错了方向。马尔科姆。。。很抱歉耽搁了,但这是我第一次有机会深入研究解决方案。你说得对,时间刻度的数据是错误的方法,将来我会考虑一些事情。你给我的解决方案是理想的,不过,在最后做了一点小小的改变,我就能够进入xls。再次感谢你的时间——这让我一直在思考的问题变得与众不同。我还在这个条目的顶部添加了一个更新版本,包括实际值。谢谢你的帮助。TerranGreat我很高兴它起了作用。请随时将我添加到链接中,并为MS Project VBA认可我。马尔科姆·法雷尔