2013-10-21 27 views
0

,看起來像這樣我的Excel數據:在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 

然而,在數據表中,不是所有的列有t1t2數據,和t3,所以直接HLOOKUP不起作用。基本上我試圖使用的過程分爲四個部分(所有公式假設我們正在談論的雪佛蘭2012細胞,但看到所有的血淋淋的細節附截圖):

  • 創建列標題的將在數據表中查找。假設結果表格在單元格A1中有最左上角(如圖所示),我在第一個單元格(Chevy,2012)中使用了=CONCATENATE(UPPER(B$1), "_", MID($A2, 3, 2)),如圖所示。

  • 找到數據表中的列,其中包含與步驟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))。由於我不知道進入的最大行數(換句話說,有多少個t1t2,t3等等),我不得不在行標籤中找到包含文本的最後一行作爲好。我使用this link的公式來查找範圍內的最後一個數字(MATCH(9E+307,range))或文本(MATCH(REPT("z",255),range))。

  • 使用上面構建的塊在數據表中執行最後的HLOOKUP

下面是最終電子表格:

spreadsheet

數據表位於細胞$E$6:$I$9,看起來像這樣:

data table

有沒有一種簡單的方法執行這樣的查找?我結合所有這些作品爲一個公式,像這樣(的例子公式查找爲雪佛蘭,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.

+0

如何只將數據清理到一個數據庫類型的格式?這是你可以使用的東西嗎? – nutsch

+0

所以你現有的公式有效,但你想要的東西看起來更簡單?我必須同意@nutsch,如果你想公式更清潔,輸入數據必須更清潔。 –

+0

@nutsch不幸的是沒有。我公司的許多不同團隊都使用這個數據集,並且他們依賴於* this *,而不是最佳格式。我無法僅僅爲了我的目的而改變數據集,因爲我冒着破壞公司其他許多流程的風險。 –

回答

1

您可以使用用戶定義函數

喜歡的東西

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) 
相關問題