您如何根据变量工作表名称或编号以及行和列编号选择(例如通过下拉列表)动态引用任何单元格?
我知道 INDIRECT 将是标准方法(详见下文),但由于 INDIRECT 是易变的(针对每个小的工作簿更改重新计算),它可能会大大减慢电子表格的速度。这可以使用非易失性方法来完成吗?我也知道 3D 参考在某些情况下很有用,例如在多张纸上求和或平均,但它不适用于单个单元格寻址。
我还将使用 INDEX(CHOOSE(...)) 提出我自己对这个问题的答案,但也许有更好的方法?
您如何根据变量工作表名称或编号以及行和列编号选择(例如通过下拉列表)动态引用任何单元格?
我知道 INDIRECT 将是标准方法(详见下文),但由于 INDIRECT 是易变的(针对每个小的工作簿更改重新计算),它可能会大大减慢电子表格的速度。这可以使用非易失性方法来完成吗?我也知道 3D 参考在某些情况下很有用,例如在多张纸上求和或平均,但它不适用于单个单元格寻址。
我还将使用 INDEX(CHOOSE(...)) 提出我自己对这个问题的答案,但也许有更好的方法?
首先,动态寻址任何工作表中的任何单元格的简单/常用/易失方法
假设所需的工作表名称在 A1 ="JAN" 中,行号和列号在 B1 =1 和 C1 =1 中,然后:
将在 JAN!$A$1 中返回参考/值。您还可以像这样返回整个范围:
这将返回 SUM(JAN!$A$1:$A$9) 的值
现在,对于非易失性方法
您可以使用以下非易失性公式来索引任何工作表中的任何单元格,假设工作表列表是静态的/或可以根据需要手动更新。CHOOSE 函数可以根据提供给 CHOOSE 的索引号返回对工作簿中每个工作表的引用。您必须将 CHOOSE 与 INDEX 一起使用,因为 INDEX 不能在多张纸上正常工作。
您必须手动扩展此公式以包含工作簿中的每个工作表。您将它们放在 CHOOSE 函数列表中的顺序决定了 CHOOSE 索引sheetnumber顺序(而不是工作簿中工作表的排序顺序)。
如果最好将冗长的 INDEX(CHOOSE(...)) 函数定义为命名单元格或范围,这样您就不必在多个单元格公式中输入它(如果您必须编辑它/添加新工作表,您只需编辑定义的名称一次)。您可以使用相对定义名称将工作表、行号和列号的变量添加到相邻单元格中的命名区域,或者在 Office 365 中使用 lambda 函数定义名称,例如 SHEETINDEX
=LAMBDA(sheetnum, r, c, INDEX(CHOOSE(sheetnum,Sheet1!$A:$ZFD,Sheet2!$A:$ZFD,Sheet3!$A:$ZFD),r,c)
。这样,您可以像函数一样使用命名范围=SHEETINDEX(1,1,1)
来返回 Sheet1!$A$1。