在 Excel 中,如何使用完全限定的数字坐标(工作表、列、行)访问单元格?

在 Excel 中,如何使用完全限定的数字坐标(工作表、列、行)访问单元格?

我有 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 才能获得此功能。操作方法如下:

  1. 调出 VBA(Visual Basic for Applications)窗口(例如按 Alt+F11)。
  2. 插入一个新的代码模块(例如在菜单上:插入>模块)。
  3. 将出现新模块的子窗口。在文本区域中,插入以下代码:
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)。此外,这仅适用于数字单元格值而不适用于文本,但至少它是完全非易失性的!

相关内容