選択しているものの状態を把握する

Selection.Typeで判断する

Selection.Typeでは選択しているものの種類が取得できます。戻り値はWdSelectionType列挙隊です。代表的なものでは以下の通りとなります。

名前

選択されているアイテム

wdSelectionIP

1

選択範囲なし

wdSelectionNormal

2

複数文字・セクション区切り・リストアイテム

wdSelectionColumn

4

表のセル・表の列/行

wdSelectionRow

5

表全体

wdSelectionInlineShape

7

行内図形

wdSelectionShape

8

図形

異なる種類のアイテムが複数選択されている状態では、wdSelectionNormalが取得されます。

wdSelectionIP

この状態と判断された時はおおよそ何も選択されていない時と判断できます。

wdSelectionNormal

これは複数の文字が選択されているときや複数のパラグラフが選択されているときにこの定数が返ってきます。経験上、選択されている範囲にそのまま何かしらの処理をするか、もしくは選択範囲の個々のパラグラフに対して処理を行うかで大きく実装が変わってきます。選択範囲の全体を赤文字にする処理と、選択範囲のパラグラフを赤文字と青文字に交互に設定する例を以下にあげます。

【選択範囲にそのまま処理を実装する場合】
Selection.Font.ColorIndex = wdRed
【選択範囲の個々のパラグラフに処理を実装する場合】
Sub Macro1()
  Dim p As Paragraph
  Dim i As Integer
  i = 0
  For Each p In Selection.Paragraphs
    If i Mod 2 = 0 Then
      p.Range.Font.ColorIndex = wdRed
    Else
      p.Range.Font.ColorIndex = wdBlue
    End If
    i = i + 1
  Next
End Sub

パラグラフ全体が選択されているかの判断をする

複数文字が選択されているときにこの定数が返されますが、実際にパラグラフ全体が選択されているか判断するケースがあります。この場合は、選択範囲とパラグラフの範囲の関係によって判断知ることができます。具体的にいうと選択範囲の開始位置よりパラグラフの開始位置が後ろである、かつパラグラフの終了位置が選択範囲の終了位置より前であればパラグラフが包括して選択されていると判断できます。

Sub Macro1()
  Dim p As Paragraph

  For Each p In Selection.Paragraphs
    If Selection.Start <= p.Range.Start And p.Range.End <= Selection.End Then
      MsgBox "パラグラフが全部選択されている"
    Else
      MsgBox "パラグラフの一部選択されている"
    End If
  Next

End Sub

リストパラグラフが選択されているかの判断をする

選択範囲が通常のパラグラフかリストパラグラフかの判断をするケースもあります。これは選択範囲のパラグラフ中にリストパラグラフが含まれているかによって判断することができます。実際はパラグラフのリストパラグラフの数が一つ以上あればそのパラグラフはリストパラグラフであると判断ができます。

Sub Macro1()
  Dim p As Paragraph
  
  For Each p In Selection.Paragraphs
    If p.Range.ListParagraphs.Count > 0 Then
      MsgBox "リストパラグラフです"
    Else
      MsgBox "その他パラグラフです"
    End If
  Next

End Sub

表の中のパラグラフが選択されているかの判断をする

選択しているものが表の中にあるかを判断するにはSelection.Informationメゾットの引数に”wdWithInTable”を渡し、その返り値がTrueであれば表内が選択されている、Falseであれば表外も選択されていると判断をすることができます。

Sub Macro1()

  If Selection.Information(wdWithInTable) Then
      MsgBox "表内のみが選択されています"
  Else
      MsgBox "表外のみまたは表内外が選択されています"
  End If

End Sub

なおInformationメゾットはSelectionオブジェクトにしか用意されていないため、個々のパラグラフが表内であるかの判断は独自に実装してあげる必要があります。具体的にはそのパラグラフの範囲の表の数によって判断できます。この時Range.Tablesは該当のパラグラフを包括している表をしまします。パラグラフの中にある表ではないので注意して下しさい。

Sub Macro1()

  Dim p As Paragraph
  For Each p In Selection.Paragraphs
    If p.Range.Tables.Count > 0 Then
      MsgBox "表内のパラグラフです"
    Else
      MsgBox "表外のパラグラフです"
    End If
  Next

End Sub

wdSelectionColumn

この状態と判断された時は通常表のセル・表の列/行が選択されている状態と判断できます。また、表の最終行(改行)が選択されているときもこの定数が返ってきます。

表列の改行を判断する

この改行を判断するにはwdSelectionColumnが返ってきているのを前提として、選択範囲のセルの数によって判断することができます。表はセルの集合体です。そのセルが選択されていると判断されているにも関わらず、セルがないということは最終行であると判断できます。

Sub Macro1()
  【選択範囲全体を検査する場合】
  If Selection.Type = wdSelectionColumn Then
    If Selection.Cells.Count > 0 Then
      MsgBox "通常のセルです"
    Else
      MsgBox "最終行です"
    End If
  End If
  
  【選択範囲の個々のパラグラフを検査する場合】
  Dim p As Paragraph
  For Each p In Selection.Paragraphs
    If p.Range.Tables.Count > 0 Then
      If p.Range.Cells.Count > 0 Then
        MsgBox "通常のセルです"
      Else
        MsgBox "最終行です"
      End If
    End If
  Next
 
End Sub