如何通过VBA向MS Project任务备注字段添加附件并后续读取
完全可以通过VBA实现向MS Project任务的Notes字段嵌入/提取文件对象,Project的Notes字段本质是RTF格式容器,原生支持OLE对象嵌入,宏录制器无法捕获该类操作是因为OLE交互属于底层COM调用,不在录制器的默认捕获范围内。
1. VBA实现向任务Notes嵌入文件
调用前建议先在VBA编辑器的「工具-引用」中勾选Microsoft OLE Automation库,代码示例如下:
Sub 嵌入文件到任务Notes(ByVal 任务ID As Long, ByVal 文件完整路径 As String) Dim tsk As Task Dim oleObj As OLEObject ' 校验目标任务是否存在 On Error Resume Next Set tsk = ActiveProject.Tasks(任务ID) On Error GoTo 0 If tsk Is Nothing Then MsgBox "指定ID的任务不存在", vbExclamation Exit Sub End If ' 校验源文件是否存在 If Dir(文件完整路径) = "" Then MsgBox "指定文件不存在", vbExclamation Exit Sub End If ' 嵌入OLE文件对象到任务Notes Set oleObj = tsk.NotesOLEObjects.Add( _ Filename:=文件完整路径, _ Link:=False, _ DisplayAsIcon:=True) End Sub
参数说明:
Link:=False代表将文件完整嵌入项目文件,不依赖源文件路径,源文件删除/移动不影响嵌入的对象;如果设为True仅会插入快捷方式DisplayAsIcon:=True建议保持开启,否则长文档/表格内容会直接占满Notes的显示区域
2. VBA实现从任务Notes提取嵌入文件
代码示例如下:
Sub 从任务Notes提取文件(ByVal 任务ID As Long, ByVal 保存到文件夹路径 As String) Dim tsk As Task Dim oleObj As OLEObject Dim 保存路径 As String On Error Resume Next Set tsk = ActiveProject.Tasks(任务ID) On Error GoTo 0 If tsk Is Nothing Then MsgBox "指定ID的任务不存在", vbExclamation Exit Sub End If ' 遍历并导出Notes内所有OLE对象 For Each oleObj In tsk.NotesOLEObjects 保存路径 = 保存到文件夹路径 & "\" & oleObj.Name oleObj.SaveAs 保存路径 Next oleObj MsgBox "提取完成,共导出" & tsk.NotesOLEObjects.Count & "个文件", vbInformation End Sub
使用说明
- 嵌入文件调用示例:要给ID为15的里程碑任务嵌入
D:\项目验收说明.docx,直接在VBA立即窗口执行嵌入文件到任务Notes 15, "D:\项目验收说明.docx"即可 - 如果单个任务的Notes中嵌入了多个文件,提取代码会自动全部导出到目标文件夹
- 嵌入的所有文件会随.mpp项目文件统一保存,不需要额外存储源文件
注意事项
- 嵌入大文件会导致.mpp项目体积同步上涨,建议单个嵌入文件不超过10MB,避免项目打开卡顿
- 如果需要限制仅支持嵌入指定格式的文件,可以在嵌入逻辑中增加后缀校验规则
- 单个任务的Notes内嵌入文件建议不超过5个,避免加载异常
内容的提问来源于stack exchange,提问作者Harald
相关产品推荐
相关产品推荐

