【PowerPoint VBA】Application.Runで実現する「疎結合」な共通ロジック管理:保守性を極限まで高める設計論
現場の業務自動化において、最もやってはいけないのが「コードのコピー&ペーストによる複製」です。各プレゼンテーションファイルに同じマクロを埋め込むのは、数ヶ月後の修正地獄を約束するようなもの。
「共通処理を修正したら、関係するファイル全てを更新しなければならない」。この負の連鎖を断ち切り、一つのマスターファイルで全プレゼンテーションを統制する「コンポーネント指向アーキテクチャ」を構築しましょう。その核となるのが `Application.Run` です。
—
1. なぜ「外部参照」ではなく「Application.Run」なのか
VBAで別ファイルのコードを呼び出す手法には、プロジェクト参照設定(参照設定)がありますが、これには大きなリスクが伴います。
- 参照の欠落: ファイルの移動やパス変更でプロジェクトが壊れる。
- バージョンの不整合: 開発環境と実行環境の依存関係が複雑化する。
対して `Application.Run` は、「名前さえ知っていれば、いつでもどこからでも実行できる」という動的な呼び出しを可能にします。インターフェースを固定し、内部実装を切り離す。これこそが、大規模な業務自動化における正解です。
—
2. 実装アーキテクチャ:マスターとクライアントの分離
今回の構成は以下の通りです。
1. Library.pptm(マスター): 共通関数を保持するライブラリ。
2. Client.pptm(クライアント): `Application.Run` でマスターを呼び出す実行側。
【Library.pptm】(共通ロジック側)
まずは、呼び出される側のコードです。必ず `Public` プロシージャとして定義してください。
‘ Library.pptm の標準モジュール「LibCommon」に記述
Public Function FormatSlideTitle(ByVal targetSlide As Slide, ByVal titleText As String) As Boolean
On Error GoTo ErrorHandler
‘ ここで共通の処理(フォント設定、位置調整など)を一元管理
With targetSlide.Shapes.Title.TextFrame.TextRange
.Text = titleText
.Font.Name = “Meiryo UI”
.Font.Size = 24
End With
FormatSlideTitle = True
Exit Function
ErrorHandler:
FormatSlideTitle = False
Debug.Print “Error in FormatSlideTitle: ” & Err.Description
End Function
—
【Client.pptm】(実行側:呼び出しの要)
次に、実行側の実装です。`Application.Run` は `ファイル名!モジュール名.関数名` の形式で呼び出します。
Sub ExecuteCommonLogic()
Dim libPath As String
Dim targetFile As String
‘ 1. ライブラリファイルのパスを定義(環境に応じて可変にすること)
libPath = ThisPresentation.Path & “\Library.pptm”
targetFile = “Library.pptm”
‘ 2. ライブラリが開かれているか確認(開いていなければ開く)
If Not IsWorkbookOpen(targetFile) Then
Presentations.Open FileName:=libPath, ReadOnly:=True
End If
‘ 3. Application.Runによる動的連携
‘ 戻り値を受け取る場合はCallではなく関数として呼び出す
Dim isSuccess As Boolean
isSuccess = Application.Run(targetFile & “!LibCommon.FormatSlideTitle”, _
ActiveWindow.View.Slide, “自動生成されたタイトル”)
If isSuccess Then
MsgBox “処理が完了しました。”
Else
MsgBox “エラーが発生しました。”
End If
End Sub
‘ 補助関数:ファイルが開かれているかチェック
Private Function IsWorkbookOpen(fileName As String) As Boolean
Dim p As Presentation
For Each p In Presentations
If p.Name = fileName Then IsWorkbookOpen = True: Exit Function
Next
End Function
—
3. 現場で生き残るための「鉄則」
① パスの動的解決
ハードコーディングされたパスは即座に崩壊します。`ThisPresentation.Path` を活用し、ライブラリファイルとクライアントファイルは同じフォルダ(または決まった共有フォルダ)に配置するルールを徹底してください。
② 引数の型チェックを厳格に
`Application.Run` は呼び出し時に型チェックが行われません。引数が期待値と異なると実行時エラーになります。`Public` 関数側の引数は、可能な限り `Object` ではなく `Slide` や `String` などの具体的な型を指定してください。
③ エラーハンドリングの委譲
呼び出される側のライブラリで必ず `Err` を拾い、呼び出し元に `Boolean` や `Long` 型のステータスコードを返す設計にしてください。呼び出し側が「何が起きたか」を把握できないのは、自動化における最大の罪です。
—
最後に:なぜこれを行うのか
もしあなたが、50個のプレゼンテーションファイルを抱えていて、その全てに「タイトルのフォントを一括で変えたい」という要望が来た時、コピー&ペーストされたコードでは50回の修正が必要です。
しかし、この設計であれば Library.pptm を一度書き換えるだけ で済みます。
自動化エンジニアの価値は「コードを書くこと」ではなく、「変更に強いインフラを構築すること」にあります。この `Application.Run` を使った疎結合なアーキテクチャこそが、あなたの自動化ツールを「使い捨てのおもちゃ」から「堅牢な業務資産」へと昇華させるのです。
さあ、今すぐバラバラになったコードを整理し、一元管理の旅へ出ましょう。
