HTML形式メールの本文の書式設定を保持しながら文字列を追加&おまけ(日付符号とその置換)

【スポンサーリンク】




メールの本文に各ユーザーの書式設定を保持したまま文字列を追加する方法がわからなくてかなり悩んだけど、なんとか解決できたのでメモ。

メール作成

  • メールは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



【スポンサーリンク】