LoginSignup
1
2

More than 1 year has passed since last update.

WordのインデントをVBAで操作する

Posted at

はじめに

Microsoft Wordのインデントは、英語版に日本語版の設定を重ねたことによるのか、とてもクセがあるものになっています。
文頭が揃わず、イライラさせられることも多いのではないでしょうか。

さらに、インデントをVBAで操作しようとすると、それぞれのプロパティが複雑に絡み合い、一筋縄ではいきませんでした。

以下は、Wordのインデントに関する覚書です。

Wordのインデント

まず、Wordのインデントを確認しておきます。

インデントの種類

  • 字下げインデント
    doc1.png
    「最初の行(S)」に「字下げ」を設定することで1行目を字下げすることができます。
    「インデント」「左(L)」に設定した数値分、2行目以下がインデントされます。
    これに「字下げ」の「幅(Y)」に設定した数値分、1行目が字下げインデントされます。

  • ぶら下げインデント
    doc2.png
    「最初の行(S)」に「ぶら下げ」を設定することで1行目を字下げすることができます。
    「インデント」「左(L)」に設定した数値分、1行目がインデントされます。
    これに「ぶら下げ」の「幅(Y)」に設定した数値分、2行目以下がぶら下げインデントされます。

インデントの単位

config3.png
「字」単位以外に、「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系(LeftIndent・FirstLineIndent)
    doc1_2.png

  • char系(CharacterUnitLeftIndent・CharacterUnitFirstLineIndent)
    doc1_3.png

ぶら下げの場合

ぶら下げの場合、char系と非char系の値が示すものは違ってきます。
(B)CharacterUnitLeftIndent が適用される段落全体の突出部は1行目となり、(A)LeftIndent が適用される2行目以下とことなることとなるからです。

  • 非char系(LeftIndent・FirstLineIndent)
    doc2_2.png

  • char系(CharacterUnitLeftIndent・CharacterUnitFirstLineIndent)
    doc2_3.png

各プロパティの優先関係

非char系とchar系との間には、次のような関係があります。

  1. char系の値が0ならば、非char系の値が実際のインデントに反映される。
  2. char系に値が設定されれば、その前に非char系に0以外の値が設定されていても、char系の値が実際のインデントに反映される。
  3. char系に値が設定されていると、非char系の値を変更することができない。

このため、VBAで各プロパティを操作しようとするときには、次のことに気を付ける必要があります。

  • char系のプロパティにインデント幅として0を設定しようとしても、これに対応する非char系のプロパティに値が設定されている場合、上記1.のルールが適用されてしまい、思わぬ結果となる。このため、char系のプロパティに0を設定する前に、対応する非char系のプロパティの値も0にしておく必要がある。
  • 非char系に値を設定しようとする場合、その前に、これに対応するchar系のプロパティの値を0にしておく必要がある。
1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2