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

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

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

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

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

ID    Last    First    Group

Эти диапазоны вставляются в VBA или удаляются из них, а их размер изменяется изнутри, поэтому мне нужен гибкий механизм ссылок. Теперь ListBoxes может использовать именованный диапазон как ListFillRange. Для этого я определяю локальное имя в Setup, которое ссылается на имя в данных, но использует смещение для исключения строки заголовка: 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
-     -       -        -

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

=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 .....), она всегда оценивается как истина; попытка одной только ISERROR всегда оценивает false, все как следовало ожидать. Но как только я помещаю его в определение имени, ссылка не работает, вызовы shSetup.Names (...). RefersToRange вызывают ошибки времени выполнения и т. д.

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

Заранее спасибо, Стефан


person ExternalUse    schedule 13.03.2012    source источник
comment
Два наблюдения. (1) OFFSET(Data!Day0_Users, 1, , ROWS(Data!Day0_Users)-1). Отсутствующий параметр cols является обязательным. (2) Синтаксис для IF - IF(logical_test, [value_if_true], [value_if_false]). Я никогда не пробовал использовать его для возврата Range. Получили ли вы эту работу так, как хотите? Согласно моим экспериментам, в =OFFSET(reference, rows, cols, [height], [width]) высота и ширина оцениваются по одному из любых значений, которые вы предоставляете.   -  person Tony Dallimore    schedule 14.03.2012
comment
Спасибо, Тони. Отсутствующий параметр, строго говоря, правильный, но похоже, что Excel это не особо заботит, обе версии работают. Теперь я обнаружил, что ISERROR () всегда принимает значение ИСТИНА. Однако ISREF () делает именно то, что я хочу, хотя я думал, что ISERROR обычно также включает #REF. В любом случае, похоже, я собираюсь ответить на свой вопрос.   -  person ExternalUse    schedule 14.03.2012


Ответы (1)


Извините, я хотел бы отозвать свой вопрос ... Несмотря на то, что недействительная ссылка из 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)

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

person ExternalUse    schedule 13.03.2012