Как вы можете получить текущую таблицу в MS Word VBA? - PullRequest
12 голосов
/ 29 августа 2011

Я хочу иметь возможность запускать модуль VBA, который манипулирует таблицей, в которой я сейчас нахожусь (то есть курсор находится где-то внутри этой таблицы). Код VBA будет выполнять одинаковую операцию для каждой таблицы, в которой вы находитесь, когда запускаете ее.

Так, например, допустим, у меня есть модуль, который должен выделять верхний ряд каждой таблицы (заголовки). Ему нужно будет найти объект таблицы (называемый whatever), в котором вы сейчас находитесь, чтобы он мог манипулировать whatever.rows(0).

Как я могу получить объект таблицы из позиции курсора? Мне также нужно определить, нет ли в таблице , а не , и ничего не делать (или вызвать диалоговое окно с сообщением об ошибке).

Ответы [ 2 ]

12 голосов
/ 29 августа 2011

Подпрограмма 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
4 голосов
/ 18 марта 2016

Я понимаю, что это довольно старый вопрос, но я наткнулся на некоторый код, который может помочь следующему человеку, столкнувшемуся с подобной проблемой.

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

Очевидно, что необходимо добавить проверки, чтобы убедиться, что курсор находится внутри таблицы.

...