【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と同じサーバーに保存してとありますが、
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12274447742
他の者に処理してもらう際に10個のテンプレートファイルをダウンロードする必要があるので、
Excelにオブジェクトとして添付できればExcelファイル1つを送れば済むためそのようにできないか悩んでいます。
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でも事足りる場合にのみ、試してみてください。
-
前の記事
【ExcelVBA】範囲指定の仕方【初心者向】 2023.01.30
-
次の記事
【ExcelVBA】テキストにある文章を一つのセルに入れていくには 2023.02.01