我有 Excel 工作簿中某个单元格的索引:工作表、列、行(是的,我知道 Excel 喜欢基于 1 的索引。)
鉴于这些,我应该编写什么公式来获取该单元格的值?
答案1
您可以使用 Excel ADDRESS 函数:
您可以使用 ADDRESS 函数获取工作表中单元格的地址(给定指定的行号和列号)。例如,ADDRESS(2,3) 返回 $C$2。再举一个例子,ADDRESS(77,300) 返回 $KN$77。您可以使用其他函数(例如 ROW 和 COLUMN 函数)为 ADDRESS 函数提供行号和列号参数。
语法:ADDRESS(row_num, column_num, [abs_num], [a1], [sheet_text])
例子:
公式 | 描述 | 结果 |
---|---|---|
=ADDRESS(2,3,1,FALSE,“[Book1]Sheet1”) | 对另一个工作簿和工作表的绝对引用 | '[Book1]Sheet1'!R2C3 |
=ADDRESS(2,3,1,FALSE,"EXCEL 工作表") | 对另一个工作表的绝对引用 | 'EXCEL 表'!R2C3 |
您可以将其与 INDIRECT 函数 可以使用返回的地址来引用单元格。
您可以将 Excel INDIRECT 与 ADDRESS 函数一起使用来动态获取某个单元格中的值。
要创建间接单元格引用,请将 ADDRESS 函数嵌入到 INDIRECT 公式中。一个简单的示例是:=INDIRECT(ADDRESS(1,3))
。
在 Excel 中按索引号引用工作表需要一个名称。不幸的是,这需要如下 VBA 代码:
Function SheetName(number As Long) As String
SheetName = Sheets(number).Name
End Function
该引用SheetName(1)
将返回工作表编号 1 的名称。
答案2
不幸的是,您似乎需要编写一些 VBA 才能获得此功能。操作方法如下:
- 调出 VBA(Visual Basic for Applications)窗口(例如按 Alt+F11)。
- 插入一个新的代码模块(例如在菜单上:插入>模块)。
- 将出现新模块的子窗口。在文本区域中,插入以下代码:
Function BY_SRC(sheet_index As Long, row_index As Long, col_index As Long) As Variant
'Remember all these indices are 1-based
BY_SRC = Worksheets(sheet_index).Cells(col_index, row_index).Value
End Function
现在,您可以在工作表中写入:
=BY_SRC(4, 2, 3)
作为单元格公式来获取第 4 张表第 2 行第 3 列的值。
答案3
如果寻找非 VBA 和非易失性解决方案来按工作表、行和列号动态引用单元格:
将 INDIRECT 换成 INDEX 可以使其不可变。INDIRECT 是不可变的,会一有机会就重新计算,这可能会减慢您的工作簿速度。如果您的工作表数量有限并且知道工作表的名称,您可以
=CHOOSE(sheetnum, INDEX(Sheet1!$A:$Z, rownum, colnum), INDEX(Sheet2!$A:$Z, rownum, colnum), INDEX(Sheet3!$A:$Z, rownum, colnum), ...)
如果您不知道工作表的名称,那么很遗憾,您别无选择*,只能使用 INDIRECT。但是,您可以使用宏 4.0 命名范围获取工作表名称列表,该范围名为获取.工作簿(1)。您仍然必须将文件保存为启用宏的 .xlsm 格式,但无需使用任何 VBA 代码。
*此说法不一定正确。还有另一种解决方法。您在每张工作表中实施自己的工作表编号方案和 INDEX 单元格选择器,然后使用 3D 引用仅提取选定的值。在每张工作表的 A1 中,分配一个唯一的工作表编号。现在在 B1 位置:
=IF(sheetnum=A1, INDEX($A:$Z, rownum, colnum), 0)
在摘要表中,使用工作簿范围为上面使用的完全合格数字坐标定义命名范围。要获取最终单元格值:
=SUM(Sheet1:Sheet10!B1)
注意,您至少需要知道第一个和最后一个工作表名称(sheet1 和 sheet10)。此外,这仅适用于数字单元格值而不适用于文本,但至少它是完全非易失性的!