PowerPoint自動化の極意:Excel台帳からファイルを「選別・抽出」する至高のワークフロー
こんにちは。自動化の深淵へようこそ。
「マクロの記録」ボタンを押すだけの世界から、ついに脱却する時が来ましたね。
業務で大量のプレゼン資料を扱う際、ファイルサーバーの海から必要なものだけをExcel台帳に基づいて抽出する……。この作業を手動でやれば数時間かかりますが、VBAを掌握したエンジニアなら、たった数秒の処理で終わらせます。
今回は、「FileSystemObject (FSO)」を駆使して、ExcelとPowerPointを横断するスマートな抽出システムを構築しましょう。
—
1. なぜ「FSO」を使うのか?
PowerPoint VBAの世界では、`Dir`関数を使うのが一般的ですが、大規模なファイル管理においてはFSO(FileSystemObject)一択です。
- なぜか?: FSOは「フォルダ」や「ファイル」をオブジェクトとして扱います。属性の判定、パスの結合、存在確認が極めて堅牢で、コードの可読性が段違いだからです。
—
2. システムの設計図(アルゴリズム)
今回の自動化プロセスは、以下の4ステップで構成します。
1. Excelの台帳を走査する: A列に並んだファイル名をループで読み込む。
2. ファイルの存在を確認: 指定フォルダ内に該当ファイルがあるかチェック。
3. コピーを実行: 該当すれば保存先フォルダへ複製する。
4. 例外処理: 「ファイルがない」場合のログ出力(エラー回避)。
—
3. 実践コード:ファイル抽出エンジン
以下のコードをExcelの標準モジュールに貼り付けてください。`Scripting.FileSystemObject`を使用するため、参照設定は不要(遅延バインディング)にしています。
Sub ExtractPowerPointFiles()
Dim fso As Object
Dim ws As Worksheet
Dim sourceFolder As String, destFolder As String
Dim fileName As String, fullPath As String
Dim lastRow As Long, i As Long
‘ 1. 設定:環境に合わせて書き換えてください
sourceFolder = “C:\Users\Target\Documents\Originals\”
destFolder = “C:\Users\Target\Documents\Archive\”
Set ws = ThisWorkbook.Sheets(“Sheet1”)
‘ FSOのインスタンス生成
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ 保存先フォルダがない場合は作成
If Not fso.FolderExists(destFolder) Then fso.CreateFolder (destFolder)
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
‘ 2. メインループ
For i = 2 To lastRow
fileName = ws.Cells(i, 1).Value ‘ A列にファイル名
fullPath = fso.BuildPath(sourceFolder, fileName)
‘ 3. ファイル存在確認とコピー
If fso.FileExists(fullPath) Then
‘ コピー実行(Trueは上書き許可)
fso.CopyFile fullPath, fso.BuildPath(destFolder, fileName), True
ws.Cells(i, 2).Value = “抽出成功”
Else
ws.Cells(i, 2).Value = “ファイル未発見”
End If
Next i
MsgBox “抽出作業が完了しました。”, vbInformation
End Sub
—
4. 陥りやすい罠と解決策
① ファイル名の「拡張子」問題
初心者が最も躓くのが、「Excelには`プレゼン資料`としか書いていないが、実際は`プレゼン資料.pptx`である」というケースです。
- 対策: コード内で `fileName & “.pptx”` と結合するか、台帳側に拡張子まで記載させるルールを徹底しましょう。
② パス区切り記号「\」の重複
`sourceFolder & “\” & fileName` と書くと、たまに `\\` になりエラーになります。
- 対策: 今回のコードで使用した `fso.BuildPath` メソッドを使いましょう。これがパス区切りを自動調整してくれる、プロの作法です。
③ プログラムの停止(フリーズ)
ファイル数が数万件ある場合、`DoEvents`を入れることでOSの応答停止を防げます。ループ内に一行書き足すだけで、エンジニアとしての配慮が光ります。
For i = 2 To lastRow
DoEvents ‘ OSに処理を戻す(画面固まり防止)
‘ … 以下処理 …
Next i
—
5. 次のステージへ向けて
このコードが動いた瞬間、あなたは単なる「Excelユーザー」から「自動化アーキテクト」へと進化しています。
ここからさらに発展させるなら:
- PDF一括変換: `Application.Presentations.Open` で開いて `SaveAs` メソッドを叩くことで、PDF化まで自動化できます。
- ログの記録: 抽出できなかったファイル名を別のログファイルに書き出す処理を追加する。
PowerPoint VBAは、単にスライドを作るためのものではありません。「情報を整理し、価値を再配布するツール」です。
まずはこのコードで、退屈なファイル整理から自分を解放してあげてください。何か詰まったら、いつでも戻ってきてくださいね。応援しています。
