Vba 基于列名而非单元格名的Excel查找数据
我正试图用excel完成一项奇怪的任务,但不知道如何去做。我在工作中使用Excel2007,我知道非常基本的vba 我想自动化一个过程,其中一个人需要三个电子表格,并将其中的某些数据转储到一个主表中。这三个电子表格每个月的列顺序都不一样,所以不幸的是,我不能只编写vlookups来运行和获取数据 我可能错了,但看起来Vlookup匹配、索引匹配等也不起作用,因为它们仍然在引用单元格我基本上需要能够根据列中的文本而不是其位置来查找列的内容,因为位置会发生变化,但文本总是相同的。 我有两个想法,但我不知道它们是否有效,也不知道从哪里开始实施它们:Vba 基于列名而非单元格名的Excel查找数据,vba,excel,vlookup,Vba,Excel,Vlookup,我正试图用excel完成一项奇怪的任务,但不知道如何去做。我在工作中使用Excel2007,我知道非常基本的vba 我想自动化一个过程,其中一个人需要三个电子表格,并将其中的某些数据转储到一个主表中。这三个电子表格每个月的列顺序都不一样,所以不幸的是,我不能只编写vlookups来运行和获取数据 我可能错了,但看起来Vlookup匹配、索引匹配等也不起作用,因为它们仍然在引用单元格我基本上需要能够根据列中的文本而不是其位置来查找列的内容,因为位置会发生变化,但文本总是相同的。 我有两个想法,但我
ID# AltID# Deal
1
2
3
4
5
然后另一张电子表格可能是这样的
ID# AltID# Deal
1 10101 AAAA
2 20202 BBBB
3 30303 CCCC
4 40404 DDDD
5 50505 EEEE
我当然可以,但问题是下个月,第二个电子表格中的这些列不会在同一个位置,顺序也不一样。他们可能一直在哥伦布DD或其他什么地方。所以我需要一个公式,不管列的位置如何查找它们。只是通过标题文本匹配它们。我希望这能澄清…如果您将
VLOOKUP
与MATCH
相结合,您可以根据列名而不是索引进行搜索。请记住,MATCH
函数返回匹配的数字索引。假设您的数据如下所示:
NAME DAY1 DAY2 DAY3
Bob 123 345 567
Tim 456 789 998
为Tim返回DAY2列的功能正常的Vlookup如下所示:
=VLOOKUP("Tim", A2:D3,MATCH("DAY2",A1:D1,0),FALSE)
几张便条。在我用文字硬编码的地方,你可以使用单元格引用 这里有一个想法:
- 获取Sheet2中列
的索引ID#
MATCH(“ID#”,Sheet2!$1:$1,0)
- 转换为字符:
CHAR(匹配(“ID#”,Sheet2!$1:$1,0)+64)
- 获取列范围:
间接( 连接(“Sheet2!”, 字符(匹配(“ID#”,Sheet2!$1:$1,0)+64),“:”, 字符(匹配(“ID#”,Sheet2!$1:$1,0)+64))
- 对于列
:AltID#
间接( 连接(“Sheet2!”, 字符(匹配(“AltID#”,Sheet2!$1:$1,0)+64),“:”, 字符(匹配(“AltID#”,Sheet2!$1:$1,0)+64))
ID
和AltID
的范围,我们可以进行匹配+索引:
=INDEX(
INDIRECT(
CONCATENATE("Sheet2!",
CHAR(MATCH("AltID#",Sheet2!$1:$1,0)+64),":",
CHAR(MATCH("AltID#",Sheet2!$1:$1,0)+64))),
MATCH(A2,INDIRECT(
CONCATENATE("Sheet2!",
CHAR(MATCH("ID#",Sheet2!$1:$1,0)+64),":",
CHAR(MATCH("ID#",Sheet2!$1:$1,0)+64))),0))
如果有一些例子就好了。我认为
indirect
在这种情况下可能会有所帮助。我会尽可能快地添加一个带有虚拟数据的示例。我不知道你可以用字符串作为引用,这很酷。但我需要我的col_index_num是一个字符串,而不是一个数字。或者,某个字符串的列数,如果有意义的话。也许我们彼此误解了。使用我的模拟公式,Excel将选择与字符串“DAY2”对应的col_index_num。因此,如果DAY2是第三列,就像我的示例中一样,col_index_num将是三。如果它移动,col_index_num也将更新。这不是你需要的吗?你确定它会更新吗?如果我制作一个宏来执行一个特定的vlookup并为col#u index_num写入一个#,然后下个月列位置不是3而是16,那么宏如何知道将col#u index_num更改为16?我用一个例子编辑了我的问题,希望能澄清。谢谢根据我的代码,您不需要为col_index_num输入特定的数字。相反,您可以使用MATCH函数为您返回col_index_num。输入公式:MATCH(“DEAL”,A1:D1,0),而不是数字,col_index_num通常位于该公式中。如果deal是第一列,col_index_num将自动返回1。如果它在下个月的第2列中,col_index_num将找到文本交易并返回相应的列。这能澄清问题吗?哦,我道歉。让我试试这个,然后尽快给你回复!