2013-03-20 51 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