2013-03-20 52 views
0

这里是场景:快速计算以获得不同级别的数字倍数

我们有几个物品运到很多商店。我们希望能够根据需要为商店分配一定数量的每件商品。这些商店中的每一个也都与特定仓库相关联。

问题是,在仓库级别,每个项目的总数量必须是一个数字的倍数(例如6)。

我在水平已经计算出各店所需要的数量,但他们没有在仓库水平总结到6的倍数。

我的解决办法是这样的使用Excel:

使用SUMIFS公式来跟踪在仓库级分配每个项目的总和。然后,另一个MOD(6)公式计算剩余的直到6的倍数。然后,我的实际VBA代码循环并从商店减去1(如果MOD < = 3)或增加(如果MOD> 3)直到所有行的MOD = 0。

现在这对我很有用,但即使当我只有5000行时,它也非常慢。

我正在寻找更快的解决方案,因为每次我减去/添加到需要的单位时,需要再次计算SUMIFS和MOD。

编辑:(试图更清晰)

我有我的数据粘贴到具有以下设置的模板文件:

+------+-------+-----------+----------+--------------+--------+ 
| Item | Store | Warehouse | StoreQty | WarehouseQty | Mod(6) | 
+------+-------+-----------+----------+--------------+--------+ 
| 1 |  1 |   1 |  2 |   8 |  2 | 
| 1 |  2 |   1 |  3 |   8 |  2 | 
| 1 |  3 |   1 |  1 |   8 |  2 | 
| 1 |  4 |   1 |  2 |   8 |  2 | 
| 2 |  1 |   2 |  1 |   4 |  2 | 
| 2 |  2 |   2 |  3 |   4 |  2 | 
+------+-------+-----------+----------+--------------+--------+ 

目前WarehouseQty列是SUMIFS公式总结为与仓库关联的每个Item-Store组合添加StoreQty。所以我猜每次Item-Store组合显示时,Warehouse/WarehouseQty列实际上都会重复多次。该WarehouseQty是需要为6

+0

林现在要尝试。虽然我也在更新Application.Status来告诉我所在的行,这是否会对速度产生显着影响? – yeenow123 2013-03-20 20:01:21

回答

0

屏幕更新的倍数的一个可以被关断以加快长度计算如下:

Application.ScreenUpdating = FALSE 

的相对分配变成屏幕更新再次打开。

+1

我正在使用ScreenUpdating = FALSE来运行它,并且性能似乎不太好。我还在更新状态栏,告诉我它的计算行是什么,将删除这个沙特更新提高性能很多? – yeenow123 2013-03-20 20:18:16

+0

它不应该除非你比每循环iteraion更频繁地重新使用ProgresBar设置。 – 2013-03-20 20:22:17

0

猜测你可能会发现停止屏幕刷新可能有助于相当大块,因此不需要任何更多的建议。

另一种选择是减少对数量的调整,该数量可以被6除以若干if语句,具体取决于mod(6)的值。

你也可以解决你如何总结所有商店特定项目的数量,使用数据透视表和读取总和从那里比基于在宏

使用sumifs快得多。您对问题的修改:

你是正确的,你可以有大量的复制按行进行计算,以及一次调整一个单位的数量,即使你确切知道你有多少单位需要添加/删除mod(6)公式。

您是否可以不使用产品ID和商店的所有可能组合创建新工作表。然后,您可以使用sumifs()作为这些独特组合的每一个,并在仓库级别的最后一步中向上/向下舍入?

+0

使用数据透视表,我认为每次减去/添加数量时都需要刷新表格,这是否会比重新计算sumif的速度慢? – yeenow123 2013-03-20 20:21:14

+0

好的抱歉,我没有发现您在商店一级进行了调整。看起来你还有其他一些值得研究的好建议。你是否需要刷新数据透视表 - 是不是然后检查你知道的数字是否可以被6整除?我可能没有拿起你的具体问题的症结...... – Texas 2013-03-20 20:28:04

+0

编辑我的帖子与实际的表,希望它使它更清晰。 – yeenow123 2013-03-20 20:49:00

0

首先将数据放入数组中,而不是单元格,然后在操作后将数据放回 - 这将快得多。

后者则使用标准的例子:

Option Explicit 

Sub test() 
Dim q() 'this is what will be used for the range 
Dim i As Long 

q = Range("C2:C41") 'put the data into the array - *ALWAYS* 2 dimensions, even if a single column 
For i = LBound(q) To UBound(q) ' use this, in case it's a dynamic array - 1 to 40 would have worked here 
    Select Case q(i, 1) Mod 6 ' calculate remander 
     Case 0 To 3 
      q(i, 1) = q(i, 1) - (q(i, 1) Mod 6) 'make a multiple of 6 
     Case 4 To 5 
      q(i, 1) = q(i, 1) - (q(i, 1) Mod 6) + 6 ' and go higher in the later numbers 
    End Select 
Next i 

Range("D2:D41") = q ' drop the data back 

End Sub 
+0

我试图在仓库级舍入多个(因此我需要SUMIFS公式),但实际上我正在更改的数字是在商店级别(多个商店映射到一个仓库),所以我没有认为这会让事情运行得更快.. – yeenow123 2013-03-22 16:09:19