Есть ли код VBA, чтобы увидеть, проверен ли файл Enterprise Project 2013 перед открытием?

Пытаясь помочь нашим пользователям Project 2013 с некоторым кодом VBA, мы подошли к моменту, когда не можем найти ответ, чтобы узнать, извлечен ли файл Project 2013 на нашем сервере PWA с помощью VBA. По сути, у них есть список проектов, заданных как задачи в одном файле проекта, и код VBA перебирает список задач для запуска FileOpenEx, вносит некоторые изменения, а затем закрывает его. Однако перед запуском 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, сообщите мне. Спасибо!


person David Welker    schedule 10.08.2016    source источник
comment
являются ли проекты, которые вы ищете, проверены ли они внутри главного проекта?   -  person Shai Rado    schedule 14.08.2016
comment
Нет, это не часть основного проекта. В настоящее время у нас есть основные проекты, запрещенные.   -  person David Welker    schedule 15.08.2016
comment
@Дэйвид. Я думаю, что этот фрагмент от Microsoft может помочь: msdn.microsoft.com/en -us/library/office/jj820423.aspx. В основном вы хотите выбрать проект из коллекции проектов и проверить тип проекта (предприятие или нет). Кроме того, на уровне проекта есть несколько методов для проверки входа и выхода.   -  person Ryan Wildry    schedule 16.08.2016
comment
Спасибо, Райан, я пробовал этот код раньше, и он будет проверять только открытые в данный момент проекты, но не будет просматривать корпоративные проекты.   -  person David Welker    schedule 16.08.2016
comment
Какой Project.Type возвращается, повторяя каждый проект в коллекции проектов?   -  person Ryan Wildry    schedule 16.08.2016
comment
Он не перебирает проекты, он возвращает только открытый в данный момент файл проекта. Если бы я мог установить объект проекта в файл корпоративного проекта, просто передав имя проекта, я мог бы сделать это работоспособным. Но и такого примера я тоже нигде не видел.   -  person David Welker    schedule 16.08.2016


Ответы (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
person David Welker    schedule 30.08.2016