基于列名称而不是单元名称的Excel查找数据

时间:2015-01-20 19:59:02

标签: excel vba excel-vba vlookup

我正在尝试在excel中完成一项奇怪的任务,并且不知道如何去做。我在工作中使用Excel 2007,我知道非常基本的vba。

我希望自动执行一个过程,在这个过程中,一个人需要三个电子表格并将其中的某些数据转储到一个主表格中。这三个电子表格按列顺序每个月都有所不同,所以很遗憾,我不能只编写vlookup来运行并获取数据。

我可能是错的,但似乎Vlookup匹配,索引匹配等等也不会起作用,因为它们仍在引用单元格。 我基本上需要能够找到基于列中文本而不是其位置的列的内容,因为位置会发生变化,但文本将始终相同。

我有两个想法,但我不知道它们是否有效,并且不知道从哪里开始实施它们:

  1. 将三个电子表格转换为表格并使用表格语法引用标题(我无法使其工作)
  2. 标识所有内容的复杂VBA
  3. 任何人都可以帮我指出正确的方向来完成这项任务吗?非常感谢你的帮助。

    编辑示例

    我尝试将内容转移到的主要模板只是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或其他任何方式。因此,无论列位置如何,我都需要一个查找它们的公式。只是通过标题文本匹配它们。我希望澄清......

2 个答案:

答案 0 :(得分:3)

如果将VLOOKUPMATCH合并,则可以根据列名进行搜索,而不是索引。请记住,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)

一些笔记。在我用文字硬编码的地方,你可以使用单元格引用。

答案 1 :(得分:0)

这是一个想法:

  • 获取Sheet2 ID#
  • 中列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))