2016-11-07 68 views
0

我正在做一個項目,需要通過一個非常大的銷售清單進行搜索,這意味着它是一個大型數據集,時間是我們試圖減少的。數據集實際上包含三條信息:購買的對象的類型,購買的日期和金額。爲了簡化,我將啞下面的例子。使用VBA搜索並匹配兩個參數來提取值

除了此數據集之外,我們還爲每個對象類型創建了一個選項卡,並且每年的每個日期都沿着左側走向。該項目的最終目標是將購買信息填充到每個選項卡上,以便我們可以進一步進行非基於Excel的分析。

購買內容如下所示。在實際數據中,有成千上萬的購買行和十幾種類型(包含在名爲「購買」的表中)。

Product_Type   Purchase_Date   Amount 
------------   -------------   ------ 
Prod A    1/1/2016    15 
Prod A    1/3/2016    10 
Prod A    1/8/2016    5 
Prod A    1/10/2016    15 
Prod A    1/15/2016    25 
Prod B    1/5/2016    25 
Prod B    1/7/2016    25 
Prod B    1/10/2016    25 
Prod B    1/13/2016    25 

得到的標籤將如下所示:

Product Type: Prod A  (In it's own hard-coded cell, let's say A1) 
Date   Purchases 
1/1/2016  15 
1/2/2016  0 
1/3/2016  10 
1/4/2016  0 
1/5/2016  0 
1/6/2016  0 
1/7/2016  0 
1/8/2016  5 
... (fills out entire year) 

在購買列中的數字是我們想去那裏。這些日期在創建標籤時也會被填充,所以我們不一定在那裏使用硬編碼的SUMIF。

目前,我們正在以非常迂迴的方式做這件事需要很長時間:這包含在一個更大的腳本中,它爲每個標籤執行此操作。

Set InfoDataRange = Range("Purchases[Product_Type]:Purchases[Amount]") 
FirstDate = DateAdd("yyyy", -1, Sheets("Control Log").Range("D6").Value) --populates 1/1 
LastDate = Sheets("Control Log").Range("D6").Value -- populates 12/31 
    Rownum = 2 
    Do 
     FirstDate = FirstDate + 1 
     Cells(Rownum, 1) = FirstDate 
     For Each InfoDataRow In InfoDataRange 
      If InfoDataRow.Cells(1, 1) = Range("A1") And _ 'Matching product 
       InfoDataRow.Cells(1, 2) = FirstDate Then  'Matching date 
      Cells(Rownum, 2) = InfoDataRow.Cells(1, 3) 
      End If 
     Next 
     Rownum = Rownum + 1 
    Loop Until FirstDate = LastDate 

我不一定要找人爲我做這件事,但我非常願意讓任何想法讓搜索變得更快。

謝謝!

回答

0

我的第一個觀察結果是,您正在循環搜索一個或多或少的已知數量,即日期。如果您的銷售商品列表中有10,000個商品,那麼您將針對每個商品執行該搜索10,000次,並且每個搜索都會查看366行。效率不高。

你可以做的一些事情: 第一種也是最簡單的方法是在if語句中添加「exit for」,這樣至少一旦找到日期,就可以停止查找。這應該平均減少一半的時間。
第二個將是替換你的if then循環與查找功能,我敢肯定會更快。

如果你想變得很花哨,你可以將日期轉換爲Julian日期,並用它直接訪問該行。

儘管如此,因爲在代碼中訪問工作表非常耗時,因此需要先創建一個數組,然後在內存中執行所有比較並遞增,然後將數組寫回工作表。

根據代碼數量的不同,您可以創建一個3D數組並在一次完成所有操作。

你也可以考慮使用字典,日期作爲關鍵字,但由於我自己沒有嘗試過,所以你必須決定是否要這樣。

+0

感謝您的幫助!我會嘗試一些這些想法,雖然從我對其中一些人的理解中,他們應該帶領我走上一條很好的道路! –

+0

你怎麼弄出來的?如果有的話,它對你的運行時間造成了最大的影響? – Hrothgar

+0

由於在內存中執行的計算而不是直接在表單上執行計算,使用數組迄今爲止取得了最大的差異。 Exit For似乎也有所幫助,但是一般來說,陣列的使用是使體驗更好。再次感謝! –