2015-01-20 90 views
1

我想在Excel中完成一个奇怪的任务,不知道如何去做。我在工作中使用Excel 2007,我知道非常基本的vba。基于列名不是单元名称的Excel查找数据

我想自动化一个人需要三张电子表格并将某些数据从他们转储到一张主表单中的过程。这三个电子表格按列顺序每个月都有所不同,所以不幸的是,我不能只编写vlookups来运行并获取数据。

我可能是错的,但它似乎像Vlookup匹配,索引匹配匹配等无法正常工作,因为他们仍然引用单元格。 我基本上需要一些能够根据列中的文本而不是其位置找到一列的位置,因为位置会改变,但文本总是相同的。

我有两个想法,但我不知道,如果他们工作,真的不知道从哪里上实现它们开始:

  1. 转换三个电子表格表和引用与表语法标题(我一直没能得到这个工作)
  2. 复杂VBA是标识一切

谁能帮我指出了正确的方向来完成这个任务?非常感谢你的帮助。

编辑示例

我,我试图倾倒东西变成仅仅是将有ID号和空列主模板:

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 

我当然可以VLOOKUP的,但问题是下个月,在第二个电子表格那些列不会在同一个地方,以相同的顺序。他们可能会在colum DD或其他任何方面。所以我需要一个公式来查看它们,而不管列的位置。只需通过标题文本匹配它们即可。我希望澄清...

+0

这将是不错的一些例子。我认为'间接'可能有助于这种情况。 – Fabricator 2015-01-20 20:05:56

+0

我会尽量用虚拟数据尽快添加一个例子 – msim 2015-01-20 20:24:32

回答

3

如果您将VLOOKUPMATCH结合使用,则可以根据列名而不是索引进行搜索。请记住,MATCH函数返回匹配的数字索引。让我们假设你的数据看起来像下面:

NAME DAY1 DAY2 DAY3 
Bob  123  345  567 
Tim  456  789  998 

一个发挥作用的VLOOKUP返回DAY2列添会是什么样子:

=VLOOKUP("Tim", A2:D3,MATCH("DAY2",A1:D1,0),FALSE) 

有两点要注意。在我用硬编码的地方,你可以使用单元格引用。

+0

我不知道你可以用字符串作为参考来查找,这很酷。但在需要我的col_index_num是一个字符串,而不是一个数字。或者,如果这是有意义的,则是某个字符串的列号。 – msim 2015-01-20 20:39:39

+1

也许我们是误解对方。使用我的模拟公式,Excel将选择与字符串“DAY2”对应的col_index_num。所以,如果DAY2是第三列,就像在我的例子中那样,col_index_num将是三。如果它移动,col_index_num将同样更新。这不是你需要的吗? – user3561813 2015-01-20 20:52:10

+0

你确定它会更新吗?如果我制作一个宏来执行特定的查找,并在#中为col_index_num编写,然后下个月列位置不是3但是16,那么宏如何知道将col_index_num更改为16?我用一个例子编辑了我的问题,希望能够澄清。谢谢! – msim 2015-01-20 21:12:02

0

这里有一个想法:

  • 得到列ID#的指数在Sheet2中MATCH("ID#",Sheet2!$1:$1,0)
  • 转换为字符:CHAR(MATCH("ID#",Sheet2!$1:$1,0)+64)
  • 得到列范围: INDIRECT( CONCATENATE("Sheet2!", CHAR(MATCH("ID#",Sheet2!$1:$1,0)+64),":", CHAR(MATCH("ID#",Sheet2!$1:$1,0)+64)))
  • 同样列AltID#
    INDIRECT( CONCATENATE("Sheet2!", CHAR(MATCH("AltID#",Sheet2!$1:$1,0)+64),":", CHAR(MATCH("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))