我正在做一個項目,需要通過一個非常大的銷售清單進行搜索,這意味着它是一個大型數據集,時間是我們試圖減少的。數據集實際上包含三條信息:購買的對象的類型,購買的日期和金額。爲了簡化,我將啞下面的例子。使用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
我不一定要找人爲我做這件事,但我非常願意讓任何想法讓搜索變得更快。
謝謝!
感謝您的幫助!我會嘗試一些這些想法,雖然從我對其中一些人的理解中,他們應該帶領我走上一條很好的道路! –
你怎麼弄出來的?如果有的話,它對你的運行時間造成了最大的影響? – Hrothgar
由於在內存中執行的計算而不是直接在表單上執行計算,使用數組迄今爲止取得了最大的差異。 Exit For似乎也有所幫助,但是一般來說,陣列的使用是使體驗更好。再次感謝! –