【word vba】縦に列挙した文字列をフィールドコードで括弧で囲う
概要
段落区切りで区切られた文字列をVBAでフィールドコードに取り込む
送付文書の連名宛名の右側だけに右波括弧を付けて、波括弧の外に「殿」を付ける(私の職場の)習慣をもとにマクロを作成
前提条件
列挙される文字列は改行によって区切られている(段落内改行は今回は無視する)
敬称は「殿」だけとする(マクロを修正すれば、いかようにでも)
フィールドコード
{EQ \b\rc\}(\s(文字列1,文字列2,…)) 殿}
EQフィールド
数式用フィールド
\bスイッチ
文字列を括弧で囲う
\rcオプション
括弧を右側だけにする
\}
右括弧を波括弧にする
\sスイッチ
上付き・下付き設定。オプションなしの場合は文字列を上下に左揃いで列挙
※\sスイッチの代わりに、\aスイッチと\alオプションでも同じ。
VBA
Public Sub フィールドコード化()
If Selection.Fields.Count > 0 Then Exit Sub
If Selection.Paragraphs.Count = 1 Then Exit Sub
Dim c As Long
c = Selection.Paragraphs.Count
Call Selection.StartOf(wdParagraph, wdExtend)
Call Selection.EndOf(wdParagraph, wdExtend)
Dim p As Paragraph
Dim s As String
For Each p In Selection.Paragraphs
s = s + Trim(Replace(p.Range.Text, vbCr, "")) + " ,"
Next
s = Left(s, Len(s) - 1)
s = "\b\rc\}(\s(" + s + ")) 殿"
Dim f As Field
Set f = Selection.Fields.Add(Range:=Selection.Range, Type:=wdFieldFormula, Text:=s, preserveFormatting:=False)
f.Code.Text = Trim(f.Code.Text)
If c >= 5 Then
With f.Code.Find
.Text = "}"
.Replacement.Font.Scaling = 80
.Execute Replace:=wdReplaceAll
End With
End If
Selection.InsertParagraphAfter
Call Selection.StartOf(wdParagraph, wdExtend)
Selection.ParagraphFormat.BaseLineAlignment = wdBaselineAlignFarEast50
End Sub
Public Sub フィールドコード解除()
If Selection.Paragraphs.Count <> 1 Then Exit Sub
If Selection.Fields.Count <> 1 Then Exit Sub
Dim s As String
s = Trim(Selection.Fields(1).Code)
If InStr(1, s, "EQ \b\rc\}(\s(") = 0 Then Exit Sub
If InStr(1, s, ")) 殿") = 0 Then Exit Sub
s = Replace(s, "EQ \b\rc\}(\s(", "")
s = Replace(s, ")) 殿", "")
s = Replace(s, " ,", vbCr)
Selection.Text = Trim(s) & vbCr
End Sub
※コードの詳細は説明しません。
使い方
フィールドコード化したい複数行(正確には段落)を選択した状態で、フィールドコード化マクロを実行。
解除するときはフィールドコードを選択した状態で解除マクロを実行
仕様
5行以上になると波括弧は太くなるので、5行以上の場合は、波括弧の幅倍率を80%にしている。
段落書式の「文字の配置」は「下揃い」に設定。下揃いにしないと「殿」の位置がずれる。