R1 コードを修正しました。(Re:のように「:」が含まれているファイルも処理できるコードにしました)
こんにちは、くのへ@MasazaneKunoheです。
Outlook VBAでメールをPDF化する方法を3種ほど確認しました。
Outlook VBAにはExportAsFixedFormatメソッドが無いので、PDF化は意外と難しい感じでした。
今回は「その1」として、日本・海外のWebサイト上で一番メジャーだったWord VBAのお力をお借りするコードを紹介します。
その1 WordVBAのお力をお借りする方法
コード
Outlook VBEに次のコードをコピペで動くと思います。
ただし、初めのConst DESKTOP、、、のところのアドレスを自分が保存したいアドレスにしてください。(アドレスの最後に¥マークを忘れずに!!)
Sub PDF化_WordVBA呼出し版()
'保存先と一時ファイルの設定。保存先アドレスの最後に\を付けること。
Const DESKTOP As String = "C:\Users\ユーザ名\Desktop\"
Const TEMP As String = "temp.RTF"
'選択しているメールをRTFファイルとして一時保存
Dim objItem As Object
Set objItem = ActiveExplorer.Selection(1)
objItem.SaveAs DESKTOP & TEMP, olRTF
'保存したRTFファイルをWordで開く
Dim appWord As Object
Set appWord = CreateObject("Word.Application")
Dim objRTF As Object
Set objRTF = appWord.Documents.Open(DESKTOP & TEMP)
'WordVBAでPDFとして保存(PDFフォーマットのコード番号は「17」)
objRTF.ExportAsFixedFormat DESKTOP & ファイル禁止文字処理(objItem.Subject) & ".pdf", 17
objRTF.Close
Set objRTF = Nothing
'一時保存したRTFファイルを削除
Kill DESKTOP & TEMP
'Wordを終了
appWord.Quit
End Sub
Function ファイル禁止文字処理(ByVal strFileName As String) As String
'それぞれ全角文字に置き換える
strFileName = Replace(strFileName, "\", "¥")
strFileName = Replace(strFileName, "/", "/")
strFileName = Replace(strFileName, ":", ":")
strFileName = Replace(strFileName, "*", "*")
strFileName = Replace(strFileName, "?", "?")
strFileName = Replace(strFileName, "<", "<")
strFileName = Replace(strFileName, ">", ">")
strFileName = Replace(strFileName, "|", "|")
strFileName = Replace(strFileName, "[", "[")
strFileName = Replace(strFileName, "]", "]")
'ダブルクオーテーション処理(VBAではダブルクオーテーションを書けないのでChrを使う)
strFileName = Replace(strFileName, Chr(34), Chr(&HFA57))
ファイル禁止文字処理 = strFileName
End Function
このコードは、まず保存先をConst(定数)で設定させています。
次にSaveAsメソッドでRTF形式で保存しています。
SaveAsメソッドは次のように第2引数を書くとmsgファイル以外のデータ形式で保存できます。
アイテムオブジェクト.SaveAs 保存先アドレス+ファイル名[, 保存形式]
[]は省略可の意。省略した場合はmsgファイルとして保存される
保存形式にolRTFと書くとRTF形式で保存できます。ちなみにRTF形式というのはリッチテキストフォーマットの略で、Microsoftが作ったフォーマットだそうです。
RTF形式でメールを一時保存したら、次はWordのお力をお借りします。
Word.ApplicationをappWordオブジェクトにセットし、Word VBAのExportAsFixedFormatメソッドを使います。
↓このようにコーディングすると、appWordオブジェクトを起点としてWord VBAを使えるようになります(エクセルでOutlook VBAを操作するときと同じような感じです)
Dim appWord As Object
Set appWord = CreateObject("Word.Application")
このappWordオブジェクトを起点に、Documents.OpenメソッドでRTFファイルを開き、さらにExportAsFixedFormatメソッドでPDFに変換しているのです。
ExportAsFixedFormatメソッド は次の書式です。第2引数の17はPDFを指しています。
ファイルオブジェクト.ExportAsFixedFormat 保存先アドレス+ファイル名, 17
ちなみに、第2引数が他に何があるか知りたい方はこちらを参照ください。
後はあと始末です。オブジェクトをNothingしたりします。
ここで、Killメソッドでファイルを削除しています。
Kill ファイルアドレス
また、次のコードでバックグラウンドで動いているWordを停止させます。
appWord.Quit
このappWord.Quitのコードを書かないと、パソコンの内部ではWordが起動したままとなり、パソコンを再起動した時に停止処理しなかったWordが起動することがあります(=いわゆるWordがゾンビになった状態)。必ずQuitしましょう。
最後にFuncionがありますが、これはメールの件名に「ファイル禁止文字」が入っていた場合、禁止されていない文字に変換するためのものです。詳しくはこちらの記事を御参照ください。
はまた別の記事で~
🦅バサバサ~
その2はこちら(Inspector.WordEditerを使う方法)
その3はこちら(PrintOutメソッドを使う方法)