在打开企业项目2013文件之前,是否有VBA代码可以查看其是否已被签出?

7

我正在尝试为我们的Project 2013用户编写一些VBA代码,但我们遇到了一个问题,即无法通过VBA查找PWA服务器上的Project 2013文件是否被签出。他们基本上将一些项目设置为单个项目文件中的任务列表,而VBA代码循环遍历任务列表以运行FileOpenEx,进行一些更改,然后关闭它。但是,在运行列表中的每个项目之前,需要能够检查Project文件是否已经被签出。以下是我想要达到的样例,但不完全符合我的要求。

SelectBeginning
While ActiveCell.CellColor <> pjBlack
   fname = "<>\" & ActiveCell.Task.Name
   justname = ActiveCell.Task.Name

   On Error Resume Next
   If Application.Projects.CanCheckOut(fname) Then '<--This does not work correctly, not checking Enterprise Projects?
       FileOpenEx Name:=fname, ReadOnly=false
       'Do Some stuff
       FileCloseEx Save:=pjSave, CheckIn:=True
       FileSave
   Else
      MsgBox (justname & " can not be checked out")
   End If

   SelectCell Row:=1
Wend

如果有更好的解决方案,可以轻松检查此问题或其他解决方法来确定企业项目是否通过VBA代码签出,请告知我。谢谢!

你想查看的项目是否在主项目中被检出? - Shai Rado
不,这些不是主项目的一部分。目前我们禁止进行主项目。 - David Welker
@David。我认为这个来自微软的代码片段可能会有所帮助:https://msdn.microsoft.com/zh-cn/library/office/jj820423.aspx。基本上,您需要从项目集合中选择项目,并检查它是企业级还是非企业级项目的类型。然后,在项目级别上有一些用于签入和签出的方法。 - Ryan Wildry
谢谢Ryan,我之前尝试过这段代码,它只会检查当前打开的项目,而不会查找企业级项目。 - David Welker
在遍历projects集合中的每个项目时,将返回哪种Project.Type? - Ryan Wildry
它不会遍历项目,它只返回当前打开的项目文件。如果我能够通过传递项目名称将项目对象设置为企业级项目文件,那么我就可以使其可行。但是我也没有在任何地方看到过这样的示例。 - David Welker
1个回答

1
我们创建了一个解决方案,适用于规划者,但无论如何都必须打开文件。这将以只读模式打开文件,然后尝试在没有警报的情况下检出它。之后,如果我已经检出它(这意味着没有其他人检出它),它将设置j = 0并保存,然后继续进行下一个项目。如果有其他人已经检出它,则会进入“错误处理程序”,告诉项目关闭而不保存,并将文件名保存在字符串中以便稍后返回。
SelectBeginning
While ActiveCell.CellColor <> pjBlack
   fname = "<>\" & ActiveCell.Task.Name
   justname = ActiveCell.Task.Name
   FileOpenEx Name:=fname, ReadOnly=true
   Set ProjToOpen = Application.Projects.Application.ActiveProject
   j = 1
   Application.DisplayAlerts = False
   ProjToOpen.Checkout Project
   Application.DisplayAlerts = True

   If Not Application.IsCheckedOut(ProjToOpen.Name) Then
      GoTo errorhandler
   End If

   'Perform actions here

   j = 0
   FileCloseEx Save:=pjSave, CheckIn:=True
   FileSave
errorhandler: 
   If Not j = 0 Then
      ReDim Preserve skippedfiles(0 to skipped) As String
      skippedfiles(skipped) = justname
      skipped = skipped + 1
      ProjToOpen.Application.FileCloseEx Save:=pjDoNotSave
      GoTo GoToNextProj
   End If

GoToNextProj:
   SelectCell Row:=1

Wend
msgstring = Join(skippedfiles(), vbCr)

MsgBox "Here are the files that were already checked out and therefore not changed: " & vbCr & msgstring

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接