如何根据单元格值更改Excel表格中引用的列?
Excel 2016:通过下拉列表切换INDEX/MATCH的目标列
你遇到的核心问题是结构化引用无法直接嵌套单元格引用,Excel 2016不支持Table1[Sheet1!A5]这类写法——表的列名必须是固定文本,不能直接用单元格值动态替换。以下是两种可行的解决方法:
方案1:使用INDIRECT函数构建动态结构化引用
INDIRECT可以将文本字符串转换成有效的单元格/区域引用,我们通过拼接文本生成目标列的结构化引用:
适配“候选人邮箱”/“经理邮箱”下拉选项的公式:
=INDEX(INDIRECT("Table1["&IF(A5="候选人邮箱","Email","Manager's Email")&"]"), MATCH(B2&B3, Table1[Candidate First Name]&Table1[Candidate Last Name], FALSE))
- 逻辑:用
IF判断A5的选择,返回对应的表列名文本(Email或Manager's Email),再通过INDIRECT将文本转换为Table1[Email]或Table1[Manager's Email]的有效引用。 - 关键注意:Excel 2016中这是数组公式,输入完成后必须按
Ctrl+Shift+Enter确认,不能直接回车。
简化版(下拉选项直接用表列名时):
如果把A5的数据验证选项改成和表列名完全一致的Email/Manager's Email,公式可简化为:
=INDEX(INDIRECT("Table1["&A5&"]"), MATCH(B2&B3, Table1[Candidate First Name]&Table1[Candidate Last Name], FALSE))
方案2:用MATCH定位目标列(非易失函数,更稳定)
INDIRECT是易失函数(每次工作表计算都会重新运行),追求性能的话可以用MATCH先定位目标列在表头的位置,再用INDEX引用整个表:
适配“候选人邮箱”/“经理邮箱”下拉选项的公式:
=INDEX(Table1, MATCH(B2&B3, Table1[Candidate First Name]&Table1[Candidate Last Name], FALSE), MATCH(IF(A5="候选人邮箱","Email","Manager's Email"), Table1[#Headers], 0))
- 逻辑:
- 第一个
MATCH找到候选人所在的行号; - 第二个
MATCH找到目标列在Table1[#Headers](表头行)中的列号; - 最后用
INDEX引用整个表的对应行和列。
- 第一个
- 关键注意:同样需要按
Ctrl+Shift+Enter作为数组公式确认。
简化版(下拉选项直接用表列名时):
=INDEX(Table1, MATCH(B2&B3, Table1[Candidate First Name]&Table1[Candidate Last Name], FALSE), MATCH(A5, Table1[#Headers], 0))
内容的提问来源于stack exchange,提问作者Exquisite_Poupon
相关产品推荐
相关产品推荐

