Board logo

標題: [發問] 前輩關於數列減去的寫法 [打印本頁]

作者: melvinhsu    時間: 2014-4-10 10:33     標題: 前輩關於數列減去的寫法

本帖最後由 GBKEE 於 2014-4-10 10:41 編輯

致 各位前輩 能煩替小弟解惑 ,在附件中的 檔案
小弟雖寫了些語法,但仍未能達成 ,我要的想法
在附件裡  ,

》》以多筆的資料裡 ,j欄位 為目前  g欄位(品項)的所有庫存數  。

1比對g欄位(品項) ,如不同品項,則以   h欄位(訂單數) ;作為i 欄位(可出貨數)

2.但比對g欄位(品項),如為同品,則以 j 欄位 的庫存為基準 ,依序扣除  至 庫存為0 為止,後續如還有 同品要出 ,則直接刪除 ,不繼續比對。

但在過程中,這裡遇到些狀況 ,如上一筆 扣完庫存數如還有 4個 ,下一筆  訂單是要  5個 ,但在判斷上 ,仍是得出 4個 ,但不刪除,是刪除後續的訂單。

        item        訂單數        實際可出        庫存數       
        a                  4                       4                  10       
1        b                  5                       5                  10       
2        b                  5                       5                  10       
3        b                  5                       0                  10        刪去

這裡由心謝過各位
作者: melvinhsu    時間: 2014-4-10 11:23

回復 1# melvinhsu


板大,小弟附上,[attach]17973[/attach]
作者: GBKEE    時間: 2014-4-10 19:00

本帖最後由 GBKEE 於 2014-4-10 19:06 編輯

回復 2# melvinhsu
試試看
  1. Option Explicit
  2. Sub testing3()
  3.     Dim i As Integer, D1 As Object, D2 As Object, Rng As Range
  4.     Set D1 = CreateObject("SCRIPTING.DICTIONARY")  '字典物件
  5.     Set D2 = CreateObject("SCRIPTING.DICTIONARY")  '字典物件
  6.     i = 2                                          '第2列開始
  7.    
  8.     Do While Cells(i, "G") <> ""                   '執行迴圈條件 G欄<>""
  9.         With Cells(i, "G")                         'G欄i列 的物件
  10.             If Not D1.Exists(.Value) Then          '字典的key不存在
  11.                 D1(.Value) = Cells(i, "J")         '庫存數
  12.                 D2(.Value) = 0                     '出貨數總數
  13.             End If
  14.             If (D1(.Value) - D2(.Value)) >= Cells(i, "H") Then '庫存數-出貨數總數>=訂單數
  15.                 Cells(i, "I") = Cells(i, "H")           '訂單實際出貨數
  16.                 D2(.Value) = D2(.Value) + Cells(i, "I") '訂單實際出貨數的加總
  17.             ElseIf (D1(.Value) - D2(.Value)) > 0 And (D1(.Value) - D2(.Value)) < Cells(i, "H") Then
  18.                  '庫存數-出貨數總數 > 0                 '庫存數-出貨數總數 > 訂單數
  19.                 Cells(i, "I") = D1(.Value) - D2(.Value) '訂單實際出貨數=庫存數-出貨數總數
  20.                 D2(.Value) = D2(.Value) + Cells(i, "I") '出貨數總數=出貨數總數+訂單實際出貨數
  21.             ElseIf D1(.Value) = D2(.Value) Then         '無貨可出:庫存數=出貨數總數
  22.                 Cells(i, "I") = ""
  23.                 If Not Rng Is Nothing Then
  24.                     Set Rng = Union(Rng, Range("F" & i & ":J" & i))
  25.                 Else
  26.                     Set Rng = Range("F" & i & ":J" & i)
  27.                 End If
  28.             End If
  29.         End With
  30.         i = i + 1
  31.     Loop
  32.    If Not Rng Is Nothing Then Rng.Select
  33. End Sub
複製代碼

作者: melvinhsu    時間: 2014-4-10 21:28

回復 3# GBKEE



謝謝板大,耐心的回應小弟的問題,小弟的道行真的差太遠
作者: Andy2483    時間: 2023-4-18 14:20

本帖最後由 Andy2483 於 2023-4-18 14:28 編輯

謝謝論壇,謝謝各位前輩
後學藉此帖練習陣列與字典,變更情境為模擬出貨結餘或不足,
學習方案如下,請各位前輩指教

執行前:
[attach]36173[/attach]

執行結果:
[attach]36174[/attach]


Option Explicit
Sub TEST()
Dim Brr, Y, Lh&, Lj&, i&, Tg$, xR As Range
Set Y = CreateObject("Scripting.Dictionary")
Set xR = Range([J1], Cells(Rows.Count, "G").End(xlUp)): Brr = xR
For i = 2 To UBound(Brr)
   If i = 2 Then Brr(1, 1) = "訂單量累加": Brr(1, 2) = "虛擬出貨後庫存": Brr(1, 3) = "備註"
   Tg = Brr(i, 1): Lh = Brr(i, 2): Lj = Brr(i, 4)
   If Y(Tg) = "" Then
      Y(Tg) = Lh: Y(Tg & "庫存") = Lj
      Else: Y(Tg) = Y(Tg) + Lh
   End If
   Y(Tg & "庫存") = Y(Tg & "庫存") - Lh
   Brr(i, 1) = Y(Tg)
   Brr(i, 2) = Y(Tg & "庫存")
   If Brr(i, 2) < 0 Then
      Brr(i, 3) = Tg & "_庫存數不足累計 " & -Brr(i, 2)
      ElseIf Brr(i, 2) = 0 Then Brr(i, 3) = Tg & "_0庫存"
      Else: Brr(i, 3) = Tg & "_庫存數結餘 " & Brr(i, 2)
   End If
Next
With Intersect(xR.Offset(0, 4), [K:M])
   .EntireColumn.ClearContents
   .Value = Brr
End With
Set Y = Nothing: Set xR = Nothing: Erase Brr
End Sub




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)