UiPathにてPowerPoint内のテキストを取得する方法

UiPathにてPowerPoint内のテキストボックスや図形内のテキストを取得したいのですが、Microsoft.Office.Interopを用いて取得できないかと思いVB.netのコードを書き実行した所、下記のエラーになってしまいます。

System.InvalidCastException:型’System._ComObject’のCOMオブジェクトをインターフェイス型’Microsoft.Office.Interop.PowerPoint.Shape’にキャストできません。IID’{91493479-5A91-11CF-8700-00AA0060263B}'が指定されたインターフェイスCOMコンポーネント上でのQueryInterface呼び出し時に次のエラーが発生したため、この操作に失敗しました:要素が見つかりません。

作成したコードは下記になります。コードを呼び出しアクティビティにて使用しておりますが、アクティビティ単位(代入+繰り返しコレクションの各要素)でも試した所、同様のエラーが発生してしまいます。

Dim App As Microsoft.Office.Interop.PowerPoint._Application
Try
App = New Microsoft.Office.Interop.PowerPoint.ApplicationClass
Dim p As Microsoft.Office.Interop.PowerPoint.Presentation = App.Presentations.Open(“.pptxファイルパス”)
For Each e As Microsoft.Office.Interop.PowerPoint.Shape In p.Slides(1).Shapes
Console.WriteLine(e.TextFrame.TextRange.Text)
Next
p.Close
Finally
App.Quit
End Try

何か別の方法でPowerPoint内のテキストボックスや図形内のテキストを取得またはエラーを回避する方法ご存知でしたらご教示頂けませんでしょうか?

会社のPCの為、UiPathのバージョンは「2018.4.5」になります。

こんな感じで、全スライドのテキストが取得できると思います。

Dim ap As New Microsoft.Office.Interop.Powerpoint.Application
Dim fpath As String = "C:\temp\test.pptx"
Dim pr As Microsoft.Office.Interop.Powerpoint.Presentation
Try
	pr = ap.Presentations.Open(fpath)
	For Each sl As Microsoft.Office.Interop.Powerpoint.Slide In pr.Slides
		For Each sh As Microsoft.Office.Interop.Powerpoint.Shape In sl.Shapes
		    Console.writeLine(sh.TextFrame.TextRange.Text)
		Next
	Next
	pr.Close()
	pr = Nothing
Catch ex As Exception
    Console.writeLine(ex.ToString)
    Throw(ex)
Finally
    If Not(pr Is Nothing) Then pr = Nothing
	ap.Quit()
    ap = Nothing
End Try

以下の名前空間のインポート設定が必要です
Microsoft.Office.Core
Microsoft.Office.Interop.PowerPoint

shinji さん

ご教示ありがとうございます。
頂いてたコードにて試してみたのですが、やはり上記と同じくエラーが発生してしまいました。

System.InvalidCastException:型’System._ComObject’のCOMオブジェクトをインターフェイス型’Microsoft.Office.Interop.PowerPoint.Shape’にキャストできません。

名前空間のインポート設定も確認しました。
エラー発生時PowerPointは開けておりSlidesまでは読み込めているようです。
下記の様にShapesをコメントアウトにした所、何も出力はされていませんが正常に終了しました。

Dim ap As New Microsoft.Office.Interop.Powerpoint.Application
Dim fpath As String = "C:\temp\test.pptx"
Dim pr As Microsoft.Office.Interop.Powerpoint.Presentation
Try
	pr = ap.Presentations.Open(fpath)
	For Each sl As Microsoft.Office.Interop.Powerpoint.Slide In pr.Slides
		'For Each sh As Microsoft.Office.Interop.Powerpoint.Shape In sl.Shapes
		    'Console.writeLine(sh.TextFrame.TextRange.Text)
		'Next
	Next
	pr.Close()
	pr = Nothing
Catch ex As Exception
    Console.writeLine(ex.ToString)
    Throw(ex)
Finally
    If Not(pr Is Nothing) Then pr = Nothing
	ap.Quit()
    ap = Nothing
End Try

同じエラーでしたか。失礼しました。
私の手元では動いているので、何か他の原因がありそうです。
COMオブジェクトキャストエラーは、Officeアプリが不安定な場合や複数バージョンがインストールされている場合に起きることもあるようです。

「COM オブジェクトをインターフェイス型」でググると、色々出てきます。

お調べ頂いたようでありがとうございます。

「COM オブジェクトをインターフェイス型」で調べた所、環境依存の問題の可能性が高そうです。

レジストリ修正等にて解消可能性なようですが会社PCの為、容易に修正出来なさそうです。

Microsoft.Office.Interopを使用せず取得する方法をご存知の方、いらっしゃらないかもう少し待ってみてなさそうであればshinjiさんの回答にて解決済みにさせて頂きます。
参考コードまでご教示頂きありがとうございました。

上記の通り「Microsoft.Office.Interop」が環境の影響で使用出来なさそうです。

Microsoft.Office.Interopを使用せずPowerPoint内のテキストボックスや図形内のテキストを取得取得する方法ご存知でしたらご教示頂けませんでしょうか?

VBA を呼び出し (Invoke VBA)アクティビティか、 マクロを実行 (Execute Macro)アクティビティで、VBA経由で取得するぐらいしか思いつきません。コードはググれば結構出てきます。

shinjiさん

VBAにて試した所、エラー発生することなく正常に読み込む事が出来ました。

様々な方法をご教示頂き本当にありがとうございます。
選択肢が増え大変勉強になりました。

1 Like

This topic was automatically closed 3 days after the last reply. New replies are no longer allowed.