如何使用VBA从企业Project Server 2013打开仅知部分名称的MS Project文件
解决方案
问题1:是否存在支持占位符匹配的文件打开函数?
不存在。MS Project VBA 原生提供的FileOpenEx等文件打开方法仅支持传入完整项目名称或项目GUID,不支持通配符、占位符类的模糊匹配逻辑。
问题2:遍历Project Server文件列表的实现方案
实现思路:先调用接口拉取Project Server上所有项目的名称列表,遍历列表匹配前缀为目标ProjectID的项目,匹配到唯一结果后调用FileOpenEx打开即可。
场景1:MS Project 内部运行VBA
Sub OpenProjectByID(targetProjectID As String) Dim allProjects As Variant Dim projName As Variant Dim matchedProjName As String ' 拉取服务器所有项目名称列表 allProjects = Application.GetProjectListFromServer ' 遍历匹配前缀为目标ProjectID的项目 For Each projName In allProjects ' 按文件名规则截取前缀对比,也可替换为Instr模糊匹配逻辑 If Split(projName, "_")(0) = targetProjectID Then matchedProjName = projName Exit For End If Next ' 匹配到结果则打开 If matchedProjName <> "" Then ' 可根据需求调整FileOpenEx参数,比如指定打开已发布版本、是否只读等 Application.FileOpenEx Name:=matchedProjName, ReadOnly:=True Else MsgBox "未找到ID为" & targetProjectID & "的对应项目" End If End Sub
场景2:MS Excel 内部运行VBA
需要先创建Project应用对象,逻辑和Project内运行一致:
Sub OpenProjectFromExcel(targetProjectID As String) Dim projApp As Object Dim allProjects As Variant Dim projName As Variant Dim matchedProjName As String ' 创建Project应用对象,已打开Project的话也可以用GetObject获取 Set projApp = CreateObject("MSProject.Application") projApp.Visible = True ' 可设置为False后台运行 ' 拉取服务器所有项目名称列表 allProjects = projApp.GetProjectListFromServer ' 遍历匹配 For Each projName In allProjects If Split(projName, "_")(0) = targetProjectID Then matchedProjName = projName Exit For End If Next If matchedProjName <> "" Then projApp.FileOpenEx Name:=matchedProjName, ReadOnly:=True Else MsgBox "未找到ID为" & targetProjectID & "的对应项目" End If End Sub
注意事项
- 运行代码前需要确保当前账号已经完成Project Server的身份认证,拥有对应项目的访问权限
- 如果服务器上项目数量过万,拉取列表可能耗时较长,可将匹配过的ProjectID和完整文件名的映射关系本地缓存,减少重复拉取请求
- 如果存在前缀相似的ProjectID(比如ID为123和1234的项目),建议保留下划线分隔取第一段匹配的逻辑,避免模糊匹配导致误打开
内容的提问来源于stack exchange,提问作者Enze
相关产品推荐
相关产品推荐

