如何在Microsoft Project中用VBA对自定义成本字段做时间刻度化?
解决MS Project VBA时间刻度数据写入的运行时错误1101
运行时错误1101通常和TimeScaleData参数不合法、任务对象无效有关,结合你的代码,问题集中在这几个点:
- 遍历所有任务时未过滤空任务或摘要任务,这类任务无法正常获取/修改时间刻度数据
- 直接对
TimeScaleValue对象赋值,正确方式应修改其Value属性 - 使用
pjTimescaleMonths但仅指定单日日期范围,导致无法返回有效时间刻度条目
以下是修正后的代码,适配你将自定义成本字段(示例中用Cost4对应labor)写入Baseline9Cost时间刻度数据的需求:
Sub MSCostOutlay() ' 将自定义成本字段(Cost4)写入Baseline9Cost的时间刻度数据 Dim tsv As TimeScaleValue Dim tsvs As TimeScaleValues Dim t As Task Dim targetDate As Date ' 测试用的目标日期,可替换为StatusDate或自定义日期 targetDate = ActiveProject.StatusDate For Each t In ActiveProject.Tasks ' 跳过空任务和摘要任务 If Not t Is Nothing And Not t.Summary Then ' 使用日刻度匹配单日测试范围,确保返回有效条目 Set tsvs = t.TimeScaleData( _ StartDate:=targetDate, _ EndDate:=targetDate, _ Type:=pjTaskTimescaledBaseline9Cost, _ TimeScaleUnit:=pjTimescaleDays, _ Count:=1 _ ) ' 写入自定义成本值到时间刻度条目 For Each tsv In tsvs tsv.Value = t.Cost4 Next tsv End If Next t End Sub
关键修正说明:
- 增加任务过滤:跳过空任务和摘要任务,避免无效对象操作
- 时间刻度单位改为
pjTimescaleDays,匹配单日测试的日期范围,确保返回有效时间刻度条目 - 正确修改
TimeScaleValue的Value属性,而非直接对对象赋值
如果需要扩展处理material字段(比如对应Cost5),只需复制写入逻辑并替换Cost4为Cost5;若要使用月刻度,需确保日期范围覆盖完整月份。
内容的提问来源于stack exchange,提问作者BP130
相关产品推荐
相关产品推荐

