任务摘要层级时间刻度自定义字段及基线成本显示问题咨询
MS Project 技术问题解决方案
问题1:汇总指定日期的所有任务行项目数据
可以实现。核心逻辑是指定目标日期后,遍历所有任务的时间刻度数据,筛选出对应日期的有效数值并累加。
实现代码
Sub GetDailyLaborTotal(targetDate As Date) Dim totalLabor As Double Dim t As Task Dim tsvs As TimeScaleValues Dim tsv As TimeScaleValue totalLabor = 0 For Each t In ActiveProject.Tasks If Not t.Summary And t.Cost1 <> 0 Then Set tsvs = t.TimeScaleData(targetDate, targetDate, pjTaskTimescaledBaseline8Cost, pjTimescaleDays) For Each tsv In tsvs If ActiveProject.Calendar.Period(tsv.StartDate, tsv.EndDate).Working Then totalLabor = totalLabor + tsv.Value End If Next tsv End If Next t MsgBox "指定日期 " & Format(targetDate, "yyyy-mm-dd") & " 的总Labor成本为: " & totalLabor End Sub
调用示例
GetDailyLaborTotal DateSerial(2024, 5, 20)(替换为需要汇总的日期即可)
问题2:修改Baseline8 Cost的显示名称
两种可行方法:
方法1:界面手动修改
- 打开任务工作表视图,右键点击列标题
- 选择「自定义字段」,切换到「成本」标签页
- 找到「Baseline8 Cost」,点击「重命名」并输入"Labor"
方法2:VBA自动修改
在你的TScaleLabor过程中添加以下代码,实现自动化修改:
' 修改Baseline8 Cost显示名称为Labor Dim cf As CustomField On Error Resume Next Set cf = ActiveProject.CustomFields(pjCustomTaskCost, pjTaskBaseline8Cost) cf.Name = "Labor" On Error GoTo 0
优化后的完整VBA代码
合并原代码中重复逻辑,同时集成字段重命名功能:
Sub TScaleLabor() Dim tsv As TimeScaleValue Dim tsvs As TimeScaleValues Dim t As Task Dim startDate As Date, endDate As Date Dim durDays As Double ' 修改Baseline8 Cost显示名称为Labor Dim cf As CustomField On Error Resume Next Set cf = ActiveProject.CustomFields(pjCustomTaskCost, pjTaskBaseline8Cost) cf.Name = "Labor" On Error GoTo 0 For Each t In ActiveProject.Tasks If Not t.Summary And t.Cost1 <> 0 Then t.Baseline8Cost = t.Cost1 durDays = (t.Duration / 60) / 24 ' 分钟转天数 ' 统一处理时间范围 startDate = t.Start endDate = IIf(DateDiff("d", t.Start, t.Finish) > 1, t.Finish - 1, t.Finish) Set tsvs = t.TimeScaleData(startDate, endDate, pjTaskTimescaledBaseline8Cost, pjTimescaleDays, 1) For Each tsv In tsvs If ActiveProject.Calendar.Period(tsv.StartDate, tsv.EndDate).Working Then tsv.Value = t.Baseline8Cost / durDays End If Next tsv End If Next t End Sub
内容的提问来源于stack exchange,提问作者BP130
相关产品推荐
相关产品推荐

