Как обратиться к ячейке таблицы, если в ячейке находится вложенная таблица?

Автор Omu, 07 декабря 2015, 19:15

Omu

Как отловить ошибку "5941: Запрашиваемый номер семейства не существует"?
Предыстория:
Нужно было написать макрос, который сравнивает выбранные столбцы в разных таблицах, для этого он считывает в выбранных таблицах первые ячейки столбцов, как их названия для последующего выбора. При этом я случайно создал таблицу в таблице, дважды выполнив макрос, аналогичный первому в примере. После чего также случайно выбрал полученную таблицу в качестве источника. В результате получил ошибку  "5941: Запрашиваемый номер семейства не существует". Справка по выбранной ошибке выбрасывает на стартовую страницу справочной системы, то есть не проливает никакого света на причину и методы устранения ошибки. Вообще, справка в Ворд и VBA в частности такая убогая, что даже после часа копания в ней я не нашел ответов на поставленные вопросы.
Специально для наглядности выложил отчет браузера объектной модели, примерный вид полученной таблицы и фрагмент программы (не оригинальный) вызывающий ошибку. На картинке явно видно, что в первом столбце второй таблицы три ячейки, но объектов ячеек там нет. Первая таблица приведена для наглядности, в ней видны три ячейки в первом столбце
Вопрос делится на два варианта:
1. Какие свойства таблицы отвечают за ее нестандартность, в частности отсутствие в ее столбцах ячеек? Чтобы выявить глючную таблицу сразу. Сравнивая полученные таблицы я таких свойств не нашел.
2. Как отловить ошибку если она уже случилась? Команды IsError, IsMissing, IsEmpty, IsNull не работают, так как выполнение прерывается до них. Какие еще есть команды для проверки ошибок я не нашел.

Сразу скажу, можно считать ячейки из первой строки таблицы, примерно так
MsgBox  ActiveWindow.Document.Tables(2).Rows(1).Cells(1).Range.Text
но меня интересуют данные в столбцах, так что ошибка все равно вылезет позже.
Так же, если в первую ячейку добавить хотя бы строку, ошибка исчезает, но надо исключить принципиальную возможность ошибки, учитывая что она уже найдена.


[вложение удалено администратором]

Администратор

1) Этот пункт ответа не связан с вашим вопросом, просто, смотря код, я увидел у вас ошибку.
В VBA, в отличие от др. языков программирования, нужно указывать тип данных для каждой переменной.
В вашем коде переменная t1 имеет тип данных "Variant", а не "Table".
Чтобы у переменной t1 был тип данных "Table", нужно в коде писать так:
    Dim t1 As Table, t2 As Table

2) Если возникает какая-то проблема, то пробуйте искать альтернативные способы. Может быть в вашем случае подойдёт такой способ и не надо перехватывать ошибки. В этом примере макрос двигается по ячейкам первого столбца:
Sub Main()
    Dim t1 As Table, i As Long
    Set t1 = ActiveDocument.Tables(1)
    For i = 1 To t1.Rows.Count Step 1
        ' Вывод результата в View - Immediate Window.
        Debug.Print t1.Cell(i, 1).Range.Text
    Next i
End Sub


3) Как перехватывать ошибки, создайте новую тему.

Omu

Спасибо
узнал из вашего примера много нового
в частности про immediate window, метод cell. В справке бы я эту инфу сто лет искал не нашел
а про то что неправильно объявлял переменные, даже догадаться не мог, почему они разных типов получаются,
ну и ActiveDocument тоже позволит сократить выражения.
Жаль в справке таких примеров не найти.