【入門編】【編集工数監査】”Presentation.BuiltInDocumentProperties”から「総編集時間(Total Editing Time)」を抽出し、プロジェクト進捗管理用のCSVログを自動生成するマクロ – PowerPoint VBA解析バイブル

スポンサーリンク

こんにちは!PowerPoint VBAの世界へようこそ。
マクロの記録ボタンを押して「動いたはいいけれど、中身が全然読めない……」と途方に暮れていませんか?

大丈夫、安心してください。今日ここでお話しする内容をクリアすれば、あなたも立派なPowerPoint VBAの使い手です。今日は、単なる自動化を超えて、「プレゼンテーションのメタデータ(裏側の情報)」を華麗に抽出し、プロジェクト管理に活かす実用的なスクリプトの作り方を、プロの視点を交えながら優しく紐解いていきます。

現場でそのまま使えるコードも用意していますので、ぜひ最後までついてきてくださいね。ここをクリアすれば、PowerPoint VBAの基本はバッチリですよ!

なぜ「総編集時間」を監査するのか?

プロジェクトが進むにつれ、こんな悩みを持ったことはありませんか?

  • 「この資料、一体どれだけの時間がかけられて作られたんだろう?」
  • 「最終的に誰が手を加えたのか、履歴をきれいに残したい」

実は、PowerPointファイル(`.pptx`)の心臓部には、ファイルを開いて編集していた時間が秒単位でこっそり記録されています。それが今回ターゲットにする「総編集時間(Total Editing Time)」です。

これをVBAで自動抽出し、CSVファイルとして吐き出す仕組みを作れば、チームの工数管理や、提出前のドキュメント監査が劇的に効率化されます。それでは、PowerPointを裏から操るオブジェクトモデルの基本から見ていきましょう!

PowerPointオブジェクトモデルの階層構造を理解する

VBAでPowerPointを操作する際、まず頭に入れておかなければならないのが「オブジェクトの階層構造(親子関係)」です。PowerPointの世界は、以下のようなピラミッド構造になっています。

[Application] (PowerPointアプリ全体)
└─ [Presentations] (開かれているプレゼンテーションの集合体)
└─ [Presentation] (特定のファイル・親)
├─ [BuiltInDocumentProperties] (ファイルが持つ内蔵プロパティ・メタデータ)
└─ [Slides] (スライドの集合体)
└─ [Slide] (特定のスライド)

今回の主役は、`Presentation` オぶジェクトのすぐ下にある `BuiltInDocumentProperties`(内蔵ドキュメントプロパティ) です。ここには、作成者、総編集時間、ページ数など、ファイルに関する重要なメタデータが詰まっています。

【実践】編集工数監査マクロの全コード

それでは、実際に動くコードを見てみましょう。
このマクロは、現在アクティブなプレゼンテーションファイルを対象に、メタデータを取得してデスクトップにCSVログとして出力するスクリプトです。

VBE(Visual Basic Editor)を開き、標準モジュールに以下のコードを貼り付けてください。

Option Explicit

‘ =====================================================================
‘ 処理名 : プレゼンテーション編集工数・メタデータ監査スクリプト
‘ 概要 : 総編集時間やスライド数等を抽出し、CSVログを自動生成する
‘ =====================================================================
Sub AuditPresentationMetadata()
Dim targetPres As Presentation
Dim propTotalTime As DocumentProperty
Dim propAuthor As DocumentProperty
Dim propLastAuthor As DocumentProperty

Dim editingMinutes As Long
Dim slideCount As Long
Dim fileName As String
Dim fileFullPath As String

Dim csvPath As String
Dim freeFileNum As Integer
Dim logData As String

‘ 1. アクティブなプレゼンテーションが存在するかチェック
If Application.Presentations.Count = 0 Then
MsgBox “監査対象となるプレゼンテーションが開かれていません。”, vbExclamation, “エラー”
Exit Sub
End If

Set targetPres = Application.ActivePresentation

‘ 2. 基本情報の取得
fileName = targetPres.Name
fileFullPath = targetPres.FullName
slideCount = targetPres.Slides.Count

On Error Resume Next ‘ プロパティが存在しない場合の予期せぬエラーを回避

‘ 総編集時間の取得(デフォルトでは「分」単位で格納されています)
Set propTotalTime = targetPres.BuiltInDocumentProperties(“Total Editing Time”)
If Not propTotalTime Is Nothing Then
editingMinutes = CLng(propTotalTime.Value)
Else
editingMinutes = 0
End If

‘ 作成者の取得
Set propAuthor = targetPres.BuiltInDocumentProperties(“Author”)
Dim authorName As String
If Not propAuthor Is Nothing Then authorName = propAuthor.Value Else authorName = “不明”

‘ 最終保存者の取得
Set propLastAuthor = targetPres.BuiltInDocumentProperties(“Last Author”)
Dim lastAuthorName As String
If Not propLastAuthor Is Nothing Then lastAuthorName = propLastAuthor.Value Else lastAuthorName = “不明”

On Error GoTo 0 ‘ エラー監視を元に戻す

‘ 3. CSV出力先パスの生成(ユーザーのデスクトップを指定)
csvPath = CreateObject(“WScript.Shell”).SpecialFolders(“Desktop”) & “\Presentation_Audit_Log.csv”

‘ 4. CSVファイルの書き込み処理(FileSystemObjectやOpen出力)
freeFileNum = FreeFile
Open csvPath For Append As #freeFileNum

‘ もしファイルが空なら、ヘッダー行を書き込む
If LOF(freeFileNum) = 0 Then
Print #freeFileNum, “抽出日時,ファイル名,総編集時間(分),スライド数,作成者,最終保存者,ファイルパス”
End If

‘ ログデータの組み立て
logData = Format(Now, “yyyy/mm/dd hh:nn:ss”) & “,” & _
“””” & fileName & “””,” & _
editingMinutes & “,” & _
slideCount & “,” & _
“””” & authorName & “””,” & _
“””” & lastAuthorName & “””,” & _
“””” & fileFullPath & “”””

‘ データの書き込み実行
Print #freeFileNum, logData
Close #freeFileNum

‘ 5. 完了メッセージ
MsgBox “監査ログの出力が完了しました!” & vbCrLf & _
“保存先: ” & csvPath, vbInformation, “監査完了”

End Sub

コードの注目ポイントと知見

初学者のあなたが「おっ」と思うような、実務で役立つテクニックがこのコードには詰まっています。いくつか重要なポイントを解説しますね。

① `BuiltInDocumentProperties` の罠と `On Error Resume Next`

ファイルのプロパティは、作成環境や保存状態によって、一部の項目が空(Null)であったり、取得時にエラーを吐くことがあります。
プロフェッショナルなコードでは、`On Error Resume Next` を意図的に使い、万が一プロパティが見つからなくてもマクロが強制終了しないような「防御的なプログラミング(ディフェンシブ・プログラミング)」を行います。

② 総編集時間の正体

`Total Editing Time` プロパティが返す値は、内部的に「分(Minutes)」です。
もしこれをより厳密に秒単位で扱いたい場合は注意が必要ですが、工数管理(何時間・何分費やしたか)であれば「分」単位で十分に実用に耐えうる精度を持っています。

③ デスクトップパスの動的取得

`CreateObject(“WScript.Shell”).SpecialFolders(“Desktop”)` という記述を使うことで、「誰がどのPCで実行しても、確実にそのユーザーのデスクトップにCSVを保存する」ことができます。ハードコーディング(`C:\Users\hoge\…` と直接書くこと)を避けるのは、エンジニアの基本マナーです。

陥りやすいエラーと対策

1. 「型が一致しません」というエラーが出る

  • 原因: プロパティがまだ一度も保存されていない新規ファイルなどの場合、値が空(Empty)であることが原因です。
  • 対策: 上記コードのように、オブジェクトが `Nothing` でないかをしっかりと判定するガード句を挟みましょう。

2. CSVの文字化け問題

  • 対策: Excelで直接CSVを開く際、ANSIエンコーディング(Shift-JIS等)でないと日本語が文字化けすることがあります。必要に応じて `ADODB.Stream` オブジェクト等を用いた文字コード制御を導入すると完璧です。

まとめ

今回は、PowerPoint VBAを使って「総編集時間」を抽出し、プロジェクト管理用のCSVログを自動生成する手法を解説しました。

単にスライドを自動で並べ替えるだけでなく、「ファイルのメタデータを監査する」という視点を持つことで、あなたのVBAスキルはワンランク上のステージへと引き上げられます。

「ここをこう変えたらもっと便利になるかな?」と試行錯誤するその過程こそが、エンジニアとしての最強の武器になります。ぜひ現場の業務効率化に役立ててくださいね!

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