2017-02-16 57 views
1

我已經創建了一個虛擬示例,下面有定價查詢表表2和一個交易表表1。下表。Excel索引匹配到遠程查詢表

表1

+----------+--------+ 
| CATEGORY | VOLUME | 
+----------+--------+ 
| Orange | 12  | 
+----------+--------+ 
| Orange | 25  | 
+----------+--------+ 
| Grape | 40  | 
+----------+--------+ 
| Grape | 700 | 
+----------+--------+ 

表2

+----------+-------+-------+ 
| CATEGORY | RANGE | PRICE | 
+----------+-------+-------+ 
| Orange | 10 | 2.50 | 
+----------+-------+-------+ 
| Orange | 20 | 2.00 | 
+----------+-------+-------+ 
| Orange | 30 | 1.50 | 
+----------+-------+-------+ 
| Grape | 50 | 5.00 | 
+----------+-------+-------+ 
| Grape | 100 | 2.00 | 
+----------+-------+-------+ 

希望是參考該查找表,並拉射程小於或等於VOLUME對於給定的類別相關聯的價格。在VOLUME大於查找表中任何範圍的情況下,它會將PRICE拉到最高範圍。

所需的輸出

+----------+--------+-------+ 
| CATEGORY | VOLUME | PRICE | 
+----------+--------+-------+ 
| Orange | 12  | 2.00 | 
+----------+--------+-------+ 
| Orange | 25  | 1.50 | 
+----------+--------+-------+ 
| Grape | 40  | 5.00 | 
+----------+--------+-------+ 
| Grape | 700 | 2.00 | 
+----------+--------+-------+ 

我的頭馬上就到採用雙一元 - (陣列功能,但是當這兩個表是記錄的幾十萬性能是行不通的

所有。想法非常讚賞。使用Excel 2016.

+0

您有多少個不同的類別? – CallumDA

+1

約500個類別。範圍 – Blake

+0

的每個範圍將有40-50個間隔,對於給定的「CATEGORY」,其範圍小於或等於「VOLUME」。您是否指最小的「RANGE」大於或等於「VOLUME」對於給定的'CATEGORY'? –

回答

1

我建議使用兩個工作表/表格的SQL語句,並使用CopyFromRecordset粘貼結果。

SQL:

SELECT t1.CATEGORY, t1.VOLUME, (
     SELECT PRICE 
     FROM [Table2$] AS t2 
     WHERE t1.CATEGORY = t2.CATEGORY 
      AND (
       t1.VOLUME <= t2.RANGE 
       OR t2.RANGE = MAXRANGE 
      ) 
     ORDER BY t2.RANGE 
    ) AS FINALPRICE 
FROM [Table1$] AS t1 
LEFT JOIN (
    SELECT CATEGORY, MAX(RANGE) AS MAXRANGE 
    FROM [Table2$ AS t2a] 
    GROUP BY CATEGORY 
) AS MAXRANGES ON t1.CATEGORY = MAXRANGES.CATEGORY 

添加引用(工具 - >引用...)以Microsoft ActiveX數據的最高版本對象(我的機器上是6.1)。

它假設三個工作表— Table1,Table2Results。 (也可以使用命名範圍或特定的單元格區域,如表)。

Sub main() 
Dim conn As New ADODB.Connection 
With conn 
    .Provider = "Microsoft.ACE.OLEDB.12.0" 
    .ConnectionString = "Data Source=""" & ActiveWorkbook.FullName & """;" & _ 
     "Extended Properties=""Excel 12.0;HDR=Yes""" 
    .Open 
End With 

Dim sql As String 
sql = _ 
    "SELECT t1.CATEGORY, t1.VOLUME, (" & _ 
      "SELECT TOP 1 PRICE " & _ 
      "FROM [Table2$] AS t2 " & _ 
      "WHERE t1.Category = t2.Category " & _ 
       "AND (" & _ 
        "t1.VOLUME <= t2.RANGE " & _ 
        "OR t2.RANGE = MAXRANGE " & _ 
       ") " & _ 
      "ORDER BY t2.RANGE " & _ 
     ") AS FINALPRICE " & _ 
    "FROM [Table1$] AS t1 " & _ 
    "LEFT JOIN (" & _ 
     "SELECT CATEGORY, MAX(RANGE) AS MAXRANGE " & _ 
     "FROM [Table2$] AS t2a " & _ 
     "GROUP BY CATEGORY " & _ 
    ") AS MAXRANGES ON t1.CATEGORY = MAXRANGES.CATEGORY" 

Dim rs As ADODB.Recordset 
Set rs = conn.Execute(sql) 

Worksheets("Results").Cells(1, 1).CopyFromRecordset rs 

conn.Close 
Set conn = Nothing 
Set rs = Nothing 
End Sub 
1

不知道,如果你能表2轉換成一個數據透視表。如果可以,下面應該可以工作

將表2轉換爲數據透視表。添加兩個輔助列(「行」和「列」)

Row =MATCH(E11,$E$3:$E$5,0) 

這讓你在

Column =IFERROR(1/AGGREGATE(14,6,1/(($F$2:$O$2>F11)*COLUMN($F$2:$O$2)*(OFFSET($F$2:$O$2,H11,0)>0)),1)-COLUMN($E$2),COLUMN($O$2)-COLUMN($E$2)) 

在這裏,我還使用數組操作樞軸表類別行(您有關注性能),但這僅限於兩行數組,而不是您擁有的全部數據。還不能說太多關於性能

$F$2:$O$2>F11給所有範圍比目前的量

COLUMN($F$2:$O$2)更大給出了列數當前類別行中

OFFSET($F$2:$O$2,H11,0)>0檢查,該細胞具有價值。

上述三個條件的組合給出的列數範圍大於所需的體積,並且具有相應的價格。

1/AGGREGATE()部分爲您提供了從第一列的編號COLUMN($E$2)減去的最小列編號。

如果體積大於最大範圍,則公式將給出在IFERROR部件中捕獲的錯誤。 COLUMN($O$2)-COLUMN($E$2)爲您提供了數據透視表中的最後一個列號。

一旦你的行和列數,價格可以通過下面的公式得到

=INDEX($E$3:$O$5,H11,I11+1) 

注意+1這個公式

在這裏,在列數是看圖像的參考文獻中正確

Sceenshot

要檢查性能我生成的391個種類的數據集的每一個具有40米範圍。不使Excel慢....但你的情況可能會有所不同

Performance screenshot

讓我知道如果您需要了解幫助。我的解釋可能還不夠:P