はじめに
Microsoft Wordのインデントは、英語版に日本語版の設定を重ねたことによるのか、とてもクセがあるものになっています。
文頭が揃わず、イライラさせられることも多いのではないでしょうか。
さらに、インデントをVBAで操作しようとすると、それぞれのプロパティが複雑に絡み合い、一筋縄ではいきませんでした。
以下は、Wordのインデントに関する覚書です。
Wordのインデント
まず、Wordのインデントを確認しておきます。
インデントの種類
-
字下げインデント
「最初の行(S)」に「字下げ」を設定することで1行目を字下げすることができます。
「インデント」「左(L)」に設定した数値分、2行目以下がインデントされます。
これに「字下げ」の「幅(Y)」に設定した数値分、1行目が字下げインデントされます。 -
ぶら下げインデント
「最初の行(S)」に「ぶら下げ」を設定することで1行目を字下げすることができます。
「インデント」「左(L)」に設定した数値分、1行目がインデントされます。
これに「ぶら下げ」の「幅(Y)」に設定した数値分、2行目以下がぶら下げインデントされます。
インデントの単位
「字」単位以外に、「mm」単位でもインデント幅を設定することができます。
「mm」単位だとうまく行頭が揃いませんし。
また、「字」単位と混在することがVBAでの操作でも支障を来すもととなっています。
VBAにおけるインデント関係のプロパティ
ParagraphFormatオブジェクトのプロパティとして、次の4つがあります。
(A)LeftIndent と (B)CharacterUnitLeftIndent が全体のインデント幅を設定するプロパティです。
そして、(C)FirstLineIndent と (D)CharacterUnitFirstLineIndent が字下げ・ぶら下げ幅のプロパティです。
また、(A)LeftIndent と (C)FirstLineIndent が「mm単位」のインデント幅と紐付けされるプロパティで、単位は「ポイント」です。これに対し、(B)CharacterUnitLeftIndent と (D)CharacterUnitFirstLineIndent が「字単位」のインデント幅と紐付けされるプロパティで、単位は「字」です。
以下、便宜上、前者を「非char系」、後者を「char系」と総称します。
各プロパティの関係
(A)LeftIndent に値を設定すれば、(B)CharacterUnitLeftIndent に反映され、逆もまた真なり…であればいいのですが、そうはなりません。
非char系とchar系は完全に独立しています。
また、そもそも、どの部分を示す値なのかすら異なります。
そして、非char系の設定とchar系の設定が相互に邪魔をし合うことすらあります。
各プロパティの値が示すもの
- (A)LeftIndent … 2行目以下の絶対的なインデント幅
- (B)CharacterUnitLeftIndent … 段落全体の突出部のインデント幅
- (C)FirstLineIndent … LeftIndentを基準とする1行目の相対的なインデント幅
- (D)CharacterUnitFirstLineIndent … プラスの値なら字下げ幅、マイナスならぶら下げ幅
ひとことで表せば上記のとおりですが、以下、具体的に見ていきます。
字下げの場合
字下げの場合、結果としてchar系と非char系の値が示すものは異なりません。
(B)CharacterUnitLeftIndent が適用される段落全体の突出部が2行目となり、(A)LeftIndent の適用行と同じとなるからです。
ぶら下げの場合
ぶら下げの場合、char系と非char系の値が示すものは違ってきます。
(B)CharacterUnitLeftIndent が適用される段落全体の突出部は1行目となり、(A)LeftIndent が適用される2行目以下とことなることとなるからです。
各プロパティの優先関係
非char系とchar系との間には、次のような関係があります。
- char系の値が0ならば、非char系の値が実際のインデントに反映される。
- char系に値が設定されれば、その前に非char系に0以外の値が設定されていても、char系の値が実際のインデントに反映される。
- char系に値が設定されていると、非char系の値を変更することができない。
このため、VBAで各プロパティを操作しようとするときには、次のことに気を付ける必要があります。
- char系のプロパティにインデント幅として0を設定しようとしても、これに対応する非char系のプロパティに値が設定されている場合、上記1.のルールが適用されてしまい、思わぬ結果となる。このため、char系のプロパティに0を設定する前に、対応する非char系のプロパティの値も0にしておく必要がある。
- 非char系に値を設定しようとする場合、その前に、これに対応するchar系のプロパティの値を0にしておく必要がある。