#值!从VBA设置显示的大纲级别后出现错误

egg*_*yal 9 excel vba excel-vba excel-2010

我已将问题减少到以下测试用例:

  1. 创建一个新的工作簿;

  2. 输入一个恒定值,例如,123Sheet1!A1;

  3. 定义一个名称,例如foo,指代公式=CHOOSE(!$A$1, Sheet1!$A$1);

  4. 输入常数值1Sheet2!A1;

  5. 将公式输入=foo到其他一些单元格中Sheet2,例如Sheet2!B1:观察到,如预期的那样,结果是Sheet1!A1上面步骤2中输入的值;

  6. 然后创建一个包含以下代码的VBA过程:

    Sheets("Sheet1").Outline.ShowLevels 1
    
    Run Code Online (Sandbox Code Playgroud)

您会注意到步骤5中的单元格现在包含#VALUE!错误.

此外,简单的工作表重新计算(无论是使用F9密钥还是Application.Calculate方法)都无法解决问题:必须改为从VBA 执行完全重新计算(使用Application.CalculateFull方法),或者从交互式UI 执行完全重建(使用CTRL+ ALT+ SHIFT+ F9组合键).

通过反复试验,我确定了出现这种情况:

  • 所述CHOOSE()索引参数必须涉及的相对表单元格引用(未常量或绝对表的参考文献);

  • CHOOSE()被索引的value参数必须包含对另一个工作表的引用;

  • 显示的大纲级别的更改必须来自VBA 过程(而不是来自交互式UI或VBA立即窗口中的大纲控件); 和

  • 所述ShowLevels方法调用(其参数是不相关的)必须被施加到被之中任何值的引用的片(虽然不是索引)参数CHOOSE().

这是怎么回事?

我非常希望将我在值参数中引用的工作表折叠CHOOSE()到其最高大纲级别而不触发此错误,因为从UX的角度来看,完全重新计算我的实际工作簿(仍然只有几秒钟)是不可取的.

对于变通方法的建议(虽然仍然使用包含该CHOOSE()函数的定义名称以及相对表索引参数)将是最受欢迎的!

我的平台:Windows 7 Home Premium(SP1,64位)上的Excel 2010(14.0.6123.5001,32位).

chr*_*sen 1

问题在于您的命名公式:=CHOOSE(!$A$1, Sheet1!$A$1),特别是!A1

前导!无效(没有前面的工作表名称,例如Sheet1!$A$1 有效)。只需指定一张表,您的问题就会消失。

我怀疑这可能不会令您满意,具体取决于您最初使用的原因。!A1如果您想=foo使用A1 工作表上的索引值,则将公式=foo放置在useINDIRECT("A1")而不是!A1


顺便说一句,我认为您可能发现了一个错误,或者至少发现了未定义的行为,因为公式=CHOOSE(!$A$1, Sheet1!$A$1)无效并且应该始终返回#Value错误。