【実務・中級編】【中級者】Excelの管理台帳(ファイル名リスト)を読み込み、指定フォルダから該当するPPTXファイルだけを抽出して特定フォルダにコピー・保存する連携マクロ – PowerPoint VBA解析バイブル

スポンサーリンク

現場のエンジニアへ:ExcelとPowerPointの「ファイル管理」を自動化する極意

業務現場で散乱する数千のプレゼンテーションファイル。それを「Excelの台帳を元に、必要なものだけを抽出して整理する」というタスクは、一見単純ですが、実は「パスの不整合」「ファイルロック」「権限エラー」という罠に満ちています。

巷のチュートリアルにあるような、とりあえず動くコードを書いて満足していませんか?
本稿では、数万ファイルの処理にも耐えうる、堅牢で保守性の高いアーキテクチャを伝授します。

—

1. なぜ「手作業」や「適当なスクリプト」が失敗するのか

多くの人が犯すミスは、FSO(FileSystemObject)を過信し、エラーハンドリングを怠ることです。
実務環境では以下の事象が必ず発生します。

  • パスの文字数制限: 260文字を超えたパスはWindows APIの制約でエラーになる。
  • ファイルロック: 誰かが開いているファイルや、ネットワークドライブの遅延によるタイムアウト。
  • 台帳の不整合: Excel上のファイル名と実ファイル名が微妙に異なる(空白や全角半角)。

これらを解決するのは、コードの行数ではなく「防御的設計」です。

—

2. 実装の要諦:FileSystemObjectを極める

効率的なファイル操作の核心は、インスタンスの再利用と、パスの正規化にあります。以下のプロダクションコードは、そのまま業務に組み込める設計です。

抽出・コピー用VBAコード

Option Explicit

‘ 必要な参照設定: Microsoft Scripting Runtime
‘ 役割: Excel台帳を読み込み、指定フォルダからファイルを抽出する
Public Sub ExtractPresentations()
Dim fso As Object: Set fso = CreateObject(“Scripting.FileSystemObject”)
Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets(“管理台帳”)
Dim sourceFolder As String: sourceFolder = “C:\Source\Presentations\”
Dim targetFolder As String: targetFolder = “C:\Target\Extracted\”
Dim lastRow As Long, i As Long
Dim fileName As String, sourcePath As String, targetPath As String

‘ 1. ターゲットディレクトリの生存確認
If Not fso.FolderExists(targetFolder) Then
fso.CreateFolder (targetFolder)
End If

lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

‘ 2. メインループ:パス操作はエラーハンドリングが必須
For i = 2 To lastRow
fileName = Trim(ws.Cells(i, 1).Value) ‘ 余計な空白を除去
sourcePath = fso.BuildPath(sourceFolder, fileName)
targetPath = fso.BuildPath(targetFolder, fileName)

On Error Resume Next
If fso.FileExists(sourcePath) Then
‘ 上書きコピー(True)を実行。必要に応じて属性チェックを追加すること
fso.CopyFile sourcePath, targetPath, True
ws.Cells(i, 2).Value = “成功”
Else
ws.Cells(i, 2).Value = “ファイル不在”
End If

If Err.Number <> 0 Then
ws.Cells(i, 2).Value = “エラー: ” & Err.Description
Err.Clear
End If
On Error GoTo 0
Next i

MsgBox “抽出処理が完了しました。”, vbInformation
End Sub

—

3. アーキテクトとしてのアドバイス:設計の落とし穴

① パスの正規化を忘れない

`BuildPath`メソッドを使ってください。「& “\” &」でパスを連結すると、フォルダの区切り文字が重複するバグを招きます。`BuildPath`はOSレベルで安全な連結を行ってくれるため、パス生成の標準です。

② ファイル名の一致判定を甘く見ない

Excel台帳上の「Report_01.pptx」と実ファイルの「Report_01 .pptx」は、プログラムから見れば別物です。実運用では、台帳の読み込み時に `Trim()` をかけるだけでなく、可能であれば正規表現を用いて「ファイル名に特定のIDが含まれているか」で判定するロジックに昇華させるべきです。

③ ログを残すという「規律」

上記のコードでは、Excelの2列目に「成功」「エラー」を書き込んでいます。これは非常に重要です。「何が起きたか」をユーザーが即座に確認できることこそが、メンテナンスコストを劇的に下げるツールUIの基本です。

—

4. 次のステップ:さらなる効率化へ

もし貴方が数千件以上のファイルを扱うなら、以下の実装を検討してください。

  • 非同期処理の検討: ファイルコピー中にUIが固まるのを防ぐため、`DoEvents`をループに適宜挿入する。
  • 並列化: 同期処理で時間がかかる場合は、VBA単体ではなくPowerShellとの連携を検討する。PowerShellの `Copy-Item` はVBAの `FSO` よりもオーバーヘッドが小さく、大規模なファイル操作には向いています。

最後に

自動化は「書くこと」よりも「壊れないようにすること」が9割です。今回紹介したコードは、あくまで「壊れないための土台」に過ぎません。皆さんの現場のルールに合わせて、エラーハンドリングをさらに厚く(例えば、コピー先がいっぱいになった場合など)強化していってください。

それが、真の業務自動化エンジニアの歩む道です。

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