返回列表 上一主題 發帖

符合多重條件下的自動統計數量及生產區間填入指定的欄位???

本帖最後由 luhpro 於 2014-9-21 20:17 編輯
如附檔有一生產計劃表及另一份生產日報表
現工作是採手動比對耗時,請問各先進可否以VBA巨集以製令及序號 ...
p6703 發表於 2014-9-21 16:55

有些地方資料不相符:

上面講 : 以製令及序號去比對生產日報表

1.兩個工作表中的 製令編號 完全不相符,無法比對:
日報表是 MA14070125 與 MA14070126
計劃表是 MA14090050, MA14090051 與 MA14090052

2. 料號與序號也不相符,無法比對:
日報表中 B 料序號是 01 與 03
計劃表中 B 料序號則是 05
日報表中 CC 料序號是 03
計劃表中 CC 料序號則是 06

其次, 兩表格涵蓋的日期區間也不相符 -
日報表日期區間是 9/1 ~ 9/2
但計劃表的 下單日 與 預期開工日 卻都是 9/12 以後
顯見兩者間的資料並不應有交集出現.

要做出你想要的結果並不難,
只是若你提供的資料能依據你題的各個條件,
模擬做出每個條件應該產生的結果出來,
這樣他人較容易理解並構想程式出來.

比較理想的方式是將過去已完成的報表,
擷取出特定原始資料,
及將這些資料依照條件產生的結果都列出來.

當然,要留意其中是否有敏感資料,
在不影響條件實現的前提下,
可以適度將其遮罩或以其他文數字取代.

TOP

本帖最後由 luhpro 於 2014-9-23 23:57 編輯
將實際資料附檔,請luhpro兄及各先進協助了,先道謝了^^..
p6703 發表於 2014-9-23 22:27

首貼中敘述的標的欄位與你提供檔案中欄位可能有衝突(會蓋到已有資料的區域),
不過我還是以你首貼中敘述的欄位為資料標的 :
  1. Private Sub Workbook_Open()
  2.   Dim lRow&
  3.   Dim sStr$
  4.   Dim bNFind As Boolean
  5.   Dim vCount, vBDate, vEDate
  6.   Dim wbSou As Workbook, wbTar As Workbook
  7.   
  8.   Set wbTar = ThisWorkbook
  9.   Set vBDate = CreateObject("Scripting.Dictionary")
  10.   Set vEDate = CreateObject("Scripting.Dictionary")
  11.       
  12.   bNFind = True
  13.   For Each vCount In Workbooks
  14.     If vCount.Name = "生產日報表.xls" Then
  15.       bNFind = False
  16.       Exit For
  17.     End If
  18.   Next
  19.   
  20.   If bNFind Then
  21.     Set wbSou = Workbooks.Open(wbTar.Path & "\" & "生產日報表.xls")
  22.   Else
  23.     Set wbSou = vCount
  24.   End If
  25.   
  26.   lRow = 2
  27.   Set vCount = Nothing
  28.   Set vCount = CreateObject("Scripting.Dictionary")
  29.   With wbSou.Sheets(1)
  30.     Do While .Cells(lRow, 1) <> ""
  31.       With .Cells(lRow, 1)
  32.         sStr = .Offset(, 4) & "_" & .Offset(, 5)
  33.         If Left(.Offset(, 9), 2) = "AS" Or .Offset(, 9) = "" Then
  34.           vCount(sStr) = vCount(sStr) + .Offset(, 8)
  35.          
  36.           If vBDate(sStr) = "" Then
  37.             vBDate(sStr) = .Value
  38.           ElseIf vBDate(sStr) > .Value Then
  39.             vBDate(sStr) = .Value
  40.           End If
  41.          
  42.           If vEDate(sStr) < .Value Then vEDate(sStr) = .Value
  43.         End If
  44.       End With
  45.       lRow = lRow + 1
  46.     Loop
  47.   End With
  48.   
  49.   lRow = 2
  50.   With wbTar.Sheets(1)
  51.     .Range(.Cells(2, 14), .Cells(Rows.Count, 17)).Clear
  52.     Do While .Cells(lRow, 1) <> ""
  53.       With .Cells(lRow, 1)
  54.         sStr = .Offset(, 2) & "_" & .Offset(, 3)
  55.         .Offset(, 16) = vCount(sStr)
  56.         If .Offset(, 16) >= .Offset(, 5) Then
  57.           .Offset(, 13) = vBDate(sStr)
  58.           .Offset(, 14) = vEDate(sStr)
  59.           .Offset(, 15) = "已發料"
  60.         Else
  61.           .Offset(, 13) = vBDate(sStr)
  62.           .Offset(, 15) = "生產中"
  63.         End If
  64.         Range(.Offset(, 13), .Offset(, 14)).NumberFormat = "yyyy/m/d;@"
  65.       End With
  66.       lRow = lRow + 1
  67.     Loop
  68.   End With
  69. End Sub
複製代碼
生產計劃表-a.zip (23.15 KB)

日報表不動, 程式放在 計劃表,
其實我認為最好的方式是放在另一個檔案上,
而該檔案則做成只顯示 UserForm 畫面加按鍵等物件,
與那兩個檔案完全不相關,
甚至可以考慮存成 增益集 檔案來運作.

TOP

本帖最後由 luhpro 於 2014-9-26 00:32 編輯
感謝luhpro兄的即時的回覆,針對一些細節事項再補充說明:
1.原附件是捉取已完工的明細(該計劃表其實是 ...
p6703 發表於 2014-9-24 22:34

1. 程式基本上就是這樣設計的,差別只在未生產的是秀 "生產中"  而非空白.
(此時也不會秀生產起迄日期, 修改後執行結果如附圖<把 "生產中"拿掉>)

2. 程式遇到第一筆資料時,就會先產生相同的起迄日期,
之後再依遇到的資料擴增起迄日期,
所以 "已發料" 的製令應該不會有你所說的只有單邊日期的情形.



3.已修改如附件, 在畫面上方功能表最右邊 "說明" 的旁邊新建立一個按鈕,
按鈕.png
任何時間按一次會更新資料一次,
考慮日報表可能不定時更新,
故讀取日報表檔案改採唯讀模式,
資料更新完就會關閉日報表檔案節省系統資源,
關閉檔案時按鈕也會跟著移除,
運作上應該會較順利.

4. 已實現.

生產計劃表-a2.zip (30.34 KB)
[Module1]
  1. Sub GetData()
  2.   Dim lRow&, lTRow&
  3.   Dim sStr1$, sStr2$
  4.   Dim bNFind As Boolean
  5.   Dim vCount, vBDate, vEDate, vNo
  6.   Dim wbSou As Workbook, wbTar As Workbook
  7.   Dim ShTar As Sheet2
  8.   
  9.   Set wbTar = ThisWorkbook
  10.   Set ShTar = Sheets(2)
  11.   Set vBDate = CreateObject("Scripting.Dictionary")
  12.   Set vEDate = CreateObject("Scripting.Dictionary")
  13.       
  14.   bNFind = True
  15.   For Each vCount In Workbooks
  16.     If vCount.Name = "生產日報表.xls" Then
  17.       bNFind = False
  18.       Exit For
  19.     End If
  20.   Next
  21.   
  22.   If bNFind Then
  23.     Set wbSou = Workbooks.Open(wbTar.Path & "\" & "生產日報表.xls", ReadOnly:=True)
  24.   Else
  25.     Set wbSou = vCount
  26.   End If
  27.   
  28.   lRow = 2
  29.   Set vCount = Nothing
  30.   Set vCount = CreateObject("Scripting.Dictionary")
  31.   With wbSou.Sheets(1)
  32.     Do While .Cells(lRow, 1) <> ""
  33.       With .Cells(lRow, 1)
  34.         sStr1 = .Offset(, 4) & "_" & .Offset(, 5)
  35.         If Left(.Offset(, 9), 2) = "AS" Or .Offset(, 9) = "" Then
  36.           vCount(sStr1) = vCount(sStr1) + .Offset(, 8)
  37.          
  38.           If vBDate(sStr1) = "" Then
  39.             vBDate(sStr1) = .Value
  40.           ElseIf vBDate(sStr1) > .Value Then
  41.             vBDate(sStr1) = .Value
  42.           End If
  43.          
  44.           If vEDate(sStr1) < .Value Then vEDate(sStr1) = .Value
  45.         End If
  46.       End With
  47.       lRow = lRow + 1
  48.     Loop
  49.   End With
複製代碼
[ThisWorkBook]
  1. Private Sub Workbook_BeforeClose(Cancel As Boolean)
  2.   Dim vC
  3.   
  4.   For Each vC In Application.CommandBars(1).Controls
  5.     If vC.Caption = "讀取資料" Then vC.Delete
  6.   Next
  7. End Sub

  8. Private Sub Workbook_Open()
  9.   Dim bNFind As Boolean
  10.   Dim tcbLdData As Object
  11.   Dim vC
  12.   
  13.   GetData
  14.   bNFind = True
  15.   For Each vC In Application.CommandBars(1).Controls
  16.     With vC
  17.       If .Caption = "讀取資料" Then
  18.         bNFind = False
  19.         .Visible = True
  20.       End If
  21.     End With
  22.   Next

  23.   If bNFind Then
  24.     Set tcbLdData = Application.CommandBars(1).Controls.Add(Type:=msoControlButton)
  25.     With tcbLdData
  26.       .Caption = "讀取資料" '按鈕的名稱
  27.       .FaceId = 2778 '按鈕的圖示
  28.       .OnAction = "GetData" '按鈕的巨集名稱
  29.     End With
  30.   End If
  31. End Sub
複製代碼

TOP

本帖最後由 luhpro 於 2014-10-1 23:30 編輯
luhpro兄以實際的表格操作時發現幾點問題,再次請教,先在此感謝^^
1.原附件是捉取大多已生產完畢的製令 ...
p6703 發表於 2014-9-27 23:41

1. 已完成
2. 我改把程式獨立出來並存成增益集, 而不是放在兩種檔案內,這樣比較好運作.
3. 已完成
4. 有些複雜,可否提供多一些的模擬數據資料與推演過程說明?
5. 已完成

另,
我有針對不同發料情形,
做一些底色的區分,
以方便使用者辨識.
生產資料表彙整.zip (16.37 KB)

增益集執行後會秀出操作視窗,
點擊 "彙整資料" 按鈕準備讀取與更新資料,
先選 "日報表", 再選 "計劃表",
它會自動依據日報表資料來更新計劃表內容,

TOP

        靜思自在 : 生氣,就是拿別人的過錯來懲罰自己。
返回列表 上一主題