【入門編】【中級者】プレゼンテーション内の「リンクされた図(Excel等)」のリンク元パスを一括で相対パスに書き換えて別名保存するポータビリティ向上マクロ – PowerPoint VBA解析バイブル

スポンサーリンク

こんにちは!PowerPointの自動化の世界へようこそ。
日々、大量の資料作成やファイル管理に追われていませんか?「先輩、Excelの表をリンク貼り付けした資料を別の人に送ったら、リンク切れでグラフが真っ白になっちゃいました……」なんて相談、現場で本当によく耳にしますよね。

フォルダごとZIPにしてチャットで送ったり、共有サーバーを引っ越したりした途端、Excelとのリンクが切れて冷や汗をかいた経験、あなたもあるはずです。

PowerPointの「リンクされた図(OLEオブジェクト)」は、デフォルトだと絶対パス(C:\Users\…\data.xlsxなど)でリンク元を保持してしまいます。これがポータビリティ(可搬性)を著しく下げる諸悪の根源です。

今回は、この絶対パスの呪縛を解き放ち、「プレゼンテーションと同じフォルダ内にある相対パス」に一括で書き換えて別名保存する、実務で即戦力となるマクロを授けましょう。ここをクリアすれば、あなたもマクロの記録から完全に脱却し、ワンランク上のエンジニアへグッと近づけますよ。

—

なぜ「リンク切れ」が起きるのか?(本質を知る)

まず敵を知ることから始めましょう。PowerPointのスライドにExcelの表やグラフを「リンク貼り付け」すると、PowerPoint内部では以下のような情報が保持されます。

  • リンク元のファイルのフルパス(絶対パス)

これが何を意味するかというと、例えばあなたのPCの `C:\Work\2023\sales.xlsx` というファイルを指している場合、そのファイルを同僚のPCの `D:\Share\sales.xlsx` に持って行ったら、PowerPointは「そんなパス、うちのPCにはないよ!」とパニックを起こしてリンクが切れてしまうのです。

これを解決するのが「相対パス」。
「このPowerPointファイルから見て、すぐ隣にある `sales.xlsx` を読みに行ってね」という指定方法に変えてやれば、フォルダごとUSBメモリに入れようが、クラウドで共有しようが、リンクが切れることはなくなります。

—

現場で即戦力となる!相対パス変換&別名保存マクロ

それでは早速、その魔法のようなコードを公開します。
以下のコードをPowerPointのVBAエディタ(Alt + F11)の標準モジュールに貼り付けて実行してください。

Sub ConvertLinksToRelativeAndSave()
Dim pptDoc As Presentation
Dim sld As Slide
Dim shp As Shape
Dim currentPath As String
Dim oldSource As String
Dim fileName As String
Dim fso As Object
Dim count As Long

‘ アクティブなプレゼンテーションを取得
Set pptDoc = ActivePresentation

‘ 1. まず、このPptファイル自体が保存されているかチェック
If pptDoc.Path = “” Then
MsgBox “このプレゼンテーションはまだ一度も保存されていません。” & vbCrLf & _
“一度適当なフォルダに保存してから実行してください。”, vbCritical, “エラー”
Exit Sub
End If

currentPath = pptDoc.Path & “\”
count = 0

‘ ファイルシステムオブジェクトの準備(パス操作用)
Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ 2. すべてのスライドと図形を走査
For Each sld In pptDoc.Slides
For Each shp In sld.Shapes
‘ 図形が「リンクされたOLEオブジェクト」であるか判定
If shp.Type = msoLinkedOLEObject Then
On Error Resume Next
oldSource = shp.LinkFormat.SourceFullName

If Err.Number = 0 And oldSource <> “” Then
‘ リンク元のファイル名(拡張子含む)のみを抽出
fileName = fso.GetFileName(oldSource)

‘ 【核心】リンク元を「現在のフォルダ + ファイル名」に強制書き換え(相対パス化)
shp.LinkFormat.SourceFullName = currentPath & fileName
shp.LinkFormat.Update
count = count + 1
End If
On Error GoTo 0
End If
Next shp
Next sld

‘ 3. 別名で保存する(元のファイルを汚さないための安全設計)
Dim newSavePath As String
newSavePath = currentPath & “【ポータブル版】” & pptDoc.Name

‘ 同名ファイルが存在する場合は上書き
pptDoc.SaveCopyAs newSavePath

‘ 完了メッセージ
MsgBox “処理が完了しました!” & vbCrLf & _
“変換されたリンク数: ” & count & ” 件” & vbCrLf & _
“保存先: ” & newSavePath, vbInformation, “成功”

Set fso = Nothing
End Sub

—

コードの解説:ここがエンジニアのこだわりポイント

ただ動くだけのコードなら誰でも書けます。プロのエンジニアが書いたコードには、現場で折れないための「防衛策」が組み込まれています。

1. 未保存チェック(`pptDoc.Path = “”`)

PowerPointを新規作成して一度も保存していない状態(パスが存在しない状態)でこれを実行すると、`currentPath` が空になってしまい、パスの結合がおかしくなります。これを未然に防ぐため、最初に「保存されているか?」をチェックしています。

2. 型の判定(`shp.Type = msoLinkedOLEObject`)

スライドには文字や図形、画像など様々なオブジェクトがあります。今回は「Excelなどの外部ファイルとリンクしているオブジェクト」だけをピンポイントで狙い撃ちしたいので、この条件分岐が不可欠です。

3. `Scripting.FileSystemObject` によるファイル名抽出

絶対パスからファイル名(例:`sales.xlsx`)だけをスマートに抜き出すために、Windows標準の強力なヘルパーであるFileSystemObject(FSO)を使用しています。文字列操作関数(InStrRevなど)でゴリゴリ書くよりも圧倒的にバグが少なく、美しく書けます。

4. `SaveCopyAs` による安全な別名保存

元のファイルを直接書き換えて上書き保存してしまうと、万が一マクロが意図しない挙動をしたときに取り返しがつきません。`SaveCopyAs` を使うことで、元ファイルを温存したまま、リンクが書き換わった「コピー」を安全に生成することができます。実務ではこういう「逃げ道」を作っておくことが何よりも大切です。

—

陥りやすい罠とエラー対策

実際にこのマクロを使う際に、初心者がハマりがちなポイントをいくつか共有しておきますね。

  • 罠1:「そもそも同じフォルダにリンク元ファイルがない」
  • 現象: マクロは正常終了したのに、開くとリンクが切れている。
  • 対策: このマクロは「PowerPointと同じフォルダの中に、Excelファイルも一緒に入っている」状態を前提としています。あらかじめ、リンク元のExcelファイルをPowerPointと同じフォルダにコピー(または移動)してからマクロを実行してください。
  • 罠2:セキュリティの警告でマクロが動かない
  • 現象: 「マクロが無効化されました」と出る。
  • 対策: ファイルを「信頼できる場所」に保存するか、コンテンツの有効化を行ってください。また、拡張子が `.pptm`(マクロ有効プレゼンテーション)で保存されていることも確認してくださいね。

—

まとめ:PowerPoint VBAの基本はバッチリ!

お疲れ様でした!今回のコードを通じて、以下の大切な概念をクリアできました。

1. オブジェクトの階層構造の理解(`Presentation` > `Slide` > `Shape`)
2. 条件分岐による安全なターゲットの絞り込み
3. ファイルパスの動的な操作と外部オブジェクト(FSO)の活用
4. 実務を見据えた安全設計(未保存チェックと別名保存)

ここをクリアできれば、もうあなたは「マクロの記録をポチポチ押すだけの初心者」ではありません。立派な業務自動化エンジニアの第一歩を踏み出しています。

ぜひ、日々の資料作成のストレスをこのマクロで吹き飛ばしてください。それでは、次回の極限の知見でお会いしましょう!

タイトルとURLをコピーしました