0

シナリオは次のとおりです。

多くの店舗に出荷されるいくつかのアイテムがあります。必要に応じて、各アイテムの特定の数量をストアに割り当てられるようにしたいと考えています。これらの各店舗は、特定の倉庫にも関連付けられています。

問題は、倉庫レベルでは、各アイテムの合計数量が数の倍数 (たとえば 6) である必要があることです。

店舗レベルで各店舗に必要な数量を計算済みですが、倉庫レベルでは合計が 6 の倍数になりません。

私の解決策は、Excelを使用してこれでした:

SUMIFS 式を使用して、倉庫レベルで割り当てられた各アイテムの合計を追跡します。次に、6 の倍数までの残りを計算する別の MOD(6) 式。 次に、実際の VBA コードがループして、MODまで必要なストアレベル ユニットから 1 を減算 (MOD <= 3 の場合) または追加 (MOD > 3 の場合) します。 = すべての行で 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 列は、倉庫に関連付けられている各 Item-Store コンボの StoreQty を合計する SUMIFS 式です。そのため、Item-Store コンボが表示されるたびに、Warehouse/WarehouseQty 列が実際に数回複製されていると思います。WarehouseQty は、6 の倍数である必要があるものです。

4

3 に答える 3

0

画面の更新をオフにして、次のように長さの計算を高速化できます。

Application.ScreenUpdating = FALSE

反対の割り当ては、画面の更新を再び有効にします。

于 2013-03-20T19:59:58.263 に答える
0

画面の更新を停止すると、かなりの部分が改善される可能性があるため、これ以上の提案は必要ないことに気付くかもしれません。

別のオプションは、 の値に応じて、if ステートメントの数に対して 6 で割り切れる量に調整を減らすことですmod(6)

また、ピボット テーブルを使用してすべての店舗で特定のアイテムの数を合計する方法に対処することもできます。ピボット テーブルから合計を読み取る方がsumifs、マクロで使用するよりもはるかに高速です。

質問への変更に基づいて:

mod から追加/削除する必要があるユニットの数が正確にわかっている場合でも、行ごとに計算を実行し、一度に 1 ユニットずつ数量を調整することで、膨大な量のレプリケーションを行うことができることは正しいです( 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 に答える