Я хочу иметь возможность запускать модуль VBA, который управляет таблицей, в которой я сейчас нахожусь (т.е. курсор находится где-то в этой таблице). Код VBA будет выполнять идентичную операцию с каждой таблицей, в которой вы находитесь, когда вы его запускаете.
Так, например, у меня есть модуль, которому нужно выделить верхнюю строку каждой таблицы (заголовки) жирным шрифтом. Ему нужно будет найти объект таблицы (называемый whatever
), в котором вы сейчас находитесь, чтобы он мог управлять whatever.rows(0)
.
Как я могу получить объект таблицы из позиции курсора? Мне также нужно определить, нет нахожусь в таблице и ничего не делаю (или вызываю диалоговое окно с ошибкой).
2 ответа
Подпрограмма 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
Очевидно, следует добавить проверки, чтобы убедиться, что курсор находится внутри таблицы.
Похожие вопросы
Связанные вопросы
Новые вопросы
vba
Visual Basic для приложений (VBA) - это управляемый событиями объектно-ориентированный язык программирования для написания макросов, используемый для всего пакета Office, а также для других приложений. VBA не эквивалентен VB.NET или VBS; если вы работаете в Visual Studio, используйте [vb.net]. Если ваш вопрос конкретно касается программирования любого приложения MS Office, также используйте соответствующий тег: [excel], [ms-access], [ms-word], [outlook] или [ms-project].