1

Тема: Как обратиться к текущей таблице

Возникла проблема. Нужно обратиться в макросе к текущей таблице, на одной из ячеек которой установлен курсор.

В интернете нашел следующее решение:

Sub TableNumber()
'
' Определение номера таблицы
' Использован макрос - http://www.forum.mista.ru/topic.php?id=130346
'
    Dim ThisTableIndex As Variant
    ThisTableIndex = 0
    
    'Определяем номер текущей таблицы
    Dim MyRangeTable()
    For i = 1 To ActiveDocument.Tables.Count
        ReDim Preserve MyRangeTable(i)
        Set MyRangeTable(i - 1) = ActiveDocument.Tables(i).Range
        ActiveDocument.Tables(i).ID = "Table " & i
    Next
    For i = 1 To ActiveDocument.Tables.Count
        If Selection.InRange(MyRangeTable(i - 1)) Then
           ThisTableIndex = i
        End If
    Next
    
    'Печать номера текущей таблицы
    If ThisTableIndex <> 0 Then
        MsgBox "Номер таблицы: " & ThisTableIndex, vbInformation, "Номер таблицы"
    Else
        MsgBox "Это не таблица", vbCritical, "Номер таблицы"
    End If

End Sub

А нельзя ли это сделать проще?

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

2

Re: Как обратиться к текущей таблице

А чем не устраивает Selection.Tables(1) ?

Макросы под заказ и готовый пакет - mtdmacro.ru

3

Re: Как обратиться к текущей таблице

Вождь пишет:

А чем не устраивает Selection.Tables(1) ?

Это ведь обращение к первой таблице из коллекции таблиц, разве не так?
А нужно - к той таблице, где установлен курсор (что-то вроде ActiveCell в Excel).

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

4

Re: Как обратиться к текущей таблице

Alex_Gur пишет:

..обращение к первой таблице из коллекции таблиц...

Выбранных таблиц! Все свойства и коллекции объекта Selection относятся только к выбранному фрагменту.

Выбранный фрагмент может быть в виде курсора (Selection.Type = wdSelectionIP) или нет. В последнем случае, узнать где курсор (в начале/конце выбранного) поможет параметр Selection.StartIsActive. Универсальная функция:

Function Таблица_курсора() As Word.Table

    Set Таблица_курсора = Nothing
    
Dim R As Word.Range
    
    If Selection.StartIsActive = True Then
        Set R = Selection.Characters.First
    Else
        Set R = Selection.Characters.Last
    End If
    If R.Tables.Count > 0 Then
        Set Таблица_курсора = R.Tables(1)
    End If
    
End Function
Макросы под заказ и готовый пакет - mtdmacro.ru

5

Re: Как обратиться к текущей таблице

Кстати, если курсор находится в начале первого абзаца под таблицей, т.е. визуально не в таблице, Selection.Tables(1) все равно имеет место быть, и указывает на таблицу над курсором. Приведенная мной выше функция обходит это несоответствие.

Макросы под заказ и готовый пакет - mtdmacro.ru

6

Re: Как обратиться к текущей таблице

А если Вы планируете вставлять за выбранной таблицей другую, чтобы они не объединялись я например использую код:

Public Sub AddTable()
Dim tbl As Table, Rng As Range
    Set tbl = Selection.Tables(1)
    Set Rng = ActiveDocument.Range(tbl.Range.End, tbl.Range.End + 1)
    Rng.Select
    Selection.TypeParagraph
    Selection.Tables.Add Selection.Range, 10, 5
End Sub

7

Re: Как обратиться к текущей таблице

Попробовал следующий макрос, выделяющий первую строку таблицы, где находится курсор:

Sub ThisTable1()
    Selection.Tables(1).Rows(1).Select
End Sub

Все работает прекрасно (и когда курсор просто стоит на таблице, и когда выделена часть файла с этой таблицей), но когда курсор стоит вне таблицы или  выделена часть файла без таблицы - выдается известная ошибка Запрашиваемый номер семейства не существует.Есть ли возможность проверить, имеется ли таблица в выделении Selection (что-то вроде IsTable), и, если такой таблицы нет, выдать сообщение "Таблицы отсутствуют"?

В макросе в посте http://wordexpert.ru/forum/viewtopic.php?pid=7865#p7865 эта проблема решается путем перебора всех таблиц файла, но это решение не очень красиво.

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

8

Re: Как обратиться к текущей таблице

Dim isTable As Word.Range
    Set isTable = Selection.Range

    If Not isTable.Information(wdWithInTable) Then

9

Re: Как обратиться к текущей таблице

Ципихович Эндрю пишет:

Dim isTable As Word.Range
    Set isTable = Selection.Range

    If Not isTable.Information(wdWithInTable) Then

Большое спасибо. Получилось так:

Sub ThisTable1()
    Dim isTable As Range
    Set isTable = Selection.Range
    If isTable.Information(wdWithInTable) Then
        Selection.Tables(1).Rows(1).Select
    Else
        MsgBox "Таблица отсутствует"
    End If
End Sub

Но теперь макрос выдает сообщение "Таблица отсутствует", даже если таблица является частью выделения (то есть если в выделении имеются и таблицы, и обычные строки).

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

10

Re: Как обратиться к текущей таблице

я не знаю, что Вы сооружаете, но освойте запуск макроса по полю макробуттон, щёлкнули, запустился макрос, ну естественно заблаговременно оно должно быть в таблице, например таблица 30 строк, 3 столбца, в первом столбце первой строки ставите поле макробуттон с текстом "№ п\п" щёлнули по нему в этом столбце проставились номера с 1 до конца столбца, а Вы в это время отдыхаете

11

Re: Как обратиться к текущей таблице

В любом случае, поставленная проблема решена. Всем большое спасибо.

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

12

Re: Как обратиться к текущей таблице

Условие товарищи то простое
If Selection.Tables.Count = 0 Then …
Я тут совершенствую Макросы переноса таблиц из Excel  в Word и интерактивного переноса данных в уже существующие

13

Re: Как обратиться к текущей таблице

aap77 пишет:

Условие товарищи то простое
If Selection.Tables.Count = 0 Then …
Я тут совершенствую Макросы переноса таблиц из Excel  в Word и интерактивного переноса данных в уже существующие

Спасибо! Оказалось очень просто и красиво!  smile

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

14

Re: Как обратиться к текущей таблице

Итоговый результат получился следующим:


Sub ThisTable1()
    If Selection.Tables.Count <> 0 Then
        'выполняем действия с первой таблицей в выделении
        'например: Selection.Tables(1).Rows(1).Select
    Else
        MsgBox "Таблица отсутствует"
    End If
End Sub

Макрос весьма радует глаз!  smile

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

15

Re: Как обратиться к текущей таблице

и ещё вместо
MsgBox "Таблица отсутствует"
лучше
MsgBox$ "Таблица отсутствует"

16

Re: Как обратиться к текущей таблице

Ципихович Эндрю пишет:

и ещё вместо
MsgBox "Таблица отсутствует"
лучше
MsgBox$ "Таблица отсутствует"

MsgBox$ - а что здесь означает знак $?

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

17

Re: Как обратиться к текущей таблице

А еще лучше так

Public Sub GoToTable()
Dim Table As Table, Rng As Range
    If Selection.Tables.Count = 0 Then
        Msg = MsgBox("Таблица отствует!!!" & Chr(13) _
        & "Перейти к следующей???", vbYesNo + vbQuestion, _
        "Переход к таблице")
            If Msg = 7 Then Exit Sub
            Set Rng = ActiveDocument.Range(Selection.End, ActiveDocument.Range.End)
            Select Case Rng.Tables.Count
                Case 0
                    MsgBox "До конца документа" & Chr(13) _
                    & ActiveDocument.Name & " таблиц нет!!!" & Chr(13), vbYesNo + vbCritical, "Переход к таблице"
                    Exit Sub
                Case Else
                    Set Table = Rng.Tables(1)
                    Selection.Start = Table.Range.Cells(1).Range.Start
                    Set Rng = ActiveDocument.Range(ActiveDocument.Range.Start, Table.Range.End)
                    MsgBox "Вы находитесь в таблице " & Rng.Tables.Count & "документа " & ActiveDocument.Name, vbInformation, "Переход к таблице"
            End Select
    End If
End Sub

Хотя генералам можно и поцветастие такую ерунду оформить.
Например с поиском в обе стороны с выбором ближайшей к выделению. smile
А вот кто расчитает полную ширину и высоту таблицы, учитывая что ширина неизвестна, а высота неизвестно на сколько страниц, а также по отдельности каждый элемент многостраничной таблицы???

18

Re: Как обратиться к текущей таблице

aap77 пишет:

Условие товарищи то простое
If Selection.Tables.Count = 0 Then …
Я тут совершенствую Макросы переноса таблиц из Excel  в Word и интерактивного переноса данных в уже существующие

Здравствуйте!
зашел на форум найти решение вопроса: - при вставке в WORD таблицы из EXCEL, как объекта получается картинка на один лист (рисунок).  есть возможность простыми методами в  word 2010 внедрять (связывать) таблицы  excel, так, чтобы таблица размещалась на необходимом количестве листов? может существует такая тема?

19

Re: Как обратиться к текущей таблице

Такой темы не существует но я ее создам сейчас в Блоге Александра Пименова под названием Связывание Таблиц Word b Excel там подробней изложите проблему

20

Re: Как обратиться к текущей таблице

MsgBox$ - означает, что в функции переменная стринг