寻求Excel数据到MS Project的通用迁移方法,现有宏需手动赋值
通用方案:从Excel导入实际工时到MS Project
核心思路
通过读取Excel中的结构化数据(包含资源UID、日期、实际工时),动态匹配MS Project中的任务分配项和日期,自动填充工时,无需手动编写每个时间刻度值的赋值代码。
前提准备
- Excel文件需包含至少三列:资源UID、日期、实际工时,示例结构如下:
资源UID 日期 实际工时 2097154 2025/2/4 7 2097154 2025/2/5 8 2097154 2025/2/6 12 ... ... ... - 确保Excel文件处于打开状态,或在代码中指定文件路径。
通用VBA代码实现
Sub ImportActualHoursFromExcel() Dim xlApp As Object Dim xlWB As Object Dim xlWS As Object Dim lastRow As Long Dim i As Long Dim resUID As Long Dim targetDate As Date Dim actualWork As Double Dim asn As Assignment Dim tsv As TimeScaleValues Dim tsvItem As TimeScaleValue ' 连接到已打开的Excel文件(若未打开,可改为指定路径打开) Set xlApp = GetObject(, "Excel.Application") Set xlWB = xlApp.Workbooks("工时数据.xlsx") ' 替换为你的Excel文件名 Set xlWS = xlWB.Worksheets("Sheet1") ' 替换为你的工作表名 lastRow = xlWS.Cells(xlWS.Rows.Count, "A").End(-4162).Row ' -4162对应xlUp ' 遍历Excel中的每一行数据 For i = 2 To lastRow ' 假设第一行是表头,从第二行开始读取 resUID = xlWS.Cells(i, "A").Value targetDate = xlWS.Cells(i, "B").Value actualWork = xlWS.Cells(i, "C").Value ' 查找对应资源的任务分配项 For Each asn In ActiveProject.Tasks If asn.UniqueID = resUID Then ' 获取该分配项对应日期的时间刻度数据 Set tsv = asn.TimeScaleData(StartDate:=targetDate, EndDate:=targetDate, _ Type:=pjAssignmentTimescaledActualWork, TimeScaleUnit:=pjTimescaleDays) ' 匹配日期并赋值 For Each tsvItem In tsv If tsvItem.StartDate = targetDate Then tsvItem.Value = actualWork * 60 ' MS Project中工时单位为分钟,需转换(1小时=60分钟) Exit For End If Next tsvItem Exit For End If Next asn Next i ' 释放对象 Set xlWS = Nothing Set xlWB = Nothing Set xlApp = Nothing MsgBox "工时导入完成", vbInformation End Sub
代码说明
- 批量数据读取:从Excel表格中批量获取资源标识、目标日期和工时数据,彻底替代手动硬编码的方式。
- 精准日期匹配:通过日期直接定位时间刻度项,避免因周末、节假日导致的索引偏移问题,比原代码的索引赋值更可靠。
- 单位转换处理:MS Project实际工时以分钟为存储单位,自动将Excel中的小时数转换为分钟赋值。
- 可扩展性:只需更新Excel中的数据表格,无需修改VBA代码即可完成工时更新,适配不同周期和资源的需求。
注意事项
- 确保MS Project和Excel的宏安全性设置允许运行宏。
- Excel中的日期格式需与MS Project一致,避免日期匹配失败。
- 若同一资源UID对应多个任务分配项,可添加任务名称/UID的匹配条件,进一步精准定位目标任务。
内容的提问来源于stack exchange,提问作者Roman
相关产品推荐
相关产品推荐

