【ExcelVBA】埋込オブジェクトのWordを開いてPDF保存【半分未解決】

Excelのブックに埋込オブジェクトでWordを保存しておき、VBAでそのWordを開いてPDFで保存する方法について紹介します。

きっかけ

きっかけは例によってYahoo!知恵袋での質問でした。

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12274447742

ExcelマクロVBAでWord操作で下記リンクの内容のようなことをしたいのですが、
下記リンクのWordのテンプレートファイルを同じサーバー上に置いておくのではなく、
VBAを作成するExcelにオブジェクトとしてテンプレートファイルを添付しておき、そのオブジェクトになったWordファイルをVBAで操作することは可能でしょうか?
可能であればコードも教えていただけると幸いです。

https://fastclassinfo.com/entry/vba_excel_word_pdf/

ある処理において10個のWordファイルを作成する必要があり、10個のWordのテンプレートファイルを用意しておき、処理が発生するたびに変更箇所をExcelのセルから差し込みをし、作成したファイルを指定したファイルサーバーに保存するということをしようとしています。

上記リンクで紹介されているやり方はテンプレートをExcelと同じサーバーに保存してとありますが、
他の者に処理してもらう際に10個のテンプレートファイルをダウンロードする必要があるので、
Excelにオブジェクトとして添付できればExcelファイル1つを送れば済むためそのようにできないか悩んでいます。

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12274447742

OLEObjectを使えばよいのではと思いましたが、実際に私はコードで使ったことがないので調べました。

過去の議論

調べたところ、下記のような議論を見つけました。

WordにOLEで埋め込んだExcelでWord上に表示させたいセルをVBAで指定するには?

https://oshiete.goo.ne.jp/qa/9011694.html

この議論は、先の質問者の要望とは逆でWordにExcelが埋め込まれているケースですが、Wordに埋め込まれたExcelでできるなら、Excelに埋め込まれたWordでもできるだろうと参考にしました。

問題は、この議論においてWB.Closeでエラーになっている点です。

このエラーは私の環境でも発生しました。

私の考えたコード

私の考えたコードはこうです。

Public Sub OpneOLEObjectTest()
    Dim Wd As Word.Application
    Dim wddoc As Word.Document
    Dim OLE1 As Excel.OLEFormat
    Dim iNum As Integer
    Dim iCnt As Integer
    Dim Flg As Boolean
    Flg = False
    With ThisWorkbook.Worksheets(1)
        iCnt = .Shapes.Count
        For iNum = 1 To iCnt
            If .Shapes(iNum).Type = msoEmbeddedOLEObject Then
                Flg = True
                Exit For
            End If
                
        Next iNum
    
        If Flg Then
            Set OLE1 = .Shapes(iNum).OLEFormat
            OLE1.Verb Verb:=xlVerbOpen
            Set Wd = GetObject(, "Word.Application")
            Wd.Visible = True
            Set wddoc = Wd.Documents(1)
            '以下、Word_Sashikomi_PDFの処理
        Else
            MsgBox "テンプレートが見つからない!"
            Exit Sub
        End If
    End With
    wddoc.Activate
    With wddoc
        .SaveAs Filename:="C:\VBA\test.pdf", FileFormat:=17
        .Close SaveChanges:=False   'xlsmとdocxの場合、ここで落ちます。
    End With

    Set OLE1 = Nothing
    Set Wd = Nothing
    Set wddoc = Nothing
End Sub

コメントの中にあるWord_Sashikomi_PDFの処理というのは、質問者が参考にしていたサイトのプロシージャの名前です。

また、コメントに書いてありますが、私の考えたコードでもwddoc.Closeの部分でエラーになります(処理がアボートします)。原因は不明です。そのため、この記事のタイトルに半分未解決としてあります。

このコードを記述したブックをxls形式で保存し、埋め込むWordもdocxでなくdocにしてみました。

そこで実験したところ、今度はうまく終了しました(正常終了しました)。

まとめ

私が参考にした教えて!Gooの議論に登場するWindFallerさんは私がこっそり尊敬している人です。以前Wendy02というハンドル名でご活躍されていた方と同一人物ではないかと思うのですが、不明です。どちらもスゴイ知見の持ち主でして、この方たちの回答にあるコードはものすごくハイレベルでハイセンスです。

なので、Wb.Closeという部分で落ちるというのは、もうどうしようもないエラーだと思っています。

ExcelやWordの仕様の想定外なんだと思います。

という訳で、半分未解決です。前のバージョンであるxlsとdocでも事足りる場合にのみ、試してみてください。