Excel VBA:工作簿范围,工作表相关的命名公式/命名范围(结果更改取决于活动工作表)

Ric*_*ica 13 excel vba excel-vba named-ranges

编辑:标题已更改为清晰.

快速摘要:我想知道工作簿范围,工作表依赖命名公式(我将在下面描述)的行为是否是Excel中的文档功能.如果是这样,请指出我某处某些文件的方向 - 我似乎无法在网上找到任何关于此的信息(也许我使用的是错误的搜索条件......?)并且不想使用实际的东西一个bug,可能会在以后的版本中消失!

严格来说,这不是一个关于VBA的问题; 但是,命名公式是我和其他人一直在VBA代码中使用的东西,所以它仍然适用于我认为的主题.

编辑:请注意下面的VBA代码可能不完全正确 - 我还没有测试过.

常规方法

对于工程/科学计算,我经常需要在同一工作簿中多次使用相同的命名公式/范围,但是在不同的工作表上.作为一个简化的例子,我可能会为圆形区域实现类似的东西:

Dim sht as Worksheet
For Each sht In ThisWorkbook
    Call sht.Names.Add(Name:="AreaCircle",RefersTo:="=PI()*'" & _
            sht.Name & "'!Radius^2")
Next sht
Run Code Online (Sandbox Code Playgroud)

这导致以下一组命名范围/公式(作用于每个工作表):

=PI()*Sheet1!Radius^2        <--- scoped to Sheet1
=PI()*Sheet2!Radius^2        <--- scoped to Sheet2
etc. etc.
Run Code Online (Sandbox Code Playgroud)

当然这很好用,但它具有难以进行未来变化的主要缺点.因此,例如,如果公式发生变化(圆形区域当然不会改变!例如,AASHTO LRFD公路设计代码中的公式,几乎每个版本都会改​​变!),我必须编辑每个实例每个名称公式.即使我写了一个VBA程序来为我做这件事,这也很乏味.

替代方法

我前几天在Excel 2013中发现了以下事故,并且无法在网上任何地方找到任何相关信息.这使我开始使用它犹豫不决.

假设我运行以下单行代码:

Call ThisWorkbook.Names.Add(Name:="AreaCircle",RefersTo:="=PI()*!Radius^2")
Run Code Online (Sandbox Code Playgroud)

这导致以下SINGLE命名范围/公式(作用于工作簿):

=PI()*!Radius^2<---公式的范围是工作簿; 请注意!Radius,不是Radius.

请注意,这与以下内容不同(没有感叹号):

=PI()*Radius^2<---请注意,这里Radius的范围是工作簿.

现在,AreaCircle将产生与上面第一种方法完全相同的行为:它将根据本地工作表定义的Radius值生成结果.因此,如果有两个命名范围Radius(一个用于Sheet1和一个用于Sheet2),AreaCircle将根据Radius其使用的工作表中的值进行计算.而且每次添加新工作表时,我都不再需要添加新版本(以及其他所有!)公式的额外好处(这是巨大的!).

这是难以描述的行为; 如果您对我的描述感到困惑,可以执行以下步骤来重新创建此行为:

  1. 在工作簿中,创建两个或多个工作表并在单元格A1中输入"1",Sheet1A1Sheet2的单元格中输入" 2",在A1Sheet3的单元格中输入"3" 等.
  2. 创建一个名为CellA1(带有工作簿范围)的命名范围,并为公式输入以下内容:=!$A$1
  3. 输入=CellA1任何单元格将导致"1"打开Sheet1,导致"2"打开Sheet2,等等.

文档?

嘿,你做到了 - 谢谢你在这里坚持!

所以,正如我上面所说,有人能指出我这个"功能"的文档吗?我希望在一些更复杂的项目中开始实现这一点; 如果不出意外,它只会使名称管理器更容易导航20次(没有所有重复的名称).

Wol*_*ehn 5

有关文档,请参阅评估名称和其他工作表公式表达式

  • =A1 指当前工作表上的单元格A1
  • =!A1 指活动纸上的单元格A1

工作表参考一起使用

  • 当前指的是Excel重新计算的内容......
  • Active是指用户正在查看的内容...

这就是查尔斯威廉斯所展示的.至于你的用例,我推荐用户定义的函数,比如在VBA中.