web-dev-qa-db-ja.com

MS Word VBAで現在のテーブルを取得するにはどうすればよいですか?

現在いるテーブルを操作するVBAモジュールを実行できるようにしたいと思います(つまり、カーソルはそのテーブル内のどこかにあります)。 VBAコードは、実行時に現在の各テーブルで同じ操作を実行します。

したがって、たとえば、各テーブルの一番上の行(見出し)を太字にする必要があるモジュールがあるとします。 whatever.rows(0)を操作できるように、現在使用しているテーブルオブジェクト(whateverと呼ばれる)を見つける必要があります。

カーソル位置からテーブルオブジェクトを取得するにはどうすればよいですか?また、テーブル内でnotであるかどうかを検出し、何もしない(またはエラーダイアログを表示する)必要があります。

14
paxdiablo

この回答の下部にある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
_
13
paxdiablo

これはかなり古い質問だと思いますが、同様の問題に直面している次の人を助ける可能性のあるコードに出くわしました。

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

明らかに、カーソルがテーブル内にあることを確認するためにチェックを追加する必要があります。

4
enifeder