方法';fileopenex';对象的'_MSProject';从VBA自动化MS Project时失败

方法';fileopenex';对象的'_MSProject';从VBA自动化MS Project时失败,vba,ms-project,ms-project-server-2010,Vba,Ms Project,Ms Project Server 2010,我有一个excel宏,它应该打开MS Project,对一些自定义字段进行更改,然后再次关闭它。Excel和Project都是2010版,项目存储在MS Project Server 2010上 当我手动打开MS Project,然后用VBA检测它时,一切正常。但当我使用VBA打开Project的新实例时(因为我没有手动打开MS Project),它会抛出一个错误: 以下是代码的两个版本: Sub open_project_with_error() Dim projapp As MS

我有一个excel宏,它应该打开MS Project,对一些自定义字段进行更改,然后再次关闭它。Excel和Project都是2010版,项目存储在MS Project Server 2010上

当我手动打开MS Project,然后用VBA检测它时,一切正常。但当我使用VBA打开Project的新实例时(因为我没有手动打开MS Project),它会抛出一个错误:

以下是代码的两个版本:

Sub open_project_with_error()

    Dim projapp As MSProject.Application, prj As Project
    Set projapp = New MSProject.Application
    projapp.FileOpenEx Name:="<>\Name of my project", ReadOnly:=False
    Set prj = Projects("Name of my project")
  ' Do more things...
End Sub

Sub open_project_without_error()

    ' Manually open MS Project application before running this VBA
    Dim projapp As MSProject.Application, prj As Project
    Set projapp = GetObject(, "MSProject.Application")
    projapp.FileOpenEx Name:="<>\Name of my project", ReadOnly:=False
    Set prj = Projects("Name of my project")
  ' Do more things...
End Sub
这意味着该错误仅由
New MSProject.Application
New MSProject.Application
组合触发


有办法解决吗

以下是一些可以尝试的建议:

  • 设置
    projapp.Visible=True
    以帮助调试问题
  • 打开并返回对对象的引用,因此请使用它,而不是手动打开Project,然后使用Project返回对已打开对象的引用
  • 将对MSProject对象的引用限定为MSProject.Project和
    Set prj=projapp.Projects(…..

  • FWIW我无法在project pro 2013从project server打开文件时复制此问题。

    我使用此选项从Excel自动打开MSP文件,以检查应用程序是否已打开

    Function GetX(Str As String) As Object
        Dim app As Object
        On Error Resume Next
    
        Set app = GetObject(, Str)
        If Err.Number <> 0 Then
            Set app = CreateObject(Str)
            app.Visible = False
            app.Clear
        End If
    
        Set GetX = app
    End Function
    
    函数GetX(Str作为字符串)作为对象 Dim应用程序作为对象 出错时继续下一步 Set app=GetObject(,Str) 如果错误号为0,则 Set app=CreateObject(Str) app.Visible=False 应用程序。清除 如果结束 设置GetX=app 端函数 然后调用模块中的函数

    Set ProjApp = GetX("MSProject.Application")
    projapp.FileOpenEx Name:="<>\Name of my project", ReadOnly:=False
    Set prj = Projects("Name of my project")
    
    Set ProjApp=GetX(“MSProject.Application”)
    projapp.FileOpenEx名称:=“\Name of my project”,只读:=False
    设置prj=项目(“我的项目名称”)
    
    关于第1行,我没有看到添加该行的更改。我重写了代码以使用CreateObject而不是New,并得到了相同的错误。我做了(3)中提到的更改以限定引用,没有更改。除非手动打开项目时出现弹出框(例如,选择配置文件)使用CreateObject和手动打开(使用GetObject)之间的唯一区别似乎是时间;因此,尝试使用Excel的等待方法暂停一秒钟左右,然后再尝试打开文件。我添加了20秒的等待时间-应该足够长,因为计划大约在4分钟后打开。同样的错误。是否每个project server文件都会发生这种情况?本地保存.mpp文件如何?@RachelHettinger是所有服务器文件。否,本地.mpp文件不受影响。
    Set ProjApp = GetX("MSProject.Application")
    projapp.FileOpenEx Name:="<>\Name of my project", ReadOnly:=False
    Set prj = Projects("Name of my project")