You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

任务摘要层级时间刻度自定义字段及基线成本显示问题咨询

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:界面手动修改

  1. 打开任务工作表视图,右键点击列标题
  2. 选择「自定义字段」,切换到「成本」标签页
  3. 找到「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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 02:30:59