我已将问题简化为以下测试用例:
创建一个新工作簿;
输入一个常量值,例如
123
进入Sheet1!A1
;定义一个名称,例如
foo
,引用公式=CHOOSE(!$A$1, Sheet1!$A$1)
;在
Sheet2!A1
中输入常量值1
;在
Sheet2
上的其他单元格中输入公式=foo
,例如Sheet2!B1
:观察到,正如预期的那样,结果是在上述步骤 2 中输入到Sheet1!A1
中的值;创建并运行包含以下代码的 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/