#价值!从VBA设置显示的大纲级别后出错
我已将问题简化为以下测试用例:#价值!从VBA设置显示的大纲级别后出错,vba,excel,excel-2010,Vba,Excel,Excel 2010,我已将问题简化为以下测试用例: 创建新工作簿 在Sheet1中输入一个常量值,例如123!A1 定义一个名称,例如引用公式=CHOOSE(!$a$1,Sheet1!$a$1) 将常量值1输入表2中!A1 将公式=foo输入到Sheet2上的其他单元格中,例如Sheet2!B1:观察结果是否如预期的那样是输入到表1中的值!A1在上述步骤2中 创建并运行包含以下代码的VBA过程: Sheets("Sheet1").Outline.ShowLevels 1 您将注意到,步骤5中的单元格现在包含一个
Sheet1中输入一个常量值,例如123
!A1
=CHOOSE(!$a$1,Sheet1!$a$1)
1
输入表2中!A1
=foo
输入到Sheet2
上的其他单元格中,例如Sheet2!B1
:观察结果是否如预期的那样是输入到表1中的值!A1
在上述步骤2中Sheets("Sheet1").Outline.ShowLevels 1
#值代码>错误
此外,简单的工作表重新计算(无论是使用F9键还是应用程序.Calculate
方法)都不能解决问题:必须从VBA执行完全重新计算(使用应用程序.CalculateFull
方法),或者从交互式UI执行完全重建(使用CTRL+ALT+SHIFT+F9组合键)
通过反复试验,我确定出现这种情况:
CHOOSE()
index参数必须涉及相对图纸单元格引用(而不是常量或绝对图纸引用)
- 正在编制索引的
CHOOSE()
value参数必须涉及对其他工作表的引用
- 显示的大纲级别的更改必须来自VBA过程(而不是交互式UI或VBA即时窗口中的大纲控件);以及
ShowLevels
方法调用(其参数不相关)必须应用于在CHOOSE()
的任何值(尽管不是索引)参数中引用的工作表
发生什么事了
我非常希望将我在CHOOSE()
的值参数中引用的工作表折叠到其最高大纲级别,而不会触发此错误,因为从用户体验的角度来看,完全重新计算我的实际工作簿(仍然只有几秒钟)是不可取的
建议解决方法(同时仍然使用包含CHOOSE()
函数和相对图纸索引参数的定义名称)将是最受欢迎的
我的平台:Windows 7 Home Premium(SP1,64位)上的Excel 2010(14.0.6123.5001,32位)。问题在于命名公式:=选择(!$A$1,Sheet1!$A$1)
,特别是!A1
前导的!
无效(没有前面的工作表名称,例如Sheet1!$a$1
有效)。只需指定一个工作表,问题就会解决
我怀疑这可能不能满足您的要求,这取决于您首先使用!A1
的原因。如果您希望=foo
在工作表上使用A1
中的索引值,则公式=foo
将用于间接(“A1”)
而不是!A1
顺便说一句,我认为您可能发现了一个bug,或者至少是未定义的行为,因为公式=CHOOSE(!$a$1,Sheet1!$a$1)
无效,并且应该总是返回一个#值
错误。如果包含此UDF,它是否给出了正确的行为
Public Function fooUDF(inCell As Range)
fooUDF = ThisWorkbook.Worksheets(inCell.Value).Range("A1").Value
End Function
使用自定义项而不是定义的名称/公式可能会影响性能。
它采用in参数也可能会有问题,而您的原始方法没有这样做。可以通过运行宏,在每张图纸上引入一个工作表定义的公式来避免这一问题,如下所示:(不包括在所有必要图纸上循环的零件)
值得一提的是,我无法在Windows 7 Home Premium(SP1,64位)上的Excel 2002 SP3(10.6871.6870,32位)中重现该问题。@mwolf02,嗯……我可以在XP上的Excel 2010(14.0.6123.5001,32位)中重现该问题,SP3@SeanCheshire:很高兴知道。这听起来像是MS引入的错误(可能是从Excel 2003到2007)。这简单地回避了eggyal的问题:有解决办法吗?…这就是我退出的地方,希望其他人能提供帮助。我可以在Windows7 Professional(SP1,64位)上的Excel2003 SP3(11.8346.8341,32位)上复制。我一直在使用leading!
(没有工作表名称)多年来,在命名公式中,我始终理解它是一个有效的相对表引用(即,如您所述,解析为引用表);但是,我无法引用任何文档来支持这一点,因此它可能不可靠。也就是说,我很确定我是通过(旧版本的)发现它的Excel将一个前导的!
添加到一个非限定的引用中(即没有指定工作表)-但我现在无法重现这种行为。我使用这种方法是为了避免首先使用volatile间接调用,因此,虽然您的建议提供了一种解决方法,但遗憾的是,这对我没有好处!我以前从未遇到过使用!
进行相关工作表引用的情况。进行一些调查,我在设置名称使用宏时,您不能录制宏,也不能编写VBA
来设置名称。请参考来使用宏。这对我来说是不受支持的行为。至于解决方案,如果间接不好,我想您一定使用了很多。我怀疑对公式的任何更改都会导致错误她可能会不稳定或破坏计算树(因此需要强制重新计算,这也不好)。一个非常糟糕的选择可能是跟踪名称的使用位置,并强制只计算VBA中的那些单元格,删除前面的文本并包括!(砰)符号不起作用。当再次查看公式时,将显示一个工作表名称和一个bang符号
Public Sub InsertName()
ThisWorkbook.Worksheets("Sheet2").Names.Add Name:="fooformula", _
RefersToR1C1:="=fooudf(Sheet2!R1C1)"
End Sub