Excel VBA: контроль ошибок в назначениях динамического диапазона (if (iserror (..)) - PullRequest
1 голос
/ 13 марта 2012

Привет, у меня есть немного сложная настройка диапазонов данных, которые поступают в Excel (версия 2003) с помощью XML / Soap и управляются VBA. Результат отображается в нескольких списках на разных листах. Основной лист данных имеет кодовое имя «shData», имя листа - «Данные» (пока что довольно изобретательно, хм?) И содержит около 200 различных диапазонов данных. Одна из отображаемых страниц называется Setup или shSetup. Диапазон данных в данных может выглядеть следующим образом:

ID    Last    First    Group           
1     Dwyer   Barb     A
2     King    Fu       A
3     Rea     Di A.    C

Допустим, диапазон локально назван как «Данные! Day0_Users».

Другой диапазон, скажем «Данные! Day1_Users», может быть просто заголовком (если нет данных):

ID    Last    First    Group

Эти диапазоны вставляются в VBA, удаляются из них и изменяются в VBA, поэтому мне нужен гибкий механизм ссылок. Теперь ListBoxes может использовать именованный диапазон в качестве ListFillRange. Для этого я определяю локальное имя в программе установки, которое ссылается на имя в данных, но использует смещение для исключения строки заголовка: shSetup name "lbSomeListbox", ссылается на OFFSET (Data! Day0_Users, 1, ROWS (Data! Day0_Users) -1) Все идет нормально. Очевидно, что когда диапазон в Data пустой, как в «Data! Day1_Users» в моем примере, такая ссылка вызовет ошибку. В таком случае я хотел бы заменить ссылку на пустой массив (который определяется как «Setup! EmptyRange5Col», который, в свою очередь, снова является ссылкой смещения на Data! EmptyRange5Col, чтобы возвращать только часть «-».

Empty Empty   Empty    Empty
-     -       -        -

Теперь я попытался определить свой локальный диапазон как имя, используя механизм управления ошибками excels, но он не работает - в следующем случае следует использовать данные со смещением или заменить его моим пустым массивом.

=IF(ISERROR(OFFSET(Data!Day0_Users, 1, , ROWS(Data!Day0_Users)-1)), Setup!EmptyRange5Col, OFFSET(Data!Day0_Users, 1, , ROWS(Data!Day0_Users)-1))

Если я использую ту же формулу (я также пробовал несколько других вариантов) на самом листе, используя = ISREF (IF (IsError .....), он всегда оценивается как true; попытка использования только одного ISERROR всегда оценивает false , все как и следовало ожидать. Но как только я поместил его в определение имени, ссылка не работает, вызовы shSetup.Names (...). RefersToRange вызывают ошибки во время выполнения и т. Д.

Есть ли в Excel недокументированные ограничения на использование формул для имен или я глуп? Я смотрю на это около 2 часов и не вижу света. Буду очень признателен, если вы подтолкнете меня в правильном направлении.

Заранее спасибо, Stefan

1 Ответ

1 голос
/ 14 марта 2012

Извините, я бы хотел отозвать свой вопрос ... Даже если неверная ссылка из OFFSET () вернула бы #REF, которая включена в проверку с помощью ISERROR (), это не работает.Это здесь работает, как и ожидалось, для части ReferTo моего именованного диапазона:

=IF(ISREF(OFFSET(Data!Day0_Users, 1, 0, ROWS(Data!Day0_Users)-1)), OFFSET(Data!Day0_Users, 1, 0, ROWS(Data!Day0_Users)-1), Setup!EmptyRange5Col)

Извините за вопрос - мне нужно немного поспать, я думаю.

...