返回列表 上一主題 發帖

[發問] 求助~排程填入日期

[發問] 求助~排程填入日期

由於小弟的巨集功力不足,想請教板上各位高手下面這個問題~
想要將出貨日

拆開到各子批的交期

如說明

跪求各位大大協助~謝謝!
排程問題.rar (4.82 KB)
Adam

回復 1# adam2010


    試試看吧
  1. Private Sub CommandButton1_Click()

  2. Dim LotID As Range, Tagt As Range, Qty As Range
  3. Dim a, TalQty

  4. With sheet2

  5.     For Each LotID In .Range("A2:A" & .[A65536].End(xlUp).Row)
  6.    
  7.         For Each Tagt In .Range("B" & LotID.Row & ":J" & LotID.Row)
  8.         
  9.             If Tagt <> "" Then
  10.         
  11.                 With Sheet1
  12.             
  13.                     a = Application.Match(LotID, .[A:A], 0)
  14.                     aa = Application.CountIf(.[A:A], LotID)
  15.                     TalQty = 0
  16.         
  17.                     For Each Qty In .Range("D" & a & ":D" & (a + aa - 1))
  18.             
  19.                         If Qty.Offset(, 1) <> "" Then GoTo ntxa
  20.                
  21.                         Qty = Qty + TalQty
  22.                
  23.                         If Qty < Tagt Then
  24.                         
  25.                             Qty.Offset(, 1) = sheet2.Cells(1, Tagt.Column)
  26.                             TalQty = Qty
  27.                         
  28.                         Else
  29.                            
  30.                             Qty.Offset(, 1) = sheet2.Cells(1, Tagt.Column)
  31.                             GoTo ntla
  32.                         End If
  33. ntxa:
  34.                     Next Qty
  35. ntla:
  36.                 End With
  37.             End If
  38.             
  39.         Next Tagt
  40.    
  41.     Next LotID

  42. End With
  43.    
  44. End Sub
複製代碼

TOP

感謝Dino大大迅速的協助,不過執行後
有部分數量被改到了,跟手動排的也有一些差異(如下圖綠底的部分是手排的結果)
小弟汗顏看不出是哪裡的問題?再次懇請協助,謝謝!

差異.jpg (159.89 KB)

差異.jpg

Adam

TOP

回復 3# adam2010


    排程應該會考慮每批最大量或最小量是多少?
就以1/1的250來說,為何要排成2批100、200
不能排100、150嗎?
程式設計必須考慮到整體邏輯相通,若有特別規定就必須詳細說明各種限制條件
才能整理出共同特性來解決問題
學海無涯_不恥下問

TOP

感謝超級版主的提醒,應該是我描述得不夠清楚...
關於版主所提的問題~排程應該會考慮每批最大量或最小量是多少?
就以1/1的250來說,為何要排成2批100、200,不能排100、150嗎?

因為公司產品特性投料時是外購而來一根一根長短不一的晶棒,批量則是根據切的厚度計算出來的片數,會有上下限但是無法控制批量大小
而且有時候因為機台作業特性(一次要切兩段),所以可能需求只有250但是投料的時候需要投2段就變成會有多的一批是暫時沒有交期的

因此以這個範例來看只能先將超過1/1需求量的批次A001~A002定交期為1/1,而A002剩下的50片則可以給1/5
然後1/5需要的300片就用A003....一直到最後一批因為前面的數量已經足夠所以就暫時沒有交期
物料B的則一樣因為1/5需求550,所以要有兩個批次才夠
另外就是訂單的出貨日是客戶給的數量以及需求的日期,所以並不會有一定的規則

不知道這樣的描述是不是比較清楚
Adam

TOP

再補充一點就是有時候也會有
有訂單,但是尚未投料的狀況,所以只要將交期分配到同一個物料的批號結束即可
Adam

TOP

本帖最後由 stillfish00 於 2013-1-11 14:15 編輯

回復 6# adam2010
試試看
  1. Sub Test()
  2. Dim rng As Range
  3. Dim s1 As Long, s2 As Long
  4. Dim cindex As Long

  5. With Sheets(2)
  6.     Set rng = .Range(.[A1], .[A1].End(xlToRight).End(xlDown).Offset(, -1))  '[出貨日]資料範圍
  7. End With

  8. For Each c In Sheets(1).[E2:E15]    '[交期]資料填入範圍
  9.     If c.Offset(, -4).Value <> c.Offset(-1, -4).Value Then
  10.         cindex = 1
  11.         s1 = 0  '累積至前一批數量
  12.         s2 = 0  '累積出貨需求數量
  13.     Else
  14.         s1 = s1 + c.Offset(-1, -1).Value
  15.     End If
  16.    
  17.     Do While s2 <= s1 And cindex < rng.Columns.Count
  18.         cindex = cindex + 1
  19.         s2 = s2 + Application.VLookup(c.Offset(, -4).Value, rng, cindex, False)
  20.     Loop
  21.    
  22.     If s2 <= s1 Then
  23.         c.Value = "NA"
  24.     Else
  25.         c.Value = rng.Cells(1, cindex).Value
  26.     End If
  27. Next
  28. Set rng=Nothing
  29. End Sub
複製代碼

TOP

太感動了!感謝stillfish00大大的協助,這裡真是高手如雲,每個都是大師級的
剛才試了 一下完全符合我的需求,不過套用到公司正式的大型檔案發現還有2個小問題
1.For Each c In Sheets(1).[E2:E15]    '[交期]資料填入範圍→如果範圍是變動的該如何修改
2.如果遇到交期裡面有但是出貨日沒有的物料就會因為找不到卡在21行→要如何增加一個判別讓找不到的也顯示NA
解決了這2個問題應該就很完美了
Adam

TOP

本帖最後由 Hsieh 於 2013-1-12 00:10 編輯

回復 8# adam2010
Sheets("交期")的D欄數量是人工先輸入好的嗎?
試試看
  1. Sub ex()
  2. Dim Ar(), Ay(), C As Range, Rng As Range
  3. Set d = CreateObject("Scripting.Dictionary") '數量
  4. Set d1 = CreateObject("Scripting.Dictionary") '日期
  5. With Sheets("出貨日")
  6. For Each a In .Range(.[A2], .[A2].End(xlDown)) '物料
  7.   Set Rng = a.EntireRow.SpecialCells(xlCellTypeConstants, xlNumbers) '訂貨
  8.   ReDim Preserve Ar(s) '數量
  9.   ReDim Preserve Ay(s) '日期
  10.   Ar(s) = 0
  11.   Ay(s) = .Cells(1, Rng.Column)
  12.   s = s + 1
  13.      For Each C In Rng
  14.         cnt = cnt + C
  15.         ReDim Preserve Ar(s)
  16.         ReDim Preserve Ay(s)
  17.         Ar(s) = cnt
  18.         Ay(s) = .Cells(1, C.Column).Value
  19.         s = s + 1
  20.      Next
  21.      d(a.Value) = Ar
  22.      d1(a.Value) = Ay
  23.      Erase Ar: Erase Ay: s = 0: cnt = 0
  24. Next
  25. End With
  26. With Sheets("交期")
  27.   For Each a In .Range(.[A2], .[A2].End(xlDown))
  28.      cnt = cnt + a.Offset(, 3)
  29.      If cnt <= Application.Max(d(a.Value)) Or cnt - a.Offset(, 3) < Application.Max(d(a.Value)) Then _
  30.      a.Offset(, 4) = Application.Lookup(cnt, d(a.Value), d1(a.Value)) _
  31.      Else a.Offset(, 4) = "NA"
  32.      If a <> a.Offset(1) Then cnt = 0
  33.   Next
  34. End With
  35. End Sub
複製代碼
學海無涯_不恥下問

TOP

Dear Hsieh大~感謝您出手相助
Sheets("交期")的D欄數量是公司報表篩出來的~
用公司的資料測試過之後Hsieh大的巨集解決了找不到會停止的問題,不過日期有些出入

......汗顏找不出問題所在,所以再次求助,謝謝!
Test-1.rar (31.57 KB)
Adam

TOP

        靜思自在 : 修行要繫緣修心,藉事練心,隨處養心。
返回列表 上一主題