PowerPoint VBAの「クロスプラットフォーム地獄」を制する:環境差異を透過させるアーキテクチャ設計
業務自動化の現場で最も避けるべきは、「自分のPCでは動くが、他人のPCでは落ちる」という悪夢だ。特にPowerPoint VBAにおけるWindowsとMacの乖離、そしてOffice 32bit/64bitの混在は、多くのエンジニアを挫折させてきた。
今日は、場当たり的な `On Error Resume Next` で汚染されたコードに別れを告げ、環境依存性を隠蔽するラッパー設計を伝授する。これが「プロ」と「アマ」を分かつ境界線だ。
—
1. なぜ「条件分岐の埋め込み」は失敗するのか
多くの開発者は、処理の直前で `If Application.OperatingSystem Like “Mac” Then` といった判定を繰り返す。これは保守性を著しく低下させる。ビジネスロジックと環境制御が密結合になり、コードがスパゲッティ化するからだ。
解は「抽象化層(Abstraction Layer)」の構築にある。
APIの差異を吸収する専用モジュールを一枚噛ませることで、メインロジックはOSの存在を意識せずに記述できるようになる。
—
2. 環境検知と抽象化のプロダクションコード
まずは、現在の環境をスマートに特定し、APIの差異を吸収する「EnvironmentManager」クラス(またはモジュール)を設計する。
‘ ———————————————————
‘ Module: EnvironmentManager
‘ 役割: OS/環境差異を隠蔽し、メインロジックへ標準化されたAPIを提供する
‘ ———————————————————
Option Explicit
If Mac Then
Private Const IS_MAC As Boolean = True
Else
Private Const IS_MAC As Boolean = False
End If
‘ 環境判定用のプロパティ(読み取り専用)
Public Property Get IsMac() As Boolean
IsMac = IS_MAC
End Property
‘ パス区切り文字の抽象化(OSごとの違いを吸収)
Public Function GetPathSeparator() As String
If IS_MAC Then
GetPathSeparator = “/”
Else
GetPathSeparator = “\”
End If
End Function
‘ ファイル存在確認のラッパー(Dir関数はMacで挙動が異なる場合があるため)
Public Function FileExists(ByVal path As String) As Boolean
‘ Macの場合、Dir関数ではなくAppleScript等を介すのが堅牢だが、
‘ 簡易的には以下のように実装。必要に応じて条件分岐を拡張する
On Error Resume Next
FileExists = (Dir(path) <> “”)
On Error GoTo 0
End Function
—
3. 「SafeAPI」パターンの実装
次に、OSの違いで呼び出し方が変わるAPI(例:ファイルパス取得やダイアログ)を、このラッパー経由で叩く。これにより、メインコードは驚くほどクリーンになる。
‘ ———————————————————
‘ 実務での活用例:メインロジック側
‘ ———————————————————
Sub ExportPresentation()
Dim env As New EnvironmentManager
Dim savePath As String
‘ OSを意識せず、抽象化された関数を呼ぶだけ
savePath = ActivePresentation.Path & env.GetPathSeparator() & “Output.pptx”
‘ Windows/Mac両対応の堅牢な保存処理
On Error GoTo ErrorHandler
ActivePresentation.SaveCopyAs savePath
MsgBox “保存完了: ” & savePath
Exit Sub
ErrorHandler:
MsgBox “致命的なエラー: ” & Err.Description, vbCritical
End Sub
—
4. 現場で生き残るための「3つの鉄則」
① `#If…#End If` (条件付きコンパイル)を極めろ
実行時に `If` 文で判定するよりも、コンパイル時に不要なコードを排除する `#If` を使うべきだ。特にWindows専用のWin32 APIを呼び出す際、Mac環境でコンパイルを通すには必須となる。
② 64bit/32bitの「PtrSafe」宣言を忘れるな
モダンなOffice環境では `PtrSafe` 属性が必須だ。これを怠れば、64bit版Excel/PowerPointで即座にクラッシュする。
If VBA7 Then
‘ 64bit版対応の宣言
Declare PtrSafe Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As LongPtr)
Else
‘ 旧32bit版用
Declare Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As Long)
End If
③ ファイルパスの「連結」は自作関数で制御せよ
`”C:\Users\” & name & “\” & file` という書き方は今すぐやめろ。前述の `GetPathSeparator` を使い、パス結合を専用メソッドに集約させるだけで、環境依存バグの9割は撲滅できる。
—
最後に:エンジニアとしてのマインドセット
自動化ツールは「作って終わり」ではない。あなたが去った後、別の担当者が保守する未来を想像しろ。
環境差異を個別の条件分岐で埋め尽くされたコードは、「技術的負債」の山でしかない。
OSやOfficeのバージョンが変わるたびに修正が必要なコードを書くのは、エンジニアの仕事ではない。「環境の変化を吸収する構造」を設計することこそが、我々アーキテクトの仕事だ。
このラッパー設計をベースに、君自身の「最強の基盤ライブラリ」を構築してほしい。それが業務自動化の泥沼から脱出する唯一の道だ。
