PowerPoint (一般・VBA)

PowerPoint 一般・VBAに関する話題を扱うフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : PowerPoint 2016)
Powerpointファイルの全文字列をイミディエイトウインドウに出力したい
投稿日時: 20/02/14 10:19:47
投稿者: gorby

Powerpointファイルの全文字列をイミディエイトウインドウに出力するPowerpointVBAのコードを作成して、マクロとして実行したところ、なぜかスライド1ページ目の文字列しか出力されませんでした。
コードをどう直せば、全文字列を出力可能でしょうか?
 
 
--<Start of code>-----
Sub アクティブスライドの全文字列を出力する()
 
Dim shp As Shape
 
With ActiveWindow.Selection.SlideRange
  For Each shp In .Shapes
   If shp.TextFrame.HasText Then
      Debug.Print _
         shp.TextFrame.TextRange.Text
    End If
  Next shp
 
End With
 
End Sub
--<End of code>-----

回答
投稿日時: 20/02/17 10:35:25
投稿者: KBTIT

プロシージャ名の通り、「現在アクティブになっているスライドにある文字列を取得」するだけで、スライドをループする処理が入ってないですね。
 
↓これでどうでしょうか?
 
Sub アクティブスライドの全文字列を出力する()
    Dim shp As Shape
     
    For Each sld In ActivePresentation.Slides 'プレゼンテーション内のスライドループ
        With sld
            For Each shp In .Shapes 'スライド内の図形をループ
                If shp.TextFrame.HasText Then
                    Debug.Print shp.TextFrame.TextRange.Text
                End If
            Next shp
        End With
    Next
End Sub

投稿日時: 20/02/17 11:17:02
投稿者: gorby

KBTIT さんの引用:
プロシージャ名の通り、「現在アクティブになっているスライドにある文字列を取得」するだけで、スライドをループする処理が入ってないですね。
 
↓これでどうでしょうか?
 
Sub アクティブスライドの全文字列を出力する()
    Dim shp As Shape
     
    For Each sld In ActivePresentation.Slides 'プレゼンテーション内のスライドループ
        With sld
            For Each shp In .Shapes 'スライド内の図形をループ
                If shp.TextFrame.HasText Then
                    Debug.Print shp.TextFrame.TextRange.Text
                End If
            Next shp
        End With
    Next
End Sub

 
回答ありがとうございます。
しかし、上記コードを実行したところ、Powerpointファイルの44ページから最終ページまでのテキストがイミディエイトウインドウに取得できました。1ページから取得するには、コードをどう直せば良いでしょうか?

回答
投稿日時: 20/02/17 11:34:07
投稿者: KBTIT

プレゼンの一番上のスライドを選択した状態で再度マクロを実行してみてください。
(44ページから取得されたのは、44枚目のスライドをアクティブにした状態でマクロを実行したからだと思います)

投稿日時: 20/02/17 11:41:21
投稿者: gorby

KBTIT さんの引用:
プレゼンの一番上のスライドを選択した状態で再度マクロを実行してみてください。
(44ページから取得されたのは、44枚目のスライドをアクティブにした状態でマクロを実行したからだと思います)

 
言われたとおり、1ページをアクティブにしてから、マクロ実行しましたが、状況は変わりません。
他に何か対策はありませんか?参考までに使用したコードを下記に貼り付けます。
 
Sub Powerpointファイルの全文字列を出力する()
     Dim shp As Shape
       
     For Each sld In ActivePresentation.Slides 'プレゼンテーション内のスライドループ
        With sld
             For Each shp In .Shapes 'スライド内の図形をループ
                If shp.TextFrame.HasText Then
                     Debug.Print shp.TextFrame.TextRange.Text
                 End If
             Next shp
         End With
     Next
 End Sub
 

回答
投稿日時: 20/02/17 11:44:50
投稿者: KBTIT

ループを変えてみました。
こちらのコードを試していただけないでしょうか?
 
 
Sub アクティブスライドの全文字列を出力する()
    Dim shp As Shape
      
    For i = 1 To ActivePresentation.Slides.Count
        With ActivePresentation.Slides(i)
            For Each shp In .Shapes 'スライド内の図形をループ
                If shp.TextFrame.HasText Then
                    Debug.Print shp.TextFrame.TextRange.Text
                End If
            Next shp
        End With
    Next
End Sub
 
 

投稿日時: 20/02/17 13:23:10
投稿者: gorby

KBTIT さんの引用:
ループを変えてみました。
こちらのコードを試していただけないでしょうか?
 
 
Sub アクティブスライドの全文字列を出力する()
    Dim shp As Shape
      
    For i = 1 To ActivePresentation.Slides.Count
        With ActivePresentation.Slides(i)
            For Each shp In .Shapes 'スライド内の図形をループ
                If shp.TextFrame.HasText Then
                    Debug.Print shp.TextFrame.TextRange.Text
                End If
            Next shp
        End With
    Next
End Sub
 

 
同じPPTMファイルで実行したら、再度44ページ以降のテキストがイミディエイトウインドウに出力されました。ただ、別のPPTMファイルで事項したら、1ページから出力されたので、おそらく、PPTMファイル側の問題なんでしょうね。