项目时间比例数据VBA使用
使用API,我希望用pjTaskTimescaledBaselineRemainingTasks中的一些时间刻度数据填充spead工作表,不管它是如何结束的 我想查看项目和提取日期、pjTaskTimescaledBaselineRemainingTasks、pjTaskTimescaledRemainingTasks和pjTaskTimescaledRemainingActualTasks,以便创建一个燃尽图 起初我认为pjTaskTimescaledBaselineRemainingTasks是application.resources对象的一部分,但现在我不太确定 我知道。我也需要在同一张表格中列出的开始是应用程序任务的一部分 我认为这是失败的,因为我没有正确地处理该字段,即它不是T.PjTaskTimescaledData.pjTaskTimescaledBaselineRemainingTasks 我已经看过api文档,但还没有完全理解嵌套是如何工作的,有人能帮我吗 谢谢 人族项目时间比例数据VBA使用,vba,time,project,Vba,Time,Project,使用API,我希望用pjTaskTimescaledBaselineRemainingTasks中的一些时间刻度数据填充spead工作表,不管它是如何结束的 我想查看项目和提取日期、pjTaskTimescaledBaselineRemainingTasks、pjTaskTimescaledRemainingTasks和pjTaskTimescaledRemainingActualTasks,以便创建一个燃尽图 起初我认为pjTaskTimescaledBaselineRemainingTask
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认可我。马尔科姆·法雷尔