是否有 VBA 代码查看 Enterprise Project 2013 文件在打开前是否已签出?
Is there VBA Code to see if Enterprise Project 2013 file is checked out before opening?
试图用一些 VBA 代码帮助我们的 Project 2013 用户解决问题,但我们已经到了这样的地步,我们似乎无法找到答案来确定 Project 2013 文件是否已签出我们的 PWA 服务器使用 VBA。他们基本上将项目列表设置为单个项目文件中的任务,VBA 代码循环遍历任务列表到 运行 FileOpenEx,进行一些更改,然后将其关闭。但是,需要能够检查项目文件是否在列表中的每个项目上 运行ning FileOpenEx 之前被签出。这是我想要做的事情的一个示例,它并没有完全按照我的意愿去做。
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 代码签出的其他变通方法,请告诉我。谢谢!
我们创建了一个适用于计划者的解决方法,但我们必须以任何一种方式打开文件。这将做的是以只读模式打开文件,然后尝试在没有警报的情况下检出它。之后,如果我签出它(这意味着没有其他人签出它),它会设置 j=0 并保存,然后继续下一个项目。如果其他人已签出它,那么它会转到 'errorhandler' 告诉项目关闭而不保存,并将文件名保存在一个字符串中以便稍后返回。
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
试图用一些 VBA 代码帮助我们的 Project 2013 用户解决问题,但我们已经到了这样的地步,我们似乎无法找到答案来确定 Project 2013 文件是否已签出我们的 PWA 服务器使用 VBA。他们基本上将项目列表设置为单个项目文件中的任务,VBA 代码循环遍历任务列表到 运行 FileOpenEx,进行一些更改,然后将其关闭。但是,需要能够检查项目文件是否在列表中的每个项目上 运行ning FileOpenEx 之前被签出。这是我想要做的事情的一个示例,它并没有完全按照我的意愿去做。
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 代码签出的其他变通方法,请告诉我。谢谢!
我们创建了一个适用于计划者的解决方法,但我们必须以任何一种方式打开文件。这将做的是以只读模式打开文件,然后尝试在没有警报的情况下检出它。之后,如果我签出它(这意味着没有其他人签出它),它会设置 j=0 并保存,然后继续下一个项目。如果其他人已签出它,那么它会转到 'errorhandler' 告诉项目关闭而不保存,并将文件名保存在一个字符串中以便稍后返回。
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