段落の有効幅(テキスト領域の幅)を求める関数です。Wordではテキストの幅に関係なく余白にはみ出してオブジェクトを配置できてしまうので、はみ出さずにきれいに揃えたいときに使います。
幅を直接返すParagraph.Width
のような都合のよいプロパティはないため、いくつかの条件や状態を反映させて算出する必要があります。
段落の有効幅を求めるFunction
' RNG: 1段落(またはその一部)のRange
Function f_GetMaxWidth(RNG As Range) As Single
Dim widMax As Single
With RNG
If .Information(wdWithInTable) Then
'表内の場合はセル幅と余白値から
With .Cells(1)
widMax = .Width - (.LeftPadding + .RightPadding)
End With
Else
'セクション幅(段組幅が異なる場合には非対応)
widMax = .Sections(1).PageSetup.TextColumns(1).Width
End If
'段落の幅(左右インデント)
With .Paragraphs(1)
widMax = widMax - (.LeftIndent + RightIndent)
End With
End With
f_GetMaxWidth = widMax
End Function
解説
引数RNGの範囲
1段落(またはその一部)のRange
を前提にしています。複数の領域にかかることはないため、RNG.Cells(1)
ならその段落があるセル、RNG.Sections(1)
ならその段落があるセクション と特定できます。
Range.Information(wdWithInTable)
Range
が表内かどうかを求められます。本例に限らず、表の中か外かで分岐が必要な処理は少なくないため重宝なプロパティです。
表内(セル内)の段落の幅
「セルの幅 -
セル内の左右余白」 が段落の幅となります。
表外の段落の幅
「段組みの幅」が段落の幅となります。1段組みの場合は「ページ幅 -
左右余白」と同じ値です。
なお、TextColumns(1).Width
は1番目の段を指します。Range
が何段目にあるかを求める方法がないため、1番目から取得しています。このため、段ごとに幅が異なるレイアウトには非対応となっています。
段落幅からテキスト幅へ
段落には左右にインデントを設定できます。したがって、段落幅 -
左右インデント幅 を求めてようやくテキスト領域の幅が取得できたわけです。
この関数を応用した例がこちらです。