PowerPoint VBAを掌握する:ファイル名から拡張子を安全に剥ぎ取る「文字列操作」の極意
こんにちは!今日もVBAの世界へようこそ。あなたの自動化ライフを支える頼れる先輩エンジニアです。
PowerPointでの資料作成、毎日お疲れ様です。スライドが完成した後、「PDFとしてエクスポートする」「特定のスライドを画像(PNG/JPEG)として書き出す」といった作業を、ボタン一つで自動化できたら本当に素敵だと思いませんか?
その自動化プログラム(マクロ)を書くとき、必ず最初にぶつかる壁があります。それが「出力するファイルの名前をどう決めるか」という問題です。
元々のファイル名が `月期決算報告書.pptx` だったとしましょう。
これをそのまま使って `月期決算報告書.pptx.pdf` という不格好な名前で保存されてしまったり、あるいはピリオドの位置を正しく計算できずにエラーで止まってしまったり……。
「マクロの記録」から一歩踏み出し、実務でガシガシ使えるプロのコードを書くためには、ファイル名から拡張子(`.pptx` や `.pptm`)を安全に剥ぎ取り、新しい接尾辞(`_マクロ出力` など)を綺麗に結合するテクニックが欠かせません。
今回は、この「文字列操作の基本にして極意」を、初心者の方に向けてどこよりも丁寧に、かつ実務で絶対にバグを出さないプロの視点を交えて解説します。ここをクリアすれば、PowerPoint VBAの基本はバッチリですよ!
—
1. なぜ単純な「置換(Replace)」ではダメなのか?
初学者の段階で誰もが思いつくのが、VBAの `Replace` 関数を使って「`.pptx` を空文字 `””` に置き換える」という方法です。
‘ ⚠️ 実務でやってはいけない危険な例
Dim baseName As String
baseName = Replace(ActivePresentation.Name, “.pptx”, “”)
一見すると、これで上手くいきそうに見えますよね。しかし、ここには実務の現場で牙を剥く「3つの罠」が隠されています。
罠①:マクロ有効プレゼンテーション(.pptm)に対応できない
マクロを実行しているファイル自体が `.pptm` だった場合、`.pptx` を消そうとしても一致しないため、拡張子が残ってしまいます。
罠②:ファイル名自体に「.pptx」が含まれていた場合に崩壊する
例えば、冗談のような話ですが、`2026.pptx_修正版.pptx` のようなファイル名が存在した場合、Replaceを使うと `2026_修正版` になってほしいところが `2026_修正版.pptx`(途中の文字が消える、あるいは意図しない消え方をする)といった奇妙な挙動を引き起こします。
罠③:ピリオドが複数あるファイル名に対応できない
実務では `Project_v1.5_Draft.pptx` のように、バージョン管理のためにファイル名の中にピリオド `.` を複数使うことがよくあります。
—
2. 解決策:後ろからピリオドを探す「InStrRev」の魔法
これらの問題をエレガントに、かつ100%安全に解決するために、私たちは「一番右側にあるピリオドの位置を特定し、そこから左側の文字だけを切り出す」というアプローチを取ります。
ここで活躍するのが、以下の3つの関数です。
| 関数名 | 役割 |
| :— | :— |
| `InStrRev` | 文字列を後ろ(右)から検索し、指定した文字(今回は `.`)が何番目にあるかを探す。 |
| `Left` | 文字列の左端から、指定した文字数だけを切り出す。 |
| `Len` | 文字列全体の長さを文字数で返す。 |
図解すると、以下のようなイメージです。
ファイル名: [ P ] [ r ] [ o ] [ j ] [ e ] [ c ] [ t ] [ . ] [ v ] [ 1 ] [ . ] [ p ] [ p ] [ t ] [ x ]
文字の位置: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
↑
InStrRevが探し出す
「最後のピリオド」の位置 (11)
切り出し範囲: [========= Left関数で左から10文字分を切り出す =========]
結果: “Project.v1” (安全に拡張子だけが消去された!)
どれだけファイル名の中にピリオドが含まれていようと、「拡張子の直前のピリオドが一番最後(右側)にある」というルールは絶対に変わりません。だからこそ、後ろから探す `InStrRev`(In-String Reverse)が最強の武器になるのです。
—
3. 【完全版】安全に拡張子を除去してPDF保存するVBAコード
それでは、実務でそのままコピペして使える、極めて堅牢なコードを紹介します。
このコードには、「まだ一度も保存されていない新規プレゼンテーション(拡張子がない状態)で実行された場合」のバグ回避処理(エラーハンドリング)も組み込んであります。
Sub ExportAsPDFWithSafeName()
Dim targetPres As Presentation
Set targetPres = ActivePresentation
‘ 1. プレゼンテーションが一度も保存されていない場合の対策
If targetPres.Path = “” Then
MsgBox “このプレゼンテーションはまだ保存されていません。” & vbCrLf & _
“一度名前を付けて保存してから実行してください。”, vbExclamation, “実行キャンセル”
Exit Sub
End If
Dim originalName As String
originalName = targetPres.Name
‘ 2. 右から数えて最初のピリオド「.」の位置を検索
Dim dotPosition As Long
dotPosition = InStrRev(originalName, “.”)
‘ 3. 安全にファイル名(拡張子なし)を切り出す
Dim baseName As String
If dotPosition > 0 Then
‘ ピリオドが見つかった場合、その左側をすべて取得
baseName = Left(originalName, dotPosition – 1)
Else
‘ 万が一ピリオドがない場合は、そのままの名前を使用
baseName = originalName
End If
‘ 4. 新しいファイル名の整形(接尾辞の付与)
Dim newFileName As String
newFileName = baseName & “_マクロ出力.pdf”
‘ 5. 保存先フォルダの決定(元のファイルと同じフォルダ)
Dim savePath As String
savePath = targetPres.Path & “\” & newFileName
‘ 6. PDFとしてエクスポート実行
On Error GoTo ErrorHandler
targetPres.SaveAs savePath, ppSaveAsPDF
MsgBox “PDFを安全に出力しました!” & vbCrLf & savePath, vbInformation, “成功”
Exit Sub
ErrorHandler:
MsgBox “エラーが発生しました。ファイルが開いたままになっていないか確認してください。” & vbCrLf & _
“エラー内容: ” & Err.Description, vbCritical, “エラー”
End Sub
—
4. プロが解説!コードの重要ポイント
このコードが「マクロの記録」レベルとどう違うのか、先輩として特に意識してほしいポイントを3つに絞って解説します。
① `targetPres.Path = “”` による未保存チェック
PowerPointを起動した直後の `プレゼンテーション1` の状態では、ファイルはメモリ上にしか存在せず、ハードディスク上のどこにも保存されていません。当然、拡張子もありません。
この状態でプログラムを動かすと、保存先パス(`Path`)が空っぽになり、最後の保存処理で必ず100%エラーになります。これを入り口で優しくシャットアウトするのが、プロの気遣いです。
② `InStrRev(originalName, “.”)` の美しさ
この1行で、右側から検索して最初に見つかったピリオドの位置(数値)を返してくれます。
`Project_v1.5.pptx` であれば、`.pptx` の直前のピリオドの位置である `12` が取得できます。
③ `Left(originalName, dotPosition – 1)` の引き算
ピリオドの位置が `12` だとしたら、私たちが欲しいのはその手前の `11` 文字目までです。そのため、`dotPosition – 1` を指定して、ピリオドそのものを含めずに左側を切り取っています。この「`- 1`」を忘れると、`Project_v1.5.` という風に末尾にピリオドが残ってしまうので注意してくださいね。
—
まとめ:文字列操作を制する者は、VBA自動化を制する
お疲れ様でした!
今回学んだ「右からピリオドを探して切り出す」というテクニックは、PowerPoint VBAだけでなく、ExcelやWord、さらにはAccessや他のプログラミング言語(PythonやC#など)でも全く同じ考え方が使える「一生モノの超重要スキル」です。
文字列を思い通りに操れるようになると、
- 「スライドごとのタイトルをファイル名にして、ページごとにPNG画像で書き出す」
- 「日付や部署名を自動でファイル名に付与して、特定のフォルダに仕分ける」
といった、高度で実用的な業務効率化ツールが自由自在に作れるようになります。
まずは今回のコードを標準モジュールにコピペして、お手持ちのファイルで動かしてみてください。思った通りに「`〇〇_マクロ出力.pdf`」が出来上がったときの感動を、ぜひ味わってくださいね。
もし途中で分からないことが出てきたら、いつでも聞いてください。一歩ずつ、一緒にプロのコードをマスターしていきましょう!
