段落の幅(テキストの幅)を求める関数

段落の有効幅(テキスト領域の幅)を求める関数です。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番目から取得しています。このため、段ごとに幅が異なるレイアウトには非対応となっています。

段落幅からテキスト幅へ
段落には左右にインデントを設定できます。したがって、段落幅 - 左右インデント幅 を求めてようやくテキスト領域の幅が取得できたわけです。

 

この関数を応用した例がこちらです。

タイトルとURLをコピーしました