0

我有如下所示的 Excel 数据:

      CHEVY_12       FORD_12        FORD_13        CHEVY_13
t1    462.0646058    5.507611655    887.4193417    197.1054415
t2    427.4865042    646.2186952                   685.0746363
t3    175.4137935                                  73.77079157

列都混在一起了,列标题没有任何有意义的顺序。

我的目标是将这个表中的数据放入一个表中,使其看起来像这样:

<cell A1>  Chevy          Ford
2012       175.4137935     646.2186952
2013        73.77079157     887.4193417

但是,在数据表中,并非所有列都有、 和的数据t1,因此直线行不通。基本上我尝试使用的程序有四个部分(所有公式都假设我们正在谈论雪佛兰 2012 单元格,但请参阅随附的屏幕截图了解所有血腥细节):t2t3HLOOKUP

  • 创建将在数据表中查找的列标题。假设结果表在单元格 A1 中具有最左角(如图所示),我=CONCATENATE(UPPER(B$1), "_", MID($A2, 3, 2))在第一个单元格(Chevy,2012)等中执行此操作,如图所示。

  • 在数据表中找到与步骤 1 中构造的标题匹配的标题的列。我只是用于=MATCH(B3, $F$6:$I$6, 0)此。

  • 根据列标题查找每列中包含数据的最后一行。我用=MATCH(9E+307, OFFSET($E$6, 1, B9, MATCH(REPT("z", 255), $E$7:$E$9), 1))这个。由于我不知道最大行数(换句话说,我将有多少t1, t2,等),所以我还必须在行标签中找到带有文本的最后一行。t3我使用此链接中的公式来查找范围内的最后一个数字 ( MATCH(9E+307,range)) 或文本 ( MATCH(REPT("z",255),range))。

  • 使用上面构建的部分HLOOKUP在数据表中执行最终。

这是最终的电子表格:

电子表格

数据表位于单元格中$E$6:$I$9,如下所示:

数据表

有没有更简单的方法来执行这样的查找?我将所有这些部分组合成一个公式,如下所示(示例公式查找雪佛兰的数据,2012):

=HLOOKUP(CONCATENATE(UPPER(B$2), "_", MID($A3, 3, 2)), $F$6:$I$9, MATCH(9E+307, OFFSET($E$6, 1, MATCH(CONCATENATE(UPPER(B$2), "_", MID($A3, 3, 2)), $F$6:$I$6, 0), MATCH(REPT("z", 255), $E$7:$E$9), 1)) + 1)

但显然这真的很乱,我想知道是否有更简单的方法。我想用一个公式来做到这一点(如上一个例子),但最后一个公式做了我不喜欢的事情,比如执行两次连接)。我正在使用 Excel 2013。

4

1 回答 1

1

您可以使用User Defined Function

就像是

Function MyUDF(Brand As Variant, Yr As Variant, Data As Range) As Variant
    Dim Hdr As String
    Dim DataCol As Long

    Hdr = UCase(Brand) & "_" & Right$(Yr, 2)
    DataCol = Application.Match(Hdr, Data.Rows(1), 0)
    With Data.Columns(DataCol)
        If Len(.Cells(.Rows.Count, 1)) = 0 Then
            MyUDF = .Cells(.Rows.Count, 1).End(xlUp)
        Else
            MyUDF = .Cells(.Rows.Count, 1)
        End If
    End With
End Function

像这样调用(基于您的示例数据地址)并复制到所需的范围

=MyUDF(B$2,$A3,$E$6:$I$9)
于 2013-10-22T02:16:31.740 回答