Word VBA/マクロ 備忘録

作業効率化のため作成したマクロをバックアップ代わりにアップしていきます。

【Word VBA/マクロ】コメントユーザー名の変更

サンプルコードでできること

コメントの特定の作成者の名前を変更します。

Sub コメントユーザー名変更()
'コメントのユーザー名を変更します。
    Dim cmt As Comment, strInitial As String
    Dim MaeName As String, AtoName As String
    
    MaeName = "たなか" '変更前の名前
    AtoName = "Tanaka" '変更後の名前
    strInitial = "T" '変更後のイニシャル
    
    For Each cmt In ActiveDocument.Range.Comments
        With cmt
            .Author = AtoName
            .Initial = strInitial
        End With
    Next
End Sub

コードの説明

For Eachを用いて、特定の作成者を1つずつ変更します。
Authorプロパティは、オブジェクトブラウザの非表示メンバーのため、薄い文字で表示されます。
(「非表示のメンバーを表示」をオンで表示できます。)

【Word VBA/マクロ】表内のテキスト左揃え

サンプルコードでできること

表内の両端揃えのテキストを左揃えに変更します。

Sub TblTextLeft()
    Dim cel As Cell, tbl As Table
    Dim para As Paragraph
    
    For Each tbl In ActiveDocument.Tables
        For Each cel In tbl.Range.Cells
            For Each para In cel.Range.Paragraphs
                With para
                    If .Alignment = wdAlignParagraphJustify Then
                        .Alignment = wdAlignParagraphLeft
                    End If
                End With
            Next
        Next
    Next
End Sub

【Word VBA/マクロ】インデント解除

サンプルコードでできること

インデントを解除します。

Sub インデントなしに設定()
    With Selection.ParagraphFormat
        .CharacterUnitLeftIndent = 0
        .CharacterUnitFirstLineIndent = 0
        .LeftIndent = 0
        .FirstLineIndent = 0
    End With
End Sub

コードの説明

左インデントが「1字」に設定されている段落で、次のコードを実行します。

    With Selection.ParagraphFormat
        .CharacterUnitLeftIndent = 0
        .CharacterUnitFirstLineIndent = 0 '今回の例ではなくてもOK
    End With

CharacterUnitLeftIndentは左インデント、CharacterUnitFirstLineIndent は字下げインデントのプロパティです。


コードを実行した結果がこちらです。

「1字」が「3.7mm」に変わっただけで、0になりません。LeftIndentを0に指定する必要があります。

        .LeftIndent = 0
        .FirstLineIndent = 0'今回の例ではなくてもOK

【Word VBA/マクロ】字下げインデントの指定/ぶら下げインデントの指定

インデント設定は、単位によってコード記述に違いがあります。くり返しコードを修正しても、思いどおりに動作せず混乱しました。ようやく理解しても、すぐに忘れるため、設定の基本を残しておこうと思います。

サンプルコードでできること

○字単位、mm単位でインデントを指定します。

コードの説明

  • mm単位でインデントを指定するとき、CharacterUnitLeftIndent とCharacterUnitFirstLineIndent を0に設定。その後LeftIndent とFirstLineIndent の数値を指定。
  • 字下げインデントを設定するとき、左インデントと字下げインデントで指定する数値は、段落設定画面に入れる数値を同じです。

○字単位で指定する場合、CharacterUnitLeftIndent は「2」、CharacterUnitFirstLineIndent は1。次の図と同じ数値です。

mmで指定する場合、LeftIndentはMillimetersToPoints(10)、FirstLineIndent はMillimetersToPoints(3.7)。次の図と同じ数値です。

  • ぶら下げインデントの設定の数値は、○字とmm単位で異なります。○字単位指定の場合、左インデントはCharacterUnitLeftIndent プロパティに次の図と同じ数値を指定。ぶら下げインデントは、設定したい数値にマイナスを付けて、CharacterUnitFirstLineIndent プロパティに指定します。「3字」に設定した場合、「-3」です。


  • mm単位で設定する場合、画面と違う数値を入れるため分かりづらいです。LeftIndent に入れるのは、左インデントとぶら下げインデントを足した値です。左インデント10mm、ぶら下げ5mmに指定するとき、2つの値を足して15をLeftIndent に格納します。FirstLineIndent に入れるのは、○字単位のときと同じで、設定したい値にマイナスを付けた数字です。5mmインデントの時は、MillimetersToPoints(-5)を格納します。


Sub ○字単位で字下げインデント設定()
    With Selection.ParagraphFormat
        .CharacterUnitLeftIndent = 2
        .CharacterUnitFirstLineIndent = 1
    End With
End Sub

処理した結果の画面


Sub mm単位で字下げインデント設定()
    With Selection.ParagraphFormat
        .CharacterUnitLeftIndent = 0
        .CharacterUnitFirstLineIndent = 0
        .LeftIndent = MillimetersToPoints(10)
        .FirstLineIndent = MillimetersToPoints(3.7)
    End With
End Sub

処理した結果の画面


Sub ○字単位でぶら下げインデント設定()
    With Selection.ParagraphFormat
        .CharacterUnitLeftIndent = 1
        .CharacterUnitFirstLineIndent = -3
    End With
End Sub

処理した結果の画面


Sub mm単位でぶら下げインデント設定()
    With Selection.ParagraphFormat
        .CharacterUnitLeftIndent = 0
        .CharacterUnitFirstLineIndent = 0
        .LeftIndent = MillimetersToPoints(15)
        .FirstLineIndent = MillimetersToPoints(-5)
    End With
End Sub

処理した結果の画面

【Word VBA/マクロ】インデントの単位変換(○字→mm)

サンプルコードでできること

インデントの単位○字をmmかptに変更します。変更される単位はオプションの設定によります。

次のような単位が不揃いの時に使用します。

Sub インデントの単位_mmやptに変換()
    Dim para As Paragraph
    
    For Each para In Selection.Paragraphs
        With para.Range.ParagraphFormat
            .CharacterUnitFirstLineIndent = 0
            .CharacterUnitLeftIndent = 0
        End With
    Next para
End Sub

コードの説明

        With para.Range.ParagraphFormat
            .CharacterUnitFirstLineIndent = 0
            .CharacterUnitLeftIndent = 0
        End With

CharacterUnitFirstLineIndentは字下げ(ぶら下げ)インデント、CharacterUnitLeftIndentは左インデントを「○字」で指定するプロパティです。これを「0」にするだけで、mm(pt)表示に変更されます。
mm(pt)に換算して、LeftIndentやFirstLineIndentの値を格納する必要があると思い込んでいました。


試しに .CharacterUnitLeftIndent で左インデント3字を指定、次に .LeftIndentで5mm指定しました。

    With Selection.ParagraphFormat
        .CharacterUnitLeftIndent = 3 '左インデント3字指定
        .LeftIndent = 5 '左インデント5mm指定
    End With

処理の結果、CharacterUnitLeftIndent の3字指定が優先されました。

  • CharacterUnitLeftIndentや CharacterUnitFirstLineIndentに0以外の数値が設定。⇒LeftIndent やFirstLineIndentに値を設定しても、インデントに反映されない。
  • CharacterUnitLeftIndentや CharacterUnitFirstLineIndentが0。⇒LeftIndent やFirstLineIndentの値がインデントに反映される。
  • ○字単位のインデントが指定された段落の値を変更するとき、 CharacterUnitLeftIndentやCharacterUnitFirstLineIndentで値を指定するか、値を0にしてmm(pt)単位に変更後、LeftIndent 、FirstLineIndentで指定する。

【Word VBA/マクロ】選択セルの指定方法


選択した2つのセルを処理するとき、次のコードを使用します。

Selection.Cells


次のコードは、Selectionの後にRangeが入ります。Selection.Cellsと同じと思っていたら、2列目の1行目のセルも含まれるようです。

Selection.Range.Cells


セル数を確認すると、2つ選択しているのに、結果は「3」になります。

Debug.Print Selection.Range.Cells.Count

【Word VBA/マクロ】段落番号の後にタブを挿入

サンプルコードでできること

選択した段落の段落番号の後にタブを挿入します(処理対象は自動番号ではなく、テキストの番号)。スペースが挿入されている場合は削除して、代わりにタブを挿入します。

下記の番号の種類を段落番号と判定しています。
(数字のみは段落番号と判定。aのみは段落番号と判定しない。)
1、1.、1)、(1)、[1]、a.、a)

Sub 段落番号の後にタブ挿入()
    数字の後に挿入 vbTab
    英字の後に挿入 vbTab
    括弧数字の後に挿入 vbTab
End Sub

Private Sub 数字の後に挿入(str As String)
    Const strFirst As String = "[))0-9..]"
    Dim i As Long, rngSel As Range
    Dim para As Paragraph
    Set rngSel = Selection.Range
    
    For Each para In Selection.Paragraphs
        With para.Range
            If IsNumeric(.Characters(1).Text) = False _
                Then GoTo Continue
            i = 2
            Do While .Characters(i).Text Like strFirst
                i = i + 1
            Loop
            Do While .Characters(i).Text = " " _
                Or .Characters(i).Text = " " _
                Or .Characters(i).Text = vbTab
                     .Characters(i).Text = ""
            Loop
            .Characters(i - 1).InsertAfter str
        End With
Continue:
    Next
End Sub

Private Sub 英字の後に挿入(str As String)
    Const strAlpha As String = "[a-z]"
    Const strKigo As String = "[..))]"
    Dim i As Long, rngSel As Range
    Dim blKigo As Boolean
    Dim para As Paragraph
    Set rngSel = Selection.Range

    For Each para In Selection.Paragraphs
        blKigo = False
        With para.Range
            If Not (.Characters(1).Text Like strAlpha) _
                Then GoTo Continue
            i = 2
            If .Characters(i).Text Like strAlpha Then
                Do While .Characters(i).Text Like strAlpha
                    i = i + 1
                Loop
                Do While .Characters(i).Text Like strKigo
                    i = i + 1
                    blKigo = True
                Loop
            ElseIf .Characters(i).Text Like strKigo Then
                Do While .Characters(i).Text Like strKigo
                    i = i + 1
                    blKigo = True
                Loop
            End If
            If blKigo = True Then
                Do While .Characters(i).Text = " " _
                    Or .Characters(i).Text = " " _
                        Or .Characters(i).Text = vbTab
                         .Characters(i).Text = ""
                Loop
                .Characters(i - 1).InsertAfter str
            End If
        End With
Continue:
    Next
End Sub

Private Sub 括弧数字の後に挿入(str As String)
    Const strNum As String = "[0-9]"
    Dim i As Long, rngSel As Range
    Dim para As Paragraph
    
    Set rngSel = Selection.Range
    
    For Each para In Selection.Paragraphs
        i = 1
        With para.Range
            If .Characters(i).Text <> "(" And _
                .Characters(i).Text <> "[" Then GoTo Continue
            i = i + 1
            Do While .Characters(i).Text Like strNum
                i = i + 1
            Loop
            If .Characters(i).Text <> ")" And _
                .Characters(i).Text <> "]" Then GoTo Continue
            i = i + 1
            Do While .Characters(i).Text = " " _
                Or .Characters(i).Text = " " _
                Or .Characters(i).Text = vbTab
                     .Characters(i).Text = ""
            Loop
            .Characters(i - 1).InsertAfter str
        End With
Continue:
    Next
End Sub

コードの説明

数字後に挿入 vbTab

vbTabを" "や" "に変えると、段落番号の後に半角や全角スペースを挿入できます。