PowerPoint - eiichiromomma/CVMLAB GitHub Wiki

PowerPoint

2003でハマるポイント

埋め込み画像の参照

ファイルが無い

なぜか2003からファイルの参照が相対パス(ファイルの置いてあるフォルダから見たファイルの位置)ではなく、絶対パス(c:\temp\foo\bar.jpg)みたいな感じ)を記録するようになった。

要するにファイルを埋め込む場合、仮にフォルダ構成を同じにコピーしても、作ったマシンでしか正常に表示されないことになる。

対応策

Microsoftによると2つあるらしいが、一つはCDにパックしろという内容なのでパス。

子フォルダから先だけに置き換える方法

下のを基に作ってみた。 子フォルダの階層のみ生かす。 相対パスは面倒なのでやめた。

Sub RelPict()
   Dim oSlide As Slide
   Dim oShape As Shape
   Dim lPos As Long
   Dim strLink As String
   For Each oSlide In ActivePresentation.Slides
      For Each oShape In oSlide.Shapes
         If (oShape.Type = msoLinkedOLEObject) Or (oShape.Type = msoLinkedPicture) Or (oShape.Type = msoMedia) Then
            With oShape.LinkFormat
              PathLen = Len(oSlide.Parent.Path)
              If (InStr(.SourceFullName, oSlide.Parent.Path) = 1) And (InStrRev(.SourceFullName, "\") > 0) Then
                lPos = Len(.SourceFullName) - PathLen - 1
                strLink = Right(.SourceFullName, lPos)
                .SourceFullName = strLink
              End If
            End With
         End If
      Next oShape
   Next oSlide
End Sub

パスを全部消して同一フォルダにする方法

によると下のソースで良いらしい。

If (oShape.Type の部分を弄るとオブジェクトを自由に指定できます。 (msoMediaを追加してあります)

※バグってました。

Sub RelPict()
   Dim oSlide As Slide
   Dim oShape As Shape
   Dim lPos As Long
   Dim strLink As String
   '
   ' Loop through the presentation checking each shape
   ' on each slide to see if it is a linked picture.
   '
   For Each oSlide In ActivePresentation.Slides
      For Each oShape In oSlide.Shapes
         If (oShape.Type = msoLinkedOLEObject) Or (oShape.Type = msoLinkedPicture) Or (oShape.Type = msoMedia) Then
            With oShape.LinkFormat
   '
   ' Search from the right hand portion of the source
   ' file name and find the first backslash "\" character.
   '
               lPos = InStrRev(.SourceFullName, "\")
   '
   ' Check to see if the link has already been modified.
   '
               If lPos <> 0 Then
   '
   ' Determine how long the file name is, by subtracting
   ' the position the "\" character was found at from
   ' the total length of the source file name.
   '
                  lPos = Len(.SourceFullName) - lPos
   '
   ' Extract the file name from the source file name, then
   ' assign the file name to the source file name, turning
   ' it into a relative path.
   '
                  strLink = Right(.SourceFullName, lPos)
                  .SourceFullName = strLink
               End If
            End With
         End If
      Next oShape
   Next oSlide
End Sub

で良いらしい。

動画その他の場合

PowerPointのマクロの資料があまりにも貧相なのでマクロをいじる気が失せた。 とりあえずpptファイルと同一フォルダに置けば移動しても大丈夫らしい。