动态工作表标题参考优化

时间:2018-02-02 16:20:19

标签: excel excel-vba vba

场景:我有一个工作簿,需要能够根据用户输入动态引用不同的工作表。我能够通过使用几个INDIRECT函数和一些其他基本函数(如INDEX)来实现这一点。

我的问题是,工作簿需要几分钟才能在功能相当强大的计算机上加载而没有其他繁重的进程在运行。

问题:是否有一种优化工作簿的简单方法?我尝试在网上查找一些标准方法,以便捕获不必要的繁重过程无济于事。我愿意使用VBA,如果它有助于提高表格。

由于

1 个答案:

答案 0 :(得分:0)

如果你能提供帮助,不要在你的工作簿中使用INDIRECT或任何其他易失性功能(OFFSET,RAND,NOW,TODAY),因为它们几乎可以自动重新计算...甚至如果你正在对工作簿做一些与这些公式完全无关的事情,例如:

  • 在完全不相关的单元格中输入新数据
  • 编辑任何现有的,完全不相关的单元格
  • 在工作簿中的任何位置删除或插入行或列
  • 执行某些自动筛选操作
  • 双击行或列分隔符(在“自动计算”中) 模式)
  • 添加,编辑或删除已定义的名称
  • 重命名工作表
  • 更改工作表相对于其他工作表的位置
  • 隐藏或取消隐藏行(但不包括列)

这意味着如果你的公式中有很多很多易失性函数,比如OFFSET或INDIRECT,那么这些公式将会不断重新计算。如果这些公式进行了一些非常耗费资源的数字运算,Excel会在每次触摸鼠标或键盘时重新处理这些数字。糟糕!

但这不是它的一半:在Excel重新计算这些函数之后,它会愉快地重新计算它们下游的所有单元格 - 无论这些下游单元格中是否具有易失性函数。而且无论结果是否实际发生了任何变化。我指的是所有细胞......不仅仅是直接指向易失性细胞的细胞,而是指向那些细胞的所有细胞,然后是指向最后一堆细胞的下一堆细胞,依此类推,等等,一直到你的工作簿。如果您在电子表格中的关键点使用了易失函数,那么几乎整个电子表格都可以不断重新计算。双倍的呀!

但即使这不是最糟糕的!问题不仅限于您当时正在做某事的工作簿。相反,当您在任何工作簿中进行更改时,每个打开的工作簿中的每个volatile函数都会重新计算 - 即使这些工作簿之间没有任何公式链接。因此,如果您有一个非常大的电子表格模型,其中包含易失性功能,然后您开始在另一个中键入购物清单,则可能需要几分钟才能将每个商品添加到该购物清单中,因为您输入的内容都是购物清单在大型电子表格模型中触发了新的大量不必要和无意义的重新计算。三倍的呀!

事实上,任何易失性函数下游的每个单元都会被重新计算,这是一个重要的事情。许多人认为只是挥发性功能本身会被重新计算。他们错了。这是随后强制重新计算所有打开的工作簿中所有易失性函数下游的所有单元格,这会导致您的悲痛。实际上,即使只有一个工作簿中的一个易失性函数,如果你有一个非常长的计算链,也会让你感到悲伤。

使用什么?

使用INDEX,甚至更好,选择。

请注意,虽然INDEX不是完全不稳定的,但它并不完美:只要工作簿打开,它仍然会重新计算。这被称为半波动性,这意味着在最初打开使用INDEX的复杂模型时,您仍然可能会注意到重新计算延迟。这是我选择选择的原因之一

=选择(index_num,值1,值2,...)

以下是从微软发言到Jeff-speak的翻译:

= CHOOSE(你想要哪个区域?,第一区域,第二区域......)

您需要将下拉选项转换为数字,以便驱动哪个区域参数。但那不是问题;您只需使用与INDEX完全相同的设置 - 一个查找表,将下拉列表的输出转换为索引号,告诉CHOOSE您想要的范围。

如果您的输入区域变成了表格,那么很好......您可以使用表格名称。