Board logo

標題: [發問] 求助~排程填入日期 [打印本頁]

作者: adam2010    時間: 2013-1-10 01:09     標題: 求助~排程填入日期

由於小弟的巨集功力不足,想請教板上各位高手下面這個問題~
想要將出貨日
[attach]13866[/attach]
拆開到各子批的交期
[attach]13867[/attach]
如說明
[attach]13868[/attach]
跪求各位大大協助~謝謝!
[attach]13865[/attach]
作者: dino1978    時間: 2013-1-10 14:18

回復 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
複製代碼

作者: adam2010    時間: 2013-1-10 22:10

感謝Dino大大迅速的協助,不過執行後
有部分數量被改到了,跟手動排的也有一些差異(如下圖綠底的部分是手排的結果)
小弟汗顏看不出是哪裡的問題?再次懇請協助,謝謝!
[attach]13873[/attach]
作者: Hsieh    時間: 2013-1-10 22:45

回復 3# adam2010


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

感謝超級版主的提醒,應該是我描述得不夠清楚...
關於版主所提的問題~排程應該會考慮每批最大量或最小量是多少?
就以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,所以要有兩個批次才夠
另外就是訂單的出貨日是客戶給的數量以及需求的日期,所以並不會有一定的規則

不知道這樣的描述是不是比較清楚
作者: adam2010    時間: 2013-1-11 00:31

再補充一點就是有時候也會有
有訂單,但是尚未投料的狀況,所以只要將交期分配到同一個物料的批號結束即可
作者: stillfish00    時間: 2013-1-11 14:14

本帖最後由 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
複製代碼

作者: adam2010    時間: 2013-1-11 22:44

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

本帖最後由 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
複製代碼

作者: adam2010    時間: 2013-1-12 01:26

Dear Hsieh大~感謝您出手相助
Sheets("交期")的D欄數量是公司報表篩出來的~
用公司的資料測試過之後Hsieh大的巨集解決了找不到會停止的問題,不過日期有些出入
[attach]13886[/attach]
......汗顏找不出問題所在,所以再次求助,謝謝!
[attach]13887[/attach]
作者: stillfish00    時間: 2013-1-12 17:36

回復 8# 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("出貨日")
  6.     Set rng = .Range(.[A1], .[A1].End(xlToRight).End(xlDown).Offset(, -1))  '[出貨日]資料範圍
  7. End With

  8. For Each c In Sheets("交期").Range("E2:E" & Sheets("交期").[A1].End(xlDown).Row)   '[交期]資料填入範圍
  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
  18.         cindex = cindex + 1
  19.         If Application.IsError(Application.VLookup(c.Offset(, -4).Value, rng, cindex, False)) Then
  20.             Exit Do
  21.         Else
  22.             s2 = s2 + Application.VLookup(c.Offset(, -4).Value, rng, cindex, False)
  23.         End If
  24.     Loop
  25.    
  26.     If s2 <= s1 Then
  27.         c.Value = "NA"
  28.     Else
  29.         c.Value = rng.Cells(1, cindex).Value
  30.     End If
  31. Next
  32. Set rng = Nothing
  33. End Sub
複製代碼

作者: adam2010    時間: 2013-1-12 18:26

感謝Dino大,Hsieh大以及stillfish00大的協助,
測試無誤,解決我近幾週的困擾,太感動了,謝謝!
作者: Hsieh    時間: 2013-1-12 23:44

回復 10# adam2010
Lookup函數並不適用
  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.      For Each C In rng
  9.         cnt = cnt + C
  10.         ReDim Preserve Ar(s)
  11.         ReDim Preserve Ay(s)
  12.         Ar(s) = cnt
  13.         Ay(s) = .Cells(1, C.Column).Value
  14.         s = s + 1
  15.      Next
  16.      d(a.Value) = Ar
  17.      d1(a.Value) = Ay
  18.      Erase Ar: Erase Ay: s = 0: cnt = 0
  19. Next
  20. End With
  21. With Sheets("交期")
  22.   For Each a In .Range(.[A2], .[A2].End(xlDown))
  23.      cnt = cnt + a.Offset(, 3)
  24.      If cnt <= Application.Max(d(a.Value)) Or cnt - a.Offset(, 3) < Application.Max(d(a.Value)) Then
  25.      i = 0
  26.      Do Until cnt - a.Offset(, 3) < d(a.Value)(i) Or i = UBound(d(a.Value))  '找到陣列中比已交貨數量還大的應交貨數量
  27.      n = d(a.Value)(i)
  28.        i = i + 1
  29.      Loop
  30.      a.Offset(, 4) = d1(a.Value)(i)
  31.      Else
  32.      a.Offset(, 4) = "NA"
  33.      End If
  34.      If a <> a.Offset(1) Then cnt = 0
  35.   Next
  36. End With
  37. End Sub
複製代碼

作者: adam2010    時間: 2013-1-13 22:17

Dear  Hsieh大,感謝您的回覆,測試無誤
目前測試您跟stillfish00所提供的均正確,我再研究看看兩者的差異,謝謝!




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