【发布时间】:2012-03-14 06:18:06
【问题描述】:
您好,我有一个稍微复杂的数据范围设置,这些数据范围通过 XML/Soap 到达 Excel(2003 版)并由 VBA 操作。结果显示在不同工作表上的多个列表框中。主数据表的代号为“shData”,表名称为“Data”(到目前为止非常巧妙,嗯?)并包含大约 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 中定义了一个本地名称,它引用 data 中的本地名称,但使用偏移量来排除标题行: 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 个小时了,但看不到光。如果您能将我推向正确的方向,我将不胜感激。
提前致谢, 斯蒂芬
【问题讨论】:
-
两个观察结果。 (1)
OFFSET(Data!Day0_Users, 1, , ROWS(Data!Day0_Users)-1)。缺少的参数cols是必需的。 (2)IF的语法是IF(logical_test, [value_if_true], [value_if_false])。我从未尝试过使用它来返回范围。你有没有按照你想要的方式完成这项工作?根据我的实验,在=OFFSET(reference, rows, cols, [height], [width])中,无论您提供什么值,高度和宽度都会计算为一个。 -
谢谢,托尼。缺少的参数严格来说是正确的,但似乎 Excel 并不在意,两个版本都可以。我现在发现 ISERROR() 总是评估为 TRUE。但是,即使我认为 ISERROR 通常也会包含 #REF,但 ISREF() 完全符合我的要求。无论如何,我似乎要回答我自己的问题。
标签: excel excel-2003 excel-formula vba