MSProjectをVBScriptまたはVBAで操作する

Table of Content

目的

MSProjectをVBScriptまたはVBAで操作する。

なお、MSProjectの評価版は下記からダウンロードすることができる。
http://technet.microsoft.com/ja-jp/evalcenter/default.aspx

リファレンス

Project 2013オブジェクト モデルのリファレンス
http://msdn.microsoft.com/ja-jp/library/office/dn175492%28v=office.15%29.aspx

Application and Project Object Map(Office 2010)
http://msdn.microsoft.com/en-us/library/office/ff863668%28v=office.14%29.aspx

VBAでの操作例

MSProjectはExcelなどの他のオフィス製品と同様にVBAで操作を行うことができる。

タスクの選択

プロジェクト中のタスクに参照する場合はProjectオブジェクトのTasksコレクションから参照する。
TasksコレクションはTaskのオブジェクトの集合だ。
下記のようにタスク名またはID名を指定してタスクを取得できる。

サンプル:

    Dim prj As Project
    Set prj = ThisProject
    Debug.Print prj.tasks.item(7).id
    Debug.Print prj.tasks.item("TEST11").id

タスクのプロパティ

タスクオブジェクトの詳細情報は下記のプロパティから設定、取得できる。

プロパティ名 説明
Name タスクの名称。ProjectのTasksオブジェクトはこの名称をキーに管理されている。
OutlineLevel タスクの階層のレベル。親がいない場合は1になる。OutlineLevelを指定しても階層構造を変更することはできない。
OutlineChildren サブタスクの一覧。Taskオブジェクトのコレクションになっている。このコレクションに対してAddを行なっても階層構造を考慮した追加はされない。
Notes タスクに対する注釈を記述できる。
Start タスクの開始日
Finish タスクの終了日
PercentComplete 達成率
ActualStarte 開始日実績
ActualFinish 終了日実績
BaselineStart タスクの割り当ての基準開始日
BaselineFinish タスクの割り当ての基準終了日
ResourceNames リソースの名称。複数存在する場合は,で区切る
Resouces Resourceオブジェクトのコレクション。
PredecessorTasks 先行タスクのTaskオブジェクトのコレクション。存在しない場合は、先行タスクがないことをあらわす。

サンプル:

    Dim prj As Project
    Set prj = ThisProject
    Dim tsk As task
    Dim pTsk As task
    Dim r As Resource
    For Each tsk In prj.tasks
        Debug.Print tsk.id
        Debug.Print "  Name:" & tsk.name
        Debug.Print "  OutlineLevel:" & tsk.OutlineLevel
        Debug.Print "  Notes:" & tsk.Notes
        Debug.Print "  Start:" & tsk.Start
        Debug.Print "  Finish:" & tsk.Finish
        Debug.Print "  PercentComplete:" & tsk.PercentComplete
        Debug.Print "  ActualStart:" & tsk.ActualStart
        Debug.Print "  ActualFinish:" & tsk.ActualFinish
        Debug.Print "  BaselineStart:" & tsk.BaselineStart
        Debug.Print "  BaselineFinish:" & tsk.BaselineFinish
        Debug.Print "  ResourceNames:" & tsk.ResourceNames
        Debug.Print "  Resources:"
        For Each r In tsk.Resources
            Debug.Print "    Resouce.Id :" & r.id
            Debug.Print "    Resouce.Name :" & r.name
        Next
        Debug.Print "  PredecessorTasks:"
        For Each pTsk In tsk.PredecessorTasks
            Debug.Print "    " & pTsk.id & "  " & pTsk.name
        Next
        ' Readonly
        Debug.Print "  OutlineChildren:"
        For Each pTsk In tsk.OutlineChildren
            Debug.Print "    " & pTsk.id & "  " & pTsk.name
        Next
    Next

タスクの追加

末尾への追加例

ThisProject.Tasks.Add "TaskName1"

指定の位置に追加例

ThisProject.Tasks.Add "TaskName2",3

タスクの階層については自分で指定しなければならない。
親となるタスクの直後に追加した後に、OutlineIndentまたは、OutlineOutdentを用いて階層を調整する必要がある。

' 指定のdepth に階層をあわせる場合
            diffLv = depth - task.OutlineLevel
            For i = 1 To Abs(diffLv)
                If diffLv > 0 Then
                    Call task.OutlineIndent
                Else
                    Call task.OutlineOutdent
                End If
            Next i

タスクの削除

TaskオブジェクトのDeleteメソッドを用いる
全て削除する場合は下記のとおり

    Dim tsk As task
    Dim i As Long
    For i = ThisProject.tasks.Count To 1 Step -1
        prjObj.tasks.item(i).Delete
    Next

リソースの割り当て

TaskオブジェクトのResourceNamesプロパティまたはAssignmentsプロパティよりタスクにアサインしたリソースの追加を行なえる。

task.ResourceNames = "owner"

リソースID 212のリソースをタスクに割り当てる例

ActiveProject.Tasks(1).Assignments.Add ResourceID:=212

VBScriptでの実行例

"MSProject.Application"をCreateObjectすることで操作が可能になる。
その他はVBAと同様の使用方法となる。

以下の例は指定のプロジェクトの内容をテキストに書き込む例である。

UnpackFile "C:\\Documents and Settings\\All Users\\Documents\\prjSample.mpp", "TEST.txt", True, True

Function UnpackFile(fileSrc, fileDst, pbChanged, pSubcode)
    Dim fo
    Dim fso
    Dim mp
    Dim prj
    Dim targetPrj
    Dim cmp
    Dim tsk
    Dim pTsk
    Dim r

    Set targetPrj = Nothing

    Set fso = CreateObject("Scripting.FileSystemObject")
    Set fo = fso.CreateTextFile(fileDst, True, True)

    Set mp = CreateObject("MSProject.Application")
    mp.DisplayAlerts = False
    mp.AutomationSecurity  = 3 ' msoAutomationSecurityForceDisable
    mp.FileOpenEx fileSrc, True

    For Each prj In mp.Projects
        If prj.Name = fso.GetFileName(fileSrc) Then
            Set targetPrj = prj
            Exit For
        End If
    Next
    If targetPrj Is Nothing Then
        Exit Function
    End If

    fo.WriteLine fileSrc
    fo.WriteLine fileDst
    fo.WriteLine targetPrj.Name
    For Each tsk In targetPrj.tasks
        fo.WriteLine "TaskID:" & tsk.id
        fo.WriteLine "  Name:" & tsk.name
        fo.WriteLine "  OutlineLevel:" & tsk.OutlineLevel
        fo.WriteLine "  Notes:" & tsk.Notes
        fo.WriteLine "  Start:" & tsk.Start
        fo.WriteLine "  Finish:" & tsk.Finish
        fo.WriteLine "  PercentComplete:" & tsk.PercentComplete
        fo.WriteLine "  ActualStart:" & tsk.ActualStart
        fo.WriteLine "  ActualFinish:" & tsk.ActualFinish
        fo.WriteLine "  BaselineStart:" & tsk.BaselineStart
        fo.WriteLine "  BaselineFinish:" & tsk.BaselineFinish
        fo.WriteLine "  ResourceNames:" & tsk.ResourceNames
        fo.WriteLine "  Resources:"
        For Each r In tsk.Resources
            fo.WriteLine "    Resouce.Id :" & r.id
            fo.WriteLine "    Resouce.Name :" & r.name
        Next
        fo.WriteLine "  PredecessorTasks:"
        For Each pTsk In tsk.PredecessorTasks
            fo.WriteLine "    " & pTsk.id & "  " & pTsk.name
        Next
        ' Readonly
        fo.WriteLine "  OutlineChildren:"
        For Each pTsk In tsk.OutlineChildren
            fo.WriteLine "    " & pTsk.id & "  " & pTsk.name
        Next
    Next

    For Each cmp In targetPrj.VBProject.VBComponents
        fo.WriteLine "[CodeModule." & cmp.Name & "]"
        If cmp.CodeModule.CountOfLines > 0 Then
            fo.WriteLine cmp.CodeModule.Lines(1, cmp.CodeModule.CountOfLines)
        End If
        fo.WriteLine ""
    Next
    mp.Quit
    Set mp = Nothing
    Set prj = Nothing

    fo.Close
    Set fo = Nothing
    Set fso = Nothing

    pbChanged = True
    pSubcode = 0
    UnpackFile = True

End Function

応用例

TracのチケットからMsProjectのタスクをインポートする
http://needtec.exblog.jp/21472581/

WinMergeのMSProject用のプラグイン
https://github.com/mima3/MppToText

「MSProjectをVBScriptまたはVBAで操作する」への1件の返信

自称IT企業があまりにITを使わずに嫌になって野に下った俺が紹介するWindowsの自動化の方法 – へっぽこ実験ブログ へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 が付いている欄は必須項目です