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 公式,用于汇总与 Warehouse 关联的每个 Item-Store 组合的 StoreQty。所以我猜每次出现 Item-Store 组合时,Warehouse/WarehouseQty 列实际上都会重复多次。WarehouseQty 需要是 6 的倍数。

4

3 回答 3

0

可以关闭屏幕更新以加快长度计算,如下所示:

Application.ScreenUpdating = FALSE

相反的分配会再次打开屏幕更新。

于 2013-03-20T19:59:58.263 回答
0

猜测您可能会发现停止屏幕刷新可能会有所帮助,因此不需要更多建议。

另一种选择是根据mod(6).

您还可以解决如何汇总所有商店中特定商品的数量,使用数据透视表并从中读取总和比sumifs在宏中使用要快得多

根据您对问题的修改:

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

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

于 2013-03-20T20:15:04.150 回答
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
于 2013-03-20T20:20:38.760 回答