現在いるテーブルを操作するVBAモジュールを実行できるようにしたいと思います(つまり、カーソルはそのテーブル内のどこかにあります)。 VBAコードは、実行時に現在の各テーブルで同じ操作を実行します。
したがって、たとえば、各テーブルの一番上の行(見出し)を太字にする必要があるモジュールがあるとします。 whatever.rows(0)
を操作できるように、現在使用しているテーブルオブジェクト(whatever
と呼ばれる)を見つける必要があります。
カーソル位置からテーブルオブジェクトを取得するにはどうすればよいですか?また、テーブル内でnotであるかどうかを検出し、何もしない(またはエラーダイアログを表示する)必要があります。
この回答の下部にあるVBAサブルーチンは、これを行う方法を示しています。
現在の選択を使用し、最初に開始点に折りたたんで、マルチセグメントの選択について心配する必要がないようにします。
_Selection.Collapse Direction:=wdCollapseStart
_
次に、その選択をチェックして、テーブル内にあることを確認します
_ If Not Selection.Information(wdWithInTable) Then
MsgBox "Can only run this within a table"
Exit Sub
End If
_
次に、Selection.Tables(1)
を参照してテーブルにアクセスできます。
以下のコードは、テーブルの各行の開始セルをそれぞれ切り替えて、垂直バーマーカーを挿入または削除する、単純な概念実証でした。
_Sub VertBar()
' Collapse the range to start so as to not have to deal with '
' multi-segment ranges. Then check to make sure cursor is '
' within a table. '
Selection.Collapse Direction:=wdCollapseStart
If Not Selection.Information(wdWithInTable) Then
MsgBox "Can only run this within a table"
Exit Sub
End If
' Process every row in the current table. '
Dim row As Integer
Dim rng As Range
For row = 1 To Selection.Tables(1).Rows.Count
' Get the range for the leftmost cell. '
Set rng = Selection.Tables(1).Rows(row).Cells(1).Range
' For each, toggle text in leftmost cell. '
If Left(rng.Text, 2) = "| " Then
' Change range to first two characters and delete them. '
rng.Collapse Direction:=wdCollapseStart
rng.MoveEnd Unit:=wdCharacter, Count:=2
rng.Delete
Else
' Just insert the vertical bar. '
rng.InsertBefore ("| ")
End If
Next
End Sub
_
これはかなり古い質問だと思いますが、同様の問題に直面している次の人を助ける可能性のあるコードに出くわしました。
ActiveDocument.Range(0, Selection.Tables(1).Range.End).Tables.count
これにより、カーソルが置かれているテーブルのインデックスが返されます。これを使用して、変更を加えたり、情報を取得したりできます。
dim numberOfColumnsInCurrentTable as Integer
dim currentTableIndex as Integer
currentTableIndex = ActiveDocument.Range(0, Selection.Tables(1).Range.End).Tables.count
numberOfColumns = ActiveDocument.Tables(currentTableIndex).Columns.count
明らかに、カーソルがテーブル内にあることを確認するためにチェックを追加する必要があります。