テキスト形式のメールを指定文字数で折り返すマクロ


コメントにて以下のようなご要望をいただきました。


Outlook2010を使用しています。
ほぼ1年前の124のコメントで「ある」さんが書かれていますが、私も送信してみないと折り返しの状況がわからないのは大変不便に感じています。
「ある」さんのご要望は送信前のプレビューでしたが、いっそのことVBAで強制的に改行させることはできませんでしょうか?
使い方としては、
1.普通にメールを作成
2.整形したい部分を範囲選択
3.マクロ実行で、その部分を整形(折り返し桁数で改行)
4.必要に応じて修正
5.メールを送信
のような感じです。
高機能な整形は不要で、単純に強制改行させるだけで良いのですが、マクロのご検討をお願いできませんでしょうか?


こちら、選択した範囲ではなくメール本文全体を折り返すということであれば、以下のようなマクロで可能です。一応、半角英数字で構成される単語は途中で改行しないようなロジックを入れたため、ちょっと複雑になっています。

‘ ここをトリプルクリックでマクロ全体を選択できます。
Public Sub WrapLines()
    Const LINE_MAX = 70 ‘ 折り返しの文字数を指定します
    Dim strBody As String
    Dim strNewBody As String
    Dim strLine As String
    Dim c As String
    Dim pCur As Long
    Dim pWB As Long
    Dim iLen As Long
    Dim bWrap As Boolean
    ‘
    strBody = ActiveInspector.CurrentItem.Body
    strBody = Replace(strBody, vbCrLf, vbLf)
    pCur = 1
    pWB = 0
    strNewBody = ""
    strLine = ""
    iLen = 0
    pc = ""
    bWrap = False
    While pCur <= Len(strBody)
        c = Mid(strBody, pCur, 1)
        If c = vbLf Then
            If Not bWrap Then
                strNewBody = strNewBody & strLine & vbLf
            End If
            strLine = ""
            iLen = 0
            pWB = 0
            bWrap = False
        ElseIf Asc(c) < 0 Or &H7F < Asc(c) Then
            iLen = iLen + 2
            If iLen + 1 >= LINE_MAX Then
                strNewBody = strNewBody & strLine & c & vbLf
                strLine = ""
                iLen = 0
                bWrap = True
            Else
                strLine = strLine & c
                bWrap = False
            End If
            pWB = Len(strLine)
        Else
            If c = " " Then
                pWB = Len(strLine) + 1
                bWrap = False
            End If
            iLen = iLen + 1
            If iLen >= LINE_MAX Then
                If pWB > 0 Then
                    strNewBody = strNewBody & Left(strLine, pWB) & vbLf
                    strLine = Mid(strLine, pWB + 1) & c
                    If c = " " Then
                        If Mid(strBody, pCur – 1, 1) <> vbLf And Mid(strBody, pCur + 1, 1) <> " " Then
                            strLine = ""
                        End If
                    End If
                    bWrap = False
                Else
                    strNewBody = strNewBody & strLine & c & vbLf
                    strLine = ""
                    bWrap = True
                End If
                iLen = LenB(StrConv(strLine, vbFromUnicode))
            Else
                strLine = strLine & c
                bWrap = False
            End If
        End If
        pCur = pCur + 1
        Debug.Print iLen, bWrap, strLine
    Wend
    If strLine <> "" Then
        strNewBody = strNewBody & strLine
    End If
    ActiveInspector.CurrentItem.Body = strNewBody
End Sub

マクロの登録方法やメニューへの追加について

広告

テキスト形式のメールを指定文字数で折り返すマクロ」への6件のフィードバック

  1. どうもありがとうございました。
    今帰省中で手元のOutlook2003でしか試せていないのですが、LINE_MAX=70の設定で、ちょうど70文字の行にこのマクロを実行すると最後の単語が消えてしまいました。
    (例えば、abc defg hij klmn opqrs tuvwxyz abc defg hij klmn opqrs tuvwxyz abc deという行があったとすると、最後のdeが消えてしまいます。)
    お手数ですが、修正をお願いできますと幸甚です。
    よろしくお願いいたします。

      • あけましておめでとうございます。
        お正月にもかかわらず対応していただきどうもありがとうございます。
        残念ながら修正していただいたマクロでも同じ問題が出てしまいましたが、27行目の「strLine = “”」を26行目(「End If」の前)に移したところ問題が解消されたように思います。この変更によって他の問題が予見されるようであればご教示ください。

      • さらに修正してみました。
        strLineの位置を動かすと改行位置が指定文字数を超える可能性があると思われるのでロジックのミスを修正しています。

  2. ご連絡が遅くなりました。
    修正していただいたマクロでうまく動いていることを確認しました。
    便利に使わせていただきます。
    どうもありがとうございました。

    以下は余談です。
    Outlook2010で動作確認をしている際に見つけたのですが、一行が41桁以上の英文の場合はその行の最後で改行していてもその改行コードが無視されてしまうようですね。(ただし、英文ではない行や、次の行が改行のみの場合は例外)
    「strBody = Replace(strBody, vbCrLf, vbLf)」で41桁以上の英文行ではvbLfがなくなってしまうので気が付きました。

  3. 以下の部分、見直していただけないでしょうか?張り付けて実行したところ、エラーになります。
    If Mid(strBody, pCur – 1, 1) vbLf And Mid(strBody, pCur + 1, 1) ” ” Then
    strLine = “”

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中