2016-08-10 16 views
6

Próbując pomóc naszym użytkownikom z Projektu 2013 z pewnym kodem VBA, doszliśmy do punktu, w którym nie możemy znaleźć odpowiedzi na pytanie, czy plik Project 2013 został sprawdzony na naszym serwerze PWA za pomocą VBA. Zasadniczo mają one listę projektów ustawionych jako zadania w jednym pliku projektu, a kod VBA zawiera listę zadań do uruchomienia FileOpenEx, wprowadzenia pewnych zmian, a następnie zamknięcia. Jednak istnieje potrzeba sprawdzenia, czy plik projektu jest wypisany przed uruchomieniem FileOpenEx dla każdego projektu na liście. Oto próbka tego, co zamierzam zrobić, nie całkiem robi to, co chcę.Czy istnieje kod VBA, aby sprawdzić, czy plik Enterprise Project 2013 został wyewidencjonowany przed otwarciem?

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 

Jeśli ktoś ma lepsze rozwiązanie, łatwy sposób na sprawdzenie tego, czy innego obejście dowiedzieć się, czy projekt Enterprise jest wyrejestrowany przez kod VBA, proszę dać mi znać. Dzięki!

+0

to projekty, których szukasz, jeśli są sprawdzone w projekcie głównym? –

+0

Nie, nie są one częścią głównego projektu. Obecnie niedozwolone są projekty główne. –

+0

@ David. Myślę, że ten fragment z Microsoft może pomóc: https://msdn.microsoft.com/en-us/library/office/jj820423.aspx. Zasadniczo chcesz wybrać projekt z kolekcji Projekty i sprawdzić typ projektu, który to jest (przedsiębiorstwo kontra nie). Na poziomie projektu dostępne są niektóre metody sprawdzania i usuwania. –

Odpowiedz

0

Stworzyliśmy obejście, które działa dla planistów, ale musimy otworzyć plik w obie strony. To, co to zrobi, to otworzyć plik w trybie tylko do odczytu, a następnie spróbować go sprawdzić bez ostrzeżeń. Potem, jeśli mam to wyewidencjonowane (co oznacza, że ​​nikt inny go nie wyrzucił), ustawi j = 0 i zapisze, a następnie przejdzie do następnego projektu. Jeśli ktoś inny go wyewidencjonuje, przejdzie do "błędu obsługi", który nakazuje projektowi zamknięcie bez zapisania i zapisanie nazwy pliku w ciągu znaków, który zostanie zwrócony później.

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