【问题标题】:Excel VBA: Error Control in Dynamic Range Assignments (if(iserror(..))Excel VBA:动态范围分配中的错误控制 (if(iserror(..))
【发布时间】: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


【解决方案1】:

抱歉,我想撤回我的问题... 即使来自 OFFSET() 的无效引用会返回包含在 ISERROR() 的检查中的 #REF,这样做也不起作用。这对我的命名范围的 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)

对不起,我想我需要睡觉了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-20
    • 1970-01-01
    • 2019-06-16
    • 1970-01-01
    • 1970-01-01
    • 2019-03-29
    • 1970-01-01
    • 2014-01-05
    相关资源
    最近更新 更多