プレゼンの「重さ」をコントロールせよ:ファイルサイズ制限による安全管理マクロの構築
こんにちは。自動化の世界へようこそ。
「マクロの記録」ボタンを押し、自分の操作をコードに変える。そこから一歩踏み出そうとしているあなたに、今日は最高に実用的な、そして「エンジニアらしい思考」を養うための課題を授けたいと思います。
皆さんは、渾身のプレゼン資料をメールで送ろうとして、「送信エラー」で跳ね返された経験はありませんか? あるいは、共有ストレージの容量を圧迫してしまい、チームのメンバーから苦情を受けたことは?
プロフェッショナルの仕事とは、単に「動くものを作る」ことではありません。「ユーザーがミスを犯さないような仕組み(ガードレール)を作る」ことなのです。
今日は、PowerPointのファイルサイズを自動でチェックし、規定を超えていたら警告を出し、別名保存を促す「安全管理マクロ」を一緒に作っていきましょう。
1. 本質を理解する:なぜ「ファイルサイズ」をコードで扱うのか
プログラミング初学者が陥りがちな罠は、「やりたいこと(ファイルサイズをチェックする)」だけを見て、その背後にあるオブジェクトの性質を見落としてしまうことです。
PowerPointの「プレゼンテーション」というオブジェクト自体には、「現在のファイルサイズは何MBですか?」というプロパティ(属性)は存在しません。なぜなら、ファイルサイズはPowerPointというアプリが決めているものではなく、Windows(OS)という土台が管理している情報だからです。
つまり、今回のマクロの設計図はこうなります。
1. PowerPointから「今開いているファイルの保存場所(パス)」を聞き出す。
2. そのパスを手に、Windowsのファイルシステムへ「このファイルのサイズを教えて」と問い合わせる。
3. 返ってきた数値(バイト単位)を、人間が分かりやすい「MB(メガバイト)」に変換する。
4. 判定を行い、条件に応じてユーザーにアクションを促す。
この「異なる領域(アプリとOS)を橋渡しする」感覚こそが、自動化エンジニアへの第一歩です。
2. 実装:安全管理マクロのコード
それでは、実際に動くコードを見てみましょう。このコードは、そのままコピー&ペーストして使えます。しかし、ただ貼るのではなく、コメント(`’` で始まる説明文)を読みながら、一行ずつ「何をしているのか」を噛み締めてください。
Option Explicit
''' <summary>
''' ファイルサイズをチェックし、規定値を超えていれば警告して別名保存を促すマクロ
''' </summary>
Sub CheckFileSizeAndSafeSave()
' --- 設定エリア ---
Const MAX_SIZE_MB As Double = 20 ' 警告を出すしきい値 (MB)
' ------------------
Dim pptPres As Presentation
Dim filePath As String
Dim fileSizeInBytes As LongLong ' ファイルサイズ(バイト)を格納(大きなファイルに対応するためLongLongを使用)
Dim fileSizeInMB As Double
Dim savePath As Variant
' 1. 現在アクティブなプレゼンテーションを取得
Set pptPres = ActivePresentation
' 2. 【重要】ファイルが一度も保存されていない場合のエラーハンドリング
' 保存されていないファイルには「パス」が存在しないため、エラーになります。
If pptPres.Path = "" Then
MsgBox "このファイルはまだ一度も保存されていません。" & vbCrLf & _
"まずは一度、通常の保存を行ってください。", vbExclamation, "保存未完了"
Exit Sub
End If
' 3. ファイルのフルパスを取得
filePath = pptPres.FullName
' 4. Windowsの関数を使用してファイルサイズ(バイト)を取得
' Dir関数などで存在確認もできるが、ここではシンプルにFileLenを使用
On Error Resume Next
fileSizeInBytes = FileLen(filePath)
If Err.Number <> 0 Then
MsgBox "ファイル情報にアクセスできませんでした。ファイルが開かれているか確認してください。", vbCritical
On Error GoTo 0
Exit Sub
End If
On Error GoTo 0
' 5. バイトをMBに変換 (1MB = 1024 * 1024 バイト)
fileSizeInMB = fileSizeInBytes / (1024 * 1024)
' 6. サイズ判定
If fileSizeInMB > MAX_SIZE_MB Then
' 規定値を超えている場合
Dim msg As String
msg = "【警告】ファイルサイズが規定値 (" & MAX_SIZE_MB & " MB) を超えています。" & vbCrLf & _
"現在のサイズ: " & Format(fileSizeInMB, "0.00") & " MB" & vbCrLf & vbCrLf & _
"メール添付には不向きです。画像を圧縮するか、別名で保存してください。"
If MsgBox(msg, vbExclamation + vbYesNo, "サイズ超過の警告") = vbYes Then
' 「はい」が押されたら、別名保存ダイアログを表示
savePath = Application.GetSaveAsFilename(InitialFileName:="容量削減版_" & pptPres.Name)
' ダイアログでキャンセルされなかった場合のみ保存を実行
If savePath <> False Then
pptPres.SaveAs Filename:=savePath
MsgBox "別名で保存しました:" & vbCrLf & savePath, vbInformation
Else
MsgBox "保存はキャンセルされました。", vbInformation
End If
End If
Else
' 規定値以内の場合
MsgBox "ファイルサイズは正常です (" & Format(fileSizeInMB, "0.00") & " MB)。", vbInformation, "チェック完了"
End If
End Sub
3. コードの深層解説:ここがエンジニアの腕の見せ所
このコードには、初心者が「マクロの記録」では決して到達できない、3つの重要なテクニックが盛り込まれています。
① 「未保存ファイル」という境界条件への配慮
`If pptPres.Path = “” Then` の部分を見てください。
新しいプレゼンテーションを作成して、一度も保存していない状態でこのマクロを動かそうとすると、プログラムは「どこにあるファイルを探せばいいの?」とパニックを起こして強制終了します。これを例外(エラー)と呼びます。
「もし〜だったら、処理を中断する」という一文を入れる。これが、堅牢な(壊れにくい)プログラムを作る極意です。
② 単位の変換(バイトからMBへ)
コンピュータの世界では、ファイルサイズは基本的に「バイト(Byte)」という最小単位で扱われます。しかし、人間にとって「15,728,640 バイト」と言われてもピンときません。
`fileSizeInBytes / (1024 * 1024)`
この計算式によって、人間にとって直感的な「MB」へと変換しています。この「データの抽象化」は、あらゆるプログラミングの基本です。
③ ユーザー体験(UX)への配慮
単に「重すぎます!」とエラーを出して終わるのではなく、`Application.GetSaveAsFilename` を使って「じゃあ、どうすればいいですか?」という問いに対して「別名で保存する」という解決策(ダイアログ)を提示しています。
「エラーを出すこと」が目的ではなく、「ユーザーの作業を止めないこと」が目的である、という視点を持ってください。
4. 陥りやすいエラーと対策
これからこのコードをカスタマイズしていく中で、おそらく以下の壁にぶつかるでしょう。
- 「型が一致しません」エラー
ファイルサイズが非常に大きい場合、通常の整数型(Integer)では容量が溢れてしまいます。今回は `LongLong`(64ビット整数)という、大きな数字を扱える型を使用しています。
- 「ファイルが見つかりません」エラー
ネットワークドライブ上のファイルを開いているときや、ファイル名に特殊な文字が含まれているときに発生することがあります。その場合は、`On Error Resume Next` を使って、エラーが起きてもプログラムを止めずに適切に処理する「エラーハンドリング」が必要です。
最後に:次の一歩へ
お疲れ様でした。あなたは今、単にコードを書いたのではありません。「ファイルサイズの管理」という業務プロセスにおけるリスク管理を自動化したのです。
ここをクリアすれば、PowerPoint VBAの基本はバッチリですよ。次は、このマクロを「保存ボタンを押した瞬間に自動で動くようにする(イベントプロシージャ)」といった応用にも挑戦してみてください。
自動化の力は、あなたの時間を生み出し、ミスを減らし、あなたの価値を最大化してくれます。その旅を、これからも楽しんでくださいね。
