我正在做一个项目,需要搜索一个非常大的销售列表,这意味着它是一个大型数据集,时间是我们正在努力减少的。数据集基本上包含三条信息:购买的对象类型,购买日期和金额。为简化起见,我将愚蠢地讨论下面的例子。
除了这个数据集之外,我们还为每种类型的对象创建了一个选项卡,每年的每个日期都在左下方运行。该项目的最终目标是将购买信息填充到每个选项卡上,以便我们可以进行进一步的,非基于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 :(得分:0)
我的第一个观察是你在一个循环中搜索或多或少知道的数量,即日期。如果您的已售商品列表中有10,000个商品,则您将为每个商品执行10,000次搜索,每次搜索都会显示366行。不是很有效率。
你可以做的一些事情: 第一个,也是最简单的是,添加"退出"在if语句中,至少一旦找到日期,就可以停止查找。这应该平均减少一半的时间 第二个是用find函数替换你的if then循环,我很确定会更快。
如果您想真正想要,可以将日期转换为Julian日期,并使用它直接访问该行。
最好的事情是,因为在代码中访问工作表非常耗时,就是创建一个数组来开始,然后进行所有比较并在内存中递增,然后将数组写回工作表。
根据代码的数量,您可以创建一个3D数组并一次完成所有这些操作。
您可能还会考虑使用字典,以日期为关键字,但由于我自己没有尝试过,所以您必须决定这是否可行。< / p>