我正在做一个项目,需要通过一个非常大的销售清单进行搜索,这意味着它是一个大型数据集,时间是我们试图减少的。数据集实际上包含三条信息:购买的对象的类型,购买的日期和金额。为了简化,我将哑下面的例子。使用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似乎也有所帮助,但是一般来说,阵列的使用是使体验更好。再次感谢! –