帯

VBA Outlook転送元ヘッダのコンパクト化

転送メールを受け取った時、転送元メールに多くのメールアドレスが含まれたものだと、その情報だけで表示ウィンドウが埋め尽くされてしまい、転送メール本文までページスクロールさせるなど面倒になってきて、メールを読む気も失せてしまうことがあります。

そうならないための工夫として、転送メールの作成側で、転送元メールの宛先や写しに設定されたメールアドレス部分を削除したり、そのフォントサイズを小さく変更して行の高さを狭めることなどが考えられます。

ここでは、このフォントサイズを小さくする作業を、Outlookに組み込んだVBAプログラムで行えるようにしようと思います。

ツールの使用イメージ

Outlookメール編集ウィンドウで、クイックアクセスツールバーのコマンド(Project1.HeaderSizeCompact)ボタンを押すと、転送元メールの宛先や写しに設定されたメールアドレス部分のフォントサイズを小さく変更します。


同じくコマンド(Project1.HeaderSizeReturn)ボタンを押すと、フォントサイズを元に戻します。実際には、メールヘッダの ”From:” 部分のフォントサイズに合わせるように変更します。

モジュール構成

このツールプログラムは次の2つのモジュールで構成されます。
HeaderSize.bas メインモジュール
ClassWord.cls    Word編集のクラスモジュール

モジュールファイルの添付

Outlookにそのままインポートできるモジュールファイルを以下に添付します。ファイルをダウンロードして解凍したら、VBEを開いてファイルインポートします。
VBEの基本的な操作は「VBA Outlook開発環境の整備」を参照ください。

プログラム組込み後のVBEイメージです。

クイックアクセスツールバーにコマンド追加

Outlookウィンドウで、クイックアクセスツールバーにコマンドボタンとして、Project1.HeaderSizeCompactProject1.HeaderSizeReturnを追加します。ボタンアイコンはお好みで適当なものに変更してもよいでしょう。

プログラムの解説

HeaderSize.basメインモジュールのプログラムの主な内容を説明します。

HeaderSizeCompactは、転送元メールのヘッダのフォントサイズを小さく変更して、ヘッダ部をコンパクト化します。HeaderSizeReturnは、フォントサイズを元に戻します。
両方とも、FromPatternLoopを呼び出しますが、パラメータが0より大きい場合は、変更後のヘッダのフォントサイズ(ここではフォントサイズ=2)を指定し、パラメータが0以下の場合は、ヘッダのフォントサイズを元に戻すことを指定します。

Public Sub HeaderSizeCompact()
    Call FromPatternLoop(2)
End Sub

Public Sub HeaderSizeReturn()
    Call FromPatternLoop(0)
End Sub

FromPatternLoopは、メールヘッダのFromアイテムの2つのパターン「From:」「差出人:」に対応してループをまわして、HeaderSize関数を呼び出します。
また、On Error GoToを定義してエラー発生時に備えます。これは、テキスト形式のメールの時にフォントサイズを変更できず、HeaderSize関数内でエラーが発生するためです。

Private Sub FromPatternLoop(nFontSize As Single)
    On Error GoTo ERROR_EXIT
    
    Dim oWord As ClassWord: Set oWord = New ClassWord
    
    Dim sFrom As Variant
    For Each sFrom In Split("From:,差出人:", ",")
        Call HeaderSize(nFontSize, CStr(sFrom), oWord)
    Next sFrom
    Exit Sub

ERROR_EXIT:
    MsgBox "フォントサイズを変更できません。", vbCritical
End Sub

HeaderSizeは、転送メールヘッダのフォントサイズを変更する関数です。ヘッダサイズをコンパクト化する時と、ヘッダサイズを元に戻す時で処理を共用しています。
nFontSizeはフォントサイズを指定するパラメータで、0より大きい場合は変更サイズを、0以下の場合はサイズを元に戻すことを指定します。
メール文頭に移動してから、メールヘッダのFromアイテム名を検索します。

Private Sub HeaderSize(nFontSize As Single, sFrom As String, oWord As ClassWord)
    Dim nActualFontSize As Single: nActualFontSize = nFontSize
    oWord.MoveToTop
    Do While oWord.Find(sFrom)                  '"From:"が見つかった
        If nFontSize <= 0 Then                  'フォントサイズを戻す場合
            oWord.SelectCharNum 1               '"From:"の先頭1文字を選択
            nActualFontSize = oWord.GetFontSize
        End If
        oWord.ExtendToTail
        oWord.CollapseEnd                       '"From:~"の次行へ
        :
    Loop
    oWord.MoveToTop
End Sub

メールヘッダのループです。ヘッダのアイテム名末尾が「:」であることを前提として、アイテム名を切り出して、そのアイテム名で処理を分岐させます。
アイテム名が、"Sent", "送信日時"の時は、次の行まで読み飛ばします。
また、"To", "Cc", "CC", "宛先", "CC"の時は、改行文字までを選択してフォントサイズを変更します。
それ以外のアイテム名の時は、ループを終了します。

        Do
            oWord.ExtendUntilBeforeChars ":"    'ヘッダのアイテム名を選択
            Select Case oWord.GetText
                Case "Sent", "送信日時"
                    oWord.ExtendToTail
                    oWord.CollapseEnd           '"Sent~"の次行へ
                    
                Case "To", "Cc", "CC", "宛先", "CC"
                    oWord.ExtendToTail
                    oWord.SetFontSize nActualFontSize 'フォントサイズ変更
                    oWord.SetSimpleLine
                    oWord.CollapseEnd
                    
                Case Else
                    oWord.CollapseEnd
                    Exit Do                     '上記以外なら内側のループを終了
            End Select
        Loop

ClassWord.clsは、Word編集の機能を利用したクラスモジュールで、編集中のメールを処理します。各処理自体は、単純な文書の選択や検索などであり、主な関数ごとにコメントを付しているため、ここでの説明は省略します。(実は気の利いた関数名を付けられなかったので、コメントで捕捉しているところもあるのですが)(^_^;)


記事を気に入って頂き、お役に立てたら嬉しいです。