現場で泣かないために:PowerPoint VBAで「ファイル名エラー」を根絶する技術
こんにちは。自動化の世界へようこそ。
マクロの記録で生成された「動くけれど脆いコード」から卒業しようとしているあなたへ、今日は現場の最前線で絶対に外せない「ファイル名バリデーション」の極意を伝授します。
PowerPointで自動保存処理を組む際、多くの人が直面するのが「保存時エラー」です。特にユーザーが入力したタイトルをそのままファイル名にする場合、「環境依存文字」や「Windowsの禁止文字」が含まれていると、プログラムは無慈悲に停止します。
今日は、この泥沼を回避し、堅牢なファイル管理を実現する「守りのコード」を一緒に作り上げましょう。
—
1. なぜ「ファイル名エラー」は起きるのか?
Windowsには、ファイル名として使ってはいけない「禁止文字」が定義されています。
- 禁止文字: `\ / : ? ” < > |`
- 環境依存文字: 記号や旧字体など、システムによっては文字化けやファイルシステム上の不整合を起こすもの。
これらを含んだ文字列を `Presentation.SaveAs` メソッドに渡すと、VBAはエラーを吐いて停止します。これを防ぐには、「保存直前に、文字列を完全に洗浄する」というプロセスが必須です。
—
2. 堅牢なファイル名を生成するロジック
今回作成するのは、「禁止文字を安全な記号(アンダースコアなど)に置換し、さらに制御不能な文字を排除する関数」です。
まずは以下のコードを標準モジュールに貼り付けてください。
‘ ==========================================================
‘ 【関数】ファイル名として安全な文字列へ変換する
‘ ==========================================================
Function GetSafeFileName(ByVal rawFileName As String) As String
Dim i As Long
Dim char As String
Dim result As String
Dim illegalChars As String
‘ Windowsの禁止文字を定義
illegalChars = “\/:?””<>|”
result = rawFileName
‘ 1. 禁止文字をアンダースコアに置換
For i = 1 To Len(illegalChars)
result = Replace(result, Mid(illegalChars, i, 1), “_”)
Next i
‘ 2. 空白を詰める(任意:パスのトラブルを減らすため)
result = Trim(result)
‘ 3. 長すぎるファイル名対策(Windowsの制限はパス含め260文字)
If Len(result) > 100 Then
result = Left(result, 100)
End If
GetSafeFileName = result
End Function
‘ ==========================================================
‘ 【メイン】プレゼンテーションを安全に保存するプロシージャ
‘ ==========================================================
Sub SavePresentationSafely()
Dim ppt As Presentation
Dim rawTitle As String
Dim safeName As String
Dim savePath As String
Set ppt = ActivePresentation
‘ ユーザー入力やスライド上のタイトルを想定
rawTitle = “【2023年度】プロジェクト・計画/予算案?”
‘ 文字列を洗浄
safeName = GetSafeFileName(rawTitle)
‘ 保存先のフルパスを作成
savePath = Environ(“USERPROFILE”) & “\Desktop\” & safeName & “.pptx”
‘ 保存実行
On Error Resume Next ‘ 万が一の時の保険
ppt.SaveAs Filename:=savePath, FileFormat:=ppSaveAsOpenXMLPresentation
If Err.Number <> 0 Then
MsgBox “保存に失敗しました:” & Err.Description, vbCritical
Else
MsgBox “保存成功:” & savePath, vbInformation
End If
On Error GoTo 0
End Sub
—
3. コードの解説:ここがプロのポイント
このコードには、現場で生き残るための「3つのこだわり」があります。
1. 関数の分離(関心の分離):
バリデーションロジックを独立した `Function` にしています。これにより、他のプログラムからでも「この文字列をファイル名にできる?」と問い合わせるだけで済むようになります。
2. `Environ(“USERPROFILE”)` の活用:
`C:\Users\Name\…` と決め打ちするのではなく、実行ユーザーの環境変数からデスクトップを取得しています。これで、誰のPCでも動くコードになります。
3. `On Error Resume Next` の使いどころ:
「エラーを無視する」のは悪手ですが、「保存処理のような外部要因に左右される処理」の直前でエラーを補足し、自前で `MsgBox` を出すのは「親切な設計」です。
—
4. 次のステップへ
ここをクリアしたあなたは、もう「マクロの記録」をただ貼り付けるだけの初心者ではありません。「実行環境の揺らぎ」を想定してコードを書くという、エンジニアの第一歩を踏み出しました。
次は、「複数のプレゼンテーションを一括でPDF化する」際に、この `GetSafeFileName` を活用してみてください。フォルダ内の全ファイルをループ処理する際、このバリデーションがあなたのプログラムを止めることなく、徹夜作業を回避させてくれるはずです。
PowerPoint VBAは、あなたの手足となり、無限の生産性を生み出す強力な武器です。ぜひ、この「守りのコード」をあなたのライブラリに加えてくださいね。
それでは、また次の自動化でお会いしましょう!
