vba - #值(value)!从 VBA 设置显示轮廓级别后出现错误

标签 vba excel excel-2010

我已将问题简化为以下测试用例:

  1. 创建一个新工作簿;

  2. 输入一个常量值,例如123 进入 Sheet1!A1;

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

  4. Sheet2!A1中输入常量值1

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

  6. 创建并运行包含以下代码的 VBA 过程:

    Sheets("Sheet1").Outline.ShowLevels 1
    

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

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

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

  • CHOOSE() 索引参数必须包含相对工作表单元格引用(不是常量或绝对工作表引用);

  • 正在索引的CHOOSE()值参数必须涉及对另一个工作表的引用;

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

  • ShowLevels 方法调用(其参数不相关)必须应用于在 CHOOSE() 的任何值(尽管不是索引)参数中引用的工作表.

发生什么事了?

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

非常欢迎提出解决方法的建议(同时仍然使用包含 CHOOSE() 函数的定义名称以及相对工作表索引参数)!

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

最佳答案

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

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

我怀疑这可能不会令您满意,具体取决于您首先使用 !A1 的原因。如果您希望 =foo 使用 A1 中的索引值在工作表上放置公式 =foo 使用 INDIRECT("A1") 而不是 !A1

<小时/>

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

关于vba - #值(value)!从 VBA 设置显示轮廓级别后出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13179138/

相关文章:

excel - 双击处理事件后退出/禁用编辑模式

vba - 使用 VBA 在 Excel 2010 中创建参数化 SQL 查询

sharepoint - 当 Word Doc 位于服务器上时,如何从 Excel VBA 更改 Word Doc 中的文本?

vba - Excel VBA : How to implement timer to check for code timeout

excel - 从 .zip 文件中读取 .txt

excel - 使用 VBA 和数组公式方法的 VLookup with Multiple Criteria

vba - 从列表或数组中查找排除某些元素的最小值

vba - Excel 宏一次将一行连接到文件末尾

excel-2010 - 在 Power Query 中编辑 SQL

excel - 有没有一个excel公式可以将负数四舍五入?即轮(-2.5) = -2