【入門編】【初心者向け】Predecessorsプロパティの文字列操作:Excelの先行タスクIDをProject形式に変換するコツ – Project VBA解析バイブル

スポンサーリンク

こんにちは!Microsoft ProjectのVBAの世界へようこそ。
マクロの記録から一歩踏み出し、「自分の手でプロジェクトを自在にコントロールしたい」と願うあなたにとって、今日は記念すべき第一歩となる日です。

ここをクリアすれば、Project VBAの基本はバッチリですよ!一緒に楽しくマスターしていきましょう。

—

なぜ「先行タスクの設定」で初心者はつまずくのか?

Excelで管理していたタスク一覧を、Microsoft Project(以下、Project)へ移行する自動化ツールを作ろうとしたとき、誰もが最初に直面するのが「先行タスク(Predecessors)」の壁です。

Excelのセルには、こんな風にカンマ区切りでタスク番号が入力されていますよね。

  • Excel上の表示: `1, 2, 3` (タスク1、2、3が完了したらこのタスクが始まるよ、という意味)

これをそのままProjectのVBAで、`Task.Predecessors = “1,2,3”` と代入したことはありませんか?
実行した瞬間に、Projectから冷酷なエラーメッセージが突きつけられたはずです。

> 「入力された値が正しくありません」

実は、Projectが理解する先行タスクの文字列のフォーマットは、Excelの素朴なカンマ区切りとは少し違うのです。ここを正しく変換してあげるのが、今回のテーマ「文字列操作のコツ」です。

—

Projectが本当に理解している「言葉」を知ろう

Projectの内部エンジンは、私たちが画面で見ている「行番号(ID)」ではなく、タスク固有の「ユニークID(UniqueID)」や、独自の依存関係構文を裏で処理しています。

VBAから `Predecessors` プロパティに文字列を渡すとき、Projectは標準でセミコロン(`;`)を区切り文字として要求します。さらに、タスク間の関係性(終了-開始など)を明示しない場合、Projectはデフォルトのルールに従いますが、安全に渡すためには少し整形してあげるのがプロの作法です。

基本の変換ルール

1. 区切り文字の変換: Excelのカンマ(`,`)を、Projectが好むセミコロン(`;`)に置き換える。
2. 空白の除去: ユーザーが入力した余計なスペースを取り除く。

たったこれだけのことですが、これをVBAのコードでスマートに実行できるようにしましょう。

—

実践!Excelの文字列をProject形式に変換するVBAコード

それでは、開発の現場でそのままコピペして使える実用的なプロシージャを公開します。
今回は、Excelからデータを読み込むシーンを想定し、文字列を安全に変換してProjectのタスクに設定するコードです。

Sub SetPredecessorsSafely()
Dim tsk As Task
Dim rawExcelString As String
Dim convertedString As String

‘ 【前提】サンプルとして、現在選択しているタスクを対象にします
If ActiveSelection.Tasks.Count = 0 Then
MsgBox “タスクを選択してください。”, vbExclamation
Exit Sub
End If

Set tsk = ActiveSelection.Tasks(1)

‘ 【ステップ1】Excelのセルから取得したと仮定する文字列
‘ 例:「 1, 2, 3 」のように、スペースやカンマが混ざっているカオスな状態
rawExcelString = “1, 2, 3”

‘ 【ステップ2】文字列の整形(カンマをセミコロンへ、余計なスペースを削除)
‘ ① まずカンマ(,)をセミコロン(;)に置き換える
convertedString = Replace(rawExcelString, “,”, “;”)

‘ ② ついでに半角スペースや全角スペースが含まれていれば削除しておく
convertedString = Replace(convertedString, ” “, “”)

‘ 【ステップ3】Projectのタスクに代入!
On Error GoTo ErrorHandler
tsk.Predecessors = convertedString

MsgBox “先行タスクの設定に成功しました!” & vbCrLf & _
“変換後の文字列: ” & convertedString, vbInformation
Exit Sub

ErrorHandler:
‘ 万が一エラーが出た場合の優しいうけたまわり
MsgBox “エラーが発生しました。タスクIDが存在するか確認してください。” & vbCrLf & _
“詳細: ” & Err.Description, vbCritical
End Sub

コードのここがポイント!

  • `Replace関数`の二段活用: Excelユーザーは自由気ままにスペースを入れる生き物です(笑)。`Replace(…, “,”, “;”)` で区切り文字を変えたあと、さらに `Replace(…, ” “, “”)` で空白を消去するのが、実務で絶対に外せない鉄則です。
  • エラーハンドリング (`On Error GoTo`): 存在しないタスクID(例えば、全10件しかないのに「99」を指定するなど)が渡された場合、容赦なくエラーが起きます。現場のツールでは、このようにエラーをトラップしてあげるのがエンジニアの優しさです。

—

陥りやすい罠:IDとUniqueIDの勘違い

ここで、さらにステップアップしたいあなたへ、シニアエンジニアからのワンポイントアドバイスです。

プロジェクト内でタスクを追加・削除すると、画面左端に見える「ID(行番号)」はズレていきますよね。例えば、タスクID 2 を削除すると、下にあったタスクID 3 は自動的にタスクID 2 に繰り上がります。

もしあなたが「Excelに記録した古いID」をそのまま渡してしまうと、意図とは全く違うタスクが先行タスクに設定されてしまいます。

  • 堅牢性を高めるアプローチ:

本格的なWBS自動化ツールを作る際は、行番号である `ID` ではなく、タスクが生成された瞬間に決まる不変の識別子 `UniqueID` をベースに制御することを検討してみてください。
(※ただし、今回解説した `Predecessors` プロパティへの文字列代入においては、標準的なIDベースの文字列指定でも、初回作成時であれば十分に機能します!)

—

まとめ

お疲れ様でした!本日の重要なポイントを振り返りましょう。

1. Excelのカンマ区切り(`,`)はそのままではProjectでエラーになる。
2. Project形式の基本はセミコロン区切り(`;`)。
3. `Replace`関数を使って、カンマの変換とスペースの除去をセットで行うのが安全なコードのコツ。

この文字列操作のテクニックさえ押さえておけば、Excelで管理された膨大なWBSを、ボタン一つでMicrosoft Projectへ美しくインポートするマクロが作れるようになります。

「マクロの記録」の枠を飛び出し、自分の手でロジックを組み立てる爽快感は格別です。
ぜひあなたのプロジェクトでも試してみてくださいね。次回の解説もお楽しみに!

タイトルとURLをコピーしました