メールの本文に各ユーザーの書式設定を保持したまま文字列を追加する方法がわからなくてかなり悩んだけど、なんとか解決できたのでメモ。
メール作成
- メールはHTML形式で作成
- フォント、およびフォントサイズは固定でなく、各ユーザーの書式設定を使用
答えはMailItem.GetInspector プロパティ (Outlook)にありました。
メールの本文欄(MailItem).GetInspector.WordEditor
をWordオブジェクトとして扱い、wdDoc.Range(0)
で本文欄の先頭を取得→wdRange.InsertBefore "本文"
で先頭に本文を挿入、という処理。
「HTMLタグでフォント指定して(MailItem).HTMLBody
と繋げる」という処理をしているメール作成VBSを流用したのもあり、ずっと「フォント設定はどこから取得するんだ?」という発想でやっていましたが、そもそも「本文の先頭に文字列を追加」でよかったという。
Private Sub メール作成ボタン_Click() Rem 参照設定:Microsoft Outlook 16.0 Object Library Dim olApp As New Outlook.Application Dim olMail As Outlook.MailItem Rem 参照設定:Microsoft Word 16.0 Object Library Dim wdDoc As Word.Document Dim wdRange As Word.Range Rem HTML形式でメールを作成 Set olMail = olApp.CreateItem(0) olMail.BodyFormat = 2 Rem 送付先 olMail.To = "to@test" olMail.Cc = "cc@test" olMail.Bcc = "bcc@test" Rem 件名 olMail.Subject = "件名" Rem 本文 olMail.Display Set wdDoc = olMail.GetInspector.WordEditor If Not wdDoc Is Nothing Then Set wdRange = wdDoc.Range(0) '本文欄の先頭を取得 wdRange.InsertBefore "本文" '先頭に挿入 End If Set wdRange = Nothing: Set wdDoc = Nothing Set olMail = Nothing Set olApp = Nothing End Sub
※実際は送付先/件名/本文に固定の文字列ではなくテーブルに記録したデータを使用していますが、単にrs.OpenしてMailItemに突っ込むだけなので省略。
olMail.GetInspector.WordEditor.Content.Font.Size
でフォントサイズが取得できるけど、何故かものすごく大きな数字になるとか。
テーマのフォントを使っているとolMail.GetInspector.WordEditor.Content.Font.Name
ではフォント名を取得できないとか。
上の方法でサイズとフォントを取得してHTMLタグに入れて.HTMLBody
と繋げても、署名のフォント設定に引っ張られるとか。
結構色々考えたんですけど、これらは全部使いませんでした。
おまけ
メールテンプレートを作成するフォームを作成し、「可変の内容に対応できるように置換される文字列」を挿入する『符号追加ボタン』を設置した。
「メールの作成日」を件名・本文に挿入できるボタンも作成し、7パターンの符号を追加できるようにした。
- [日付:m.d]
- [日付:m/d]
- [日付:mm.dd]
- [日付:mm/dd]
- [日付:yyyy.mm.dd]
- [日付:yyyy/mm/dd]
- [日付:yyyy年m月d日]
メール作成処理に組み込むことで、符号内で指定されたフォーマットで日付を挿入できる。
ボタンで挿入できるのは7パターンだが、書式のアレンジにも対応できる処理にしている。
Dim strBody As String Dim fugou As String, fugDate As String strBody = rs!ml_Body Rem 日付符号が含まれている間処理する Rem 複数の符号が入っている可能性を考慮してループ処理 Do While InStr(1, strBody, "[日付:") > 0 fugou = GetF1toF2(strBody, "[", "]") '日付符号を抽出 fugDate = Format(Date, Mid(fugou, 5, Len(fugou) - 5)) '日付符号のフォーマットで今日の日付を変換 strBody = Replace(strBody, fugou, fugDate) '日付符号を日付に置換 Loop
上記の処理には文字列を抽出するユーザー定義関数を使用している。
Function GetF1toF2(strTgt, strFind1, strFind2) As String Rem Get Find1 To Find2 Rem 検索対象文字列(strTgt)内を先頭から検索し,検索文字列1(strFind1)から検索文字列2(strFind2)までを返す。 On Error Resume Next GetF1toF2 = Left(Mid(strTgt, InStr(1, strTgt, strFind1)), InStr(1, Mid(strTgt, InStr(1, strTgt, strFind1)), strFind2)) End Function