2016-11-07 62 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似乎也有所帮助,但是一般来说,阵列的使用是使体验更好。再次感谢! –