Новости:

Название темы должно отражать суть задачи.
Темы типа "ПОМОГИТЕ!!!", "Срочно!" и т.п. будут удаляться без объяснения причин

Главное меню

Как отловить ошибку "5941: Запрашиваемый номе

Автор Omu, 07.12.2015, 19:57:30

« назад - далее »

Omu

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

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

Модератору: Эта тема предназначена для другого раздела. Я здесь первый раз и не знаю как удалять темы. Если можно  перенесите эту тему в раздел Вопросы по Word и VBA или удалите ее.

Дмитрий Щербаков(The_Prist)

Цитата: Omu от 07.12.2015, 19:57:30но надо исключить принципиальную возможность ошибки
Это вряд ли. Можно минимизировать.
Но без Вашего кода и файла трудно сказать что-то конкретное, т.к. непонятно зачем вставлять таблицу в таблицу и потом что-то с них считывать.
Приложите файл с кодом создания таблиц - тогда видно будет, что можно сделать.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

Omu

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

Дмитрий Щербаков(The_Prist)

#3
Цитата: Omu от 10.12.2015, 23:42:16Код приведен на картинке
Всегда радовал такой подход. Это форум не по Фотошоп. Так почему для помощи кому-то здесь должны переписывать коды с картинок? Вы считаете это нормальным? Я нет. Тем более что код создания таблицы виден не полностью. Видимо, предупредить создание таблицы внутри другой можно так: проверяйте, не расположен ли курсор внутри таблицы. Можно применить цикл по таблицами и проверить - не находится ли курсор внутри одной из таблиц:
dim bInTable as boolean,wdTbl as table
for each wdTbl in wd.tables
if Selection.Range.InRange(wdTbl.Range) then
    bInTable=true:exit for
end if
next
MsgBox "Курсор " & IIf(bInTable, "внутри таблицы", "вне таблиц"), vbInformation

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

Яндекс.Метрика Рейтинг@Mail.ru