【テクニカル・上級編】【初心者】特定のキーワードをファイル名に含むプレゼンテーションだけを別フォルダへ自動バックアップ保存する仕分けスクリプト – PowerPoint VBA解析バイブル

スポンサーリンク

【PowerPoint VBA極限最適化】キーワード合致ファイル自動バックアップ・アーキテクチャ

現場のデスクトップや共有サーバーの奥深くで、散逸していく膨大なプレゼンテーションファイル群。
「特定のプロジェクト名やバージョン情報をファイル名に含むものだけを抽出し、別のアーカイブ領域へ退避させたい」――この泥臭くもクリティカルな業務要求に対し、GUIの手作業で立ち向かうのはエンジニアの恥である。

今回は、単にファイルをコピーするだけの矮小なスクリプトではない。
ファイルシステム(FileSystemObject)の効率的走査、PowerPointの重厚長大なCOMオブジェクトライフサイクル、そして多重起動や例外発生時のメモリリークを完璧に支配する、シニアエンジニアのための実戦的VBAアーキテクチャをここに提示する。

—

1. アーキテクチャの設計思想と技術的課題

PowerPoint VBAを用いたファイル一括処理において、最大の見えない敵は「COMプロセスのゾンビ化」と「ファイルロックの競合」である。

  • FileSystemObject (FSO) の遅延バインディングと早期バインディングの選択

パフォーマンスを極限まで高めるため、ファイル走査には`Scripting.FileSystemObject`を採用する。

  • バックグラウンドサイレント処理

ファイルを「開いて保存し直す」アプローチを取る場合、PowerPointのGUI(ウィンドウ描画)が立ち上がると、処理速度が低下するだけでなく、フォーカス泥棒によるユーザーの業務妨害を引き起こす。これを`Visible = msoFalse`で完全に封殺する。

  • 堅牢なエラーハンドリング

ネットワークドライブの切断、ファイル破損、他者による排他ロックなど、ファイル操作の現場で起きる「あらゆる不確実性」に対し、トランザクション的なロールバック思考でコードを武装する。

—

2. 実装コード:一括ファイル仕分け・バックアップエンジン

以下のコードをPowerPointの標準モジュールに実装せよ。
定数定義領域(`Const`)を変更するだけで、任意の環境に即座に順応するスケーラビリティを持たせてある。

Option Explicit

‘ ==============================================================================
‘ 命名規則に基づくPowerPointファイル自動バックアップ・エンジン
‘ Architecture: Chief Architect Edition
‘ ==============================================================================

Public Sub ExecuteKeywordBackup()
‘ — 設定エリア(環境に合わせて書き換えてください) —
Const TARGET_KEYWORD As String = “【確定】” ‘ 検索するキーワード
Const SOURCE_DIR As String = “C:\Works\Presentations\” ‘ 走査元ディレクトリ(最後は必ず\)
Const BACKUP_DIR As String = “C:\Works\Archive\\” ‘ バックアップ先ディレクトリ
Const FILE_PATTERN As String = “.pptx” ‘ 対象拡張子
‘ —————————————————-

Dim fso As Object
Dim srcFolder As Object
Dim fileItem As Object

Dim pptApp As Object
Dim pptPres As Object

Dim processedCount As Long
Dim errorCount As Long

‘ 処理時間計測用
Dim startTime As Double
startTime = Timer

‘ 1. FileSystemObjectの生成(早期バインディングによるオーバーヘッド排除)
Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ 2. ディレクトリの存在確認
If Not fso.FolderExists(SOURCE_DIR) Then
MsgBox “走査元ディレクトリが存在しません: ” & SOURCE_DIR, vbCritical, “致命的エラー”
Exit Sub
End If

If Not fso.FolderExists(BACKUP_DIR) Then
fso.CreateFolder BACKUP_DIR
End If

‘ 3. PowerPointアプリケーションのインスタンス化(非表示・警告無効化)
‘ ※完全なバックグラウンド処理により、GUI描画コストとユーザー干渉を排除
On Error GoTo ErrorHandler
Set pptApp = CreateObject(“PowerPoint.Application”)
pptApp.Visible = msoFalse

Set srcFolder = fso.GetFolder(SOURCE_DIR)
processedCount = 0
errorCount = 0

‘ 4. フォルダ内の全ファイルを走査
For Each fileItem In srcFolder.Files
‘ 拡張子のチェックとキーワードの判定
If LCase(fso.GetExtensionName(fileItem.Name)) = “pptx” Or _
LCase(fso.GetExtensionName(fileItem.Name)) = “ppt” Then

If InStr(1, fileItem.Name, TARGET_KEYWORD, vbTextCompare) > 0 Then
On Error GoTo FileProcessError

‘ ファイルを開く(読み取り専用、ウィンドウ非表示)
‘ ReadOnly:=True にすることで、オリジナルファイルへのロック競合を防ぐ
Set pptPres = pptApp.Presentations.Open( _
Filename:=fileItem.Path, _
ReadOnly:=msoTrue, _
Untitled:=msoFalse, _
WithWindow:=msoFalse _
)

‘ 別名でバックアップ先へ保存
Dim destPath As String
destPath = BACKUP_DIR & fileItem.Name

‘ 同名ファイルが存在する場合は上書き(必要に応じてタイムスタンプ付与等に変更可能)
pptPres.SaveCopyAs destPath

‘ プレゼンテーションオブジェクトの閉塞(メモリ解放の第一歩)
pptPres.Close
Set pptPres = Nothing

processedCount = processedCount + 1
GoTo NextFile

FileProcessError:
‘ 個別ファイルの破損・ロックエラーを拾い、全体の停止を防ぐ
errorCount = errorCount + 1
If Not pptPres Is Nothing Then
pptPres.Close
Set pptPres = Nothing
End If
On Error GoTo ErrorHandler ‘ エラーハンドラを復帰
End If
End If
NextFile:
Next fileItem

‘ 5. 終了処理と結果レポート
MsgBox “バックアップ処理が完了しました。” & vbCrLf & _
“———————————-” & vbCrLf & _
“成功件数: ” & processedCount & ” 件” & vbCrLf & _
“スキップ/エラー: ” & errorCount & ” 件” & vbCrLf & _
“処理時間: ” & Format(Timer – Timer, “0.00”) & ” 秒”, _
vbInformation, “アーキテクチャ実行完了”

CleanUp:
‘ オブジェクトの明示的解放(メモリリークの完全防止)
On Error Resume Next
If Not pptPres Is Nothing Then pptPres.Close
If Not pptApp Is Nothing Then pptApp.Quit
Set pptPres = Nothing
Set pptApp = Nothing
Set srcFolder = Nothing
Set fso = Nothing
Exit Sub

ErrorHandler:
MsgBox “予期せぬシステムエラーが発生しました。” & vbCrLf & _
“Error # ” & Err.Number & “: ” & Err.Description, _
vbCritical, “Critical System Error”
Resume CleanUp
End Sub

—

3. チーフアーキテクトが解説するコードの急所

このスクリプトが一般的な「VBA入門サイトのコード」と一線を画す所以を、3つのレイヤーから解説する。

① `ReadOnly:=msoTrue` による排他制御の回避

多人数が同時アクセスするファイルサーバー環境において、PowerPointファイルを通常のモード(排他ロック)で開こうとすると、他のユーザーが編集中の場合にエラー(実行時エラー)となる。
ここでは `ReadOnly:=msoTrue` を明示的に指定することで、「他者が編集中であっても、最新のスナップショットを安全に安全にバックアップコピーする」という実務上極めて重要な要件を満たしている。

② COMオブジェクトのライフサイクル管理とゾンビプロセスの根絶

VBAで `CreateObject(“PowerPoint.Application”)` を実行すると、バックグラoundで隠しプロセスが生成される。もしスクリプトが途中でエラー落ちしたり、オブジェクトの解放(`Set = Nothing` および `.Quit`)を怠ると、タスクマネージャーの裏に「ゾンビプロセス」が残り続け、メモリを圧迫し続ける。
本コードでは、`CleanUp` ラベルを配置し、いかなる例外(`Error`)が発生しようとも必ずアプリケーションを終了させる鉄壁の構造を採用している。

③ インメモリ処理とUI描画の完全分離

`pptApp.Visible = msoFalse` および `WithWindow:=msoFalse` のコンビネーションにより、PowerPointのGUIレンダリングエンジンを完全にバイパスする。これにより、数十〜数百ファイルのバッチ処理であっても、CPUとメモリのリソースを最小限に抑え、圧倒的なスループットを実現している。

—

4. 拡張性とさらなる高みへ(システム間連携)

このスクリプトは、単体のマクロとして実行するだけでなく、Windowsの「タスクスケジューラ」と組み合わせることで真価を発揮する。
VBAを起動するためのVBScriptラッパーを用意し、毎夜深夜0時に自動実行させることで、人間が一切介在しない「完全自律型のドキュメント・アーカイブパイプライン」が完成する。

レガシーな技術と侮るなかれ。OSのプリミティブなAPIとCOMの挙動を熟知していれば、PowerPoint VBAは企業のナレッジ資産を守る最強の武器となる。
コードの海を統べる者よ、あなたのシステムにもこの厳格なアーキテクチャを導入せよ。

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