tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルVB2005からPowerPoint2007へのリンク貼付操作
記事No8253
投稿日: 2008/09/30(Tue) 21:42
投稿者アップルティー
お世話になります。

現在、VB2005からExcelファイルを開き、PowerPointにリンク貼付を行うプログラムを作成してます。
内容自体はこちらの掲示板に記載されていた内容とほぼ同様です。
http://hanatyan.sakura.ne.jp/vb60bbs/wforum.cgi?mode=allread&no=11405&page=300#11422
上記URLを参考にして、

pptShapes.PasteSpecial(PowerPoint.PpPasteDataType.ppPasteShape, , , , , Microsoft.Office.Core.MsoTriState.msoTrue)

のように行えばPowerPoint2003でのリンク貼付は上手く行きました。
しかし、PowerPointの2007では上記メソッド呼び出し時「System.Runtime.InteropServices.COMException」の例外が発生します。
(エラーメッセージは【サーバーによって例外が返されました。 (HRESULT からの例外: 0x80010105 (RPC_E_SERVERFAULT))】となっております。)

リンク貼付ではなく、ビットマップ形式で行ったところ

pptShapes.PasteSpecial(PowerPoint.PpPasteDataType.ppPasteBitmap, , , , , )

こちらでは上手く行きましたので、メソッド自体は機能しているようです。

どうにかPowerPoint2007でもリンク貼付を行いたいのですが、どうにかいい方法がないでしょうか?

[ツリー表示へ]
タイトルRe: VB2005からPowerPoint2007へのリンク貼付操作
記事No8262
投稿日: 2008/10/02(Thu) 15:40
投稿者花ちゃん
回答ではありません。何方からもレスがないようなので...。

エラーメッセージをキーに検索されたら、結構同じ事例のようなのがヒット
しましたので、ご自分の環境等で思い当たる事がないか調べてみてはどうでしょうか?

バージョンによって動く場合と動かない場合があるのなら、引数の個数や型が
代わっていないか確認されてみては。

又、COMオブジェクトの解放処理等はどのようにされているでしょうか?
タスクマネージャに沢山残っているという事はありませんか。

[ツリー表示へ]
タイトルRe^2: VB2005からPowerPoint2007へのリンク貼付操作
記事No8265
投稿日: 2008/10/02(Thu) 17:53
投稿者アップルティー
> 回答ではありません。何方からもレスがないようなので...。

お忙しいところ、わざわざありがとうございます。

> エラーメッセージをキーに検索されたら、結構同じ事例のようなのがヒット
> しましたので、ご自分の環境等で思い当たる事がないか調べてみてはどうでしょうか?

基本的に調査してどうしようもなかった場合のみ、掲示板に書き込みをしています。
安易な書き込みは極力避けているつもりです。

> バージョンによって動く場合と動かない場合があるのなら、引数の個数や型が
> 代わっていないか確認されてみては。

パラメータについては全部とは言いませんが、多くのパターンを試しております。
しかし、いずれの場合も欲する結果ではありませんでした。

> 又、COMオブジェクトの解放処理等はどのようにされているでしょうか?
> タスクマネージャに沢山残っているという事はありませんか。

タスクマネージャに残っているという現象はありません。

こちらのHPを見て、COMオブジェクトのインスタンスの解放については十分に注意しているつもりです。
また、一例ですが解放処理については以下のようなコード記述を行っております。
(ReleaseObject()メソッドについてはこちらのHPのMRComObject()と同様の処理です。)

''' 対象のスライドのタイトルに値を設定する
Protected Sub SetTitle(ByVal pptSlide As PowerPoint.Slide, ByVal title As String)

    Dim pptShapes As PowerPoint.Shapes = pptSlide.Shapes
    Try
        If pptShapes.HasTitle <> Microsoft.Office.Core.MsoTriState.msoTrue Then Return

        Dim pptShape As PowerPoint.Shape = pptShapes.Title
        Try
            Dim pptTextFrame As PowerPoint.TextFrame = pptShape.TextFrame
            Try
                Dim pptTextRange As PowerPoint.TextRange = pptTextFrame.TextRange
                Try
                    pptTextRange.Text = title
                Finally
                    Me.ReleaseObject(pptTextRange)
                End Try
            Finally
                Me.ReleaseObject(pptTextFrame)
            End Try
        Finally
            Me.ReleaseObject(pptShape)
        End Try
    Finally
        Me.ReleaseObject(pptShapes)
    End Try

End Sub

''' COMオブジェクトの解放をする。
Protected Sub ReleaseObject(Of T As Class)(ByRef objCom As T, Optional ByVal force As Boolean = True)

    If objCom Is Nothing Then Return

    Try
        If System.Runtime.InteropServices.Marshal.IsComObject(objCom) Then
            If force Then
                System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objCom)
            Else
                Dim count As Integer = System.Runtime.InteropServices.Marshal.ReleaseComObject(objCom)
            End If
        End If
    Finally
        objCom = Nothing
    End Try

End Sub

また、COMオブジェクトのメソッドを使用する際、対象のメソッドに戻り値があればそれも取得し上記同様の解放処理を行っております。

[ツリー表示へ]