如何用VBA管理MS Project版本?求图例读取及数据存储方案
MS Project 图例读取与数据存储解决方案
一、VBA读取图例内容
MS Project 没有直接提供读取图例文本的公开方法,但可以通过调用FilePageSetupLegendEx时仅指定对齐方式、不赋值Text参数的技巧,获取对应位置的现有图例文本。之后可通过字符串处理提取版本号:
Sub GetLegendAndVersion() Dim legendText As String ' 获取左侧图例的现有文本 legendText = FilePageSetupLegendEx(Alignment:=pjLeft, Text:="") ' 从图例文本中提取版本号(适配"Iss X.X"格式) Dim versionStart As Integer, versionEnd As Integer versionStart = InStr(legendText, "Iss ") + 4 versionEnd = InStr(versionStart, legendText, Chr(13)) If versionStart > 4 And versionEnd > versionStart Then MsgBox "当前版本号:" & Mid(legendText, versionStart, versionEnd - versionStart) Else MsgBox "未找到版本号" End If End Sub
二、VBA存储数据的可行方案
1. 隐藏任务+自定义字段
创建一个专门的隐藏任务,用自定义文本字段存储版本号等元数据,不影响项目计划:
Sub SaveVersionToHiddenTask() Dim metaTask As Task ' 查找或创建元数据任务 On Error Resume Next Set metaTask = ActiveProject.Tasks("Meta_Storage") On Error GoTo 0 If metaTask Is Nothing Then Set metaTask = ActiveProject.Tasks.Add("Meta_Storage") metaTask.Visible = False ' 隐藏任务 metaTask.Summary = True ' 设为摘要任务避免干扰日程 End If ' 存储版本号到Text1字段 metaTask.Text1 = "13.0" End Sub Sub RetrieveVersionFromHiddenTask() Dim metaTask As Task On Error Resume Next Set metaTask = ActiveProject.Tasks("Meta_Storage") On Error GoTo 0 If Not metaTask Is Nothing Then MsgBox "存储的版本号:" & metaTask.Text1 End If End Sub
2. 项目内置自定义属性
避开系统只读文件属性,使用MS Project自身的自定义属性存储数据:
Sub SaveVersionToProjectProps() Dim targetProp As CustomProperty On Error Resume Next Set targetProp = ActiveProject.CustomProperties("Schedule_Version") On Error GoTo 0 If targetProp Is Nothing Then ' 添加新属性 ActiveProject.CustomProperties.Add _ Name:="Schedule_Version", _ LinkToContent:=False, _ Type:=msoPropertyTypeString, _ Value:="13.0" Else ' 更新已有属性 targetProp.Value = "13.0" End If End Sub Sub GetVersionFromProjectProps() Dim targetProp As CustomProperty On Error Resume Next Set targetProp = ActiveProject.CustomProperties("Schedule_Version") On Error GoTo 0 If Not targetProp Is Nothing Then MsgBox "自定义属性版本号:" & targetProp.Value End If End Sub
三、Python替代方案
使用win32com.client库对接MS Project,实现相同功能:
1. 读取图例并提取版本号
import win32com.client as win32 def extract_legend_version(project_path): app = win32.Dispatch("MSProject.Application") app.Visible = True project = app.Projects.Open(project_path) # 获取左侧图例文本(0对应pjLeft枚举值) legend_text = app.FilePageSetupLegendEx(Alignment=0) print("图例文本:", legend_text) # 提取版本号 if "Iss " in legend_text: version = legend_text.split("Iss ")[1].split("\n")[0] print("当前版本号:", version) project.Close(SaveChanges=False) app.Quit() # 调用示例 extract_legend_version(r"C:\Your_Project_File.mpp")
2. 存储版本号到项目自定义属性
import win32com.client as win32 def save_version_to_prop(project_path, version_str): app = win32.Dispatch("MSProject.Application") app.Visible = True project = app.Projects.Open(project_path) # 检查并更新自定义属性 prop_exists = False for prop in project.CustomProperties: if prop.Name == "Schedule_Version": prop.Value = version_str prop_exists = True break if not prop_exists: # 2对应msoPropertyTypeString project.CustomProperties.Add("Schedule_Version", False, 2, version_str) project.Save() project.Close() app.Quit() # 调用示例 save_version_to_prop(r"C:\Your_Project_File.mpp", "13.0")
内容的提问来源于stack exchange,提问作者Fran Lannou
相关产品推荐
相关产品推荐

