返回列表 上一主題 發帖

依未結PO及要出貨數量,自動換算要出貨的PO及數量

本帖最後由 luhpro 於 2012-10-2 21:19 編輯
回復  luhpro
Private Sub Worksheet_Change 是這 "未結PO" 工作表的觸動事件
GBKEE 發表於 2012-10-2 10:16

嗯...
我這樣寫是依據我之前有過不好的經驗而調整過來的,
此前有遇到使用者反應作業中會亂跳錯誤訊息.

後來經過測試才發現若一 Excel 檔案正在運作 VBA 程式(即並非正在等待使用者的操作),
而使用者又因有其他需求開啟或切換到另一個 Excel 程式(或是使用者想趁程式運作中的等待時間, 切換到另一個 Sheet 檢視資料)時,
像上述那樣不指定要作用的物件的情形,
有機率會發生索引(即所作用的物件並非程式設計時所預期的那個)錯誤的狀況.

我覺得這似乎是因為 Windows 多工而 Excel VBA 又可以作用在不同的檔案或 Sheet 間所導致的問題,
所以後來我都會用 With 指定作用物件於其內再以 . 來索引,
以避免類似困擾的發生.

這是我的理解,也許不一定對,
但是那時這樣做過後該問題就不再發生了.
PS: 當時的環境是 Windows XP + Office 2000 Professional

TOP

luhpro兄,小弟實際測試,除了感謝費時的修改,發現新輸入"未結PO"的資料無法再於"出貨數量"中秀出

例:小弟新增了35453 500,000,然後於出貨數中將原PO數都核消完後,就無法再產生新PO出貨明細了,請問是否小弟輸入方式有誤,再煩請協助看看,謝謝

另於 "輸入區" 中無資料區域的輸入方式與一般 Excel 輸入方式相同,
每輸完一筆資料就會直接做出貨配比,==>當下未交數是會自動秀出KEY IN的數量

TOP

本帖最後由 luhpro 於 2012-10-3 22:57 編輯
luhpro兄,小弟實際測試,除了感謝費時的修改,發現新輸入"未結PO"的資料無法再於"出貨數量"中秀出
例: 於出貨數中將原PO數都核消完後,就無法再產生新PO出貨明細了
p6703 發表於 2012-10-3 10:27

這是因為在 Sheets("未結PO") 有異動時 並沒有做適當的處理:
1. 將客戶料號加入 UserForm 裡客戶料號的下拉式選單中,以備後續作業中可以正常選擇到該料號.
2. 將使用者輸入的 "期初未交數" 代入至 "當下未交數" 內,
因為儲存格沒有輸入資料時其值為 0 ,
故而 "當下未交數" 是 0 的新增項目,
自然就無法正常參與出貨序列了.

修改後程式如下:
自動核消表-Ans3.zip (33.34 KB)

每輸完一筆資料就會直接做出貨配比,==>當下未交數是會自動秀出KEY IN的數量

不懂, 是程式的反應有問題嗎?

TOP

luhpro兄依提供的自動核消表-Ans3中在未結PO第34列直接增加一筆35451 500,000(此原未結已為0),然後再於出貨數量A~C欄位輸入日期及數量,但依舊跳出 "輸入的出貨數未能全部分配完成,出貨數由500000調降為0),請問是小弟操作順序有誤嗎???

TOP

luhpro兄依提供的自動核消表-Ans3中在未結PO第34列直接增加一筆35451 500,000(此原未結已為0),然後再於出 ...
p6703 發表於 2012-10-4 12:09

修正一行內容 :

      Do Until .Cells(Target.Row, 2) = rStuff And rStuff.Offset(, 3) <> 0  ' 找到該客戶

自動核消表-Ans4.zip (33.55 KB)

TOP

回復 15# luhpro

    我是路人~~~~~
    我試著重新把已輸入的刪除
    測試的結果如下圖.......大家看圖囉
test.gif
50 字節以內
不支持自定義 Discuz! 代碼

TOP

本帖最後由 luhpro 於 2012-10-8 22:47 編輯
回復  luhpro
    我是路人~~~~~
    我試著重新把已輸入的刪除
    測試的結果如下圖.......大家看圖 ...
softsadwind 發表於 2012-10-6 17:07

修改程式如下:
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2.   Dim lRow As Long
  3.   Dim rStuff As Range, rTemp As Range
  4.   Dim bChecked As Boolean
  5.   Dim vPo, vBalance
  6.   
  7.   With Target.Parent '於 Sheets("出貨數量")
  8.     Set vPo = Sheets("未結PO")
  9.     Set rTemp = .Cells(Target.Row, 3)
  10.   
  11.     If .Cells(Target.Row, 2) <> "" And rTemp <> "" And Target.Column < 4 Then
  12.       lRow = .Cells(Rows.Count, 5).End(xlUp).Row + 1
  13.       vBalance = rTemp
  14.       Set rStuff = vPo.[A2] ' 於 Sheets("未結PO")
  15.       
  16.       'Do Until .Cells(Target.Row, 2) = rStuff And rStuff.Offset(, 3) <> 0  ' 找到該客戶
  17.       '  Set rStuff = rStuff.Offset(1) ' 移到下一筆資料
  18.       'Loop
  19.       
  20.       Do ' Loop Until rStuff = ""
  21.         Do Until (.Cells(Target.Row, 2) = rStuff And rStuff.Offset(, 3) <> 0) Or rStuff = ""  ' 找到該客戶或已沒資料
  22.           Set rStuff = rStuff.Offset(1) ' 移到下一筆資料
  23.         Loop
  24.         
  25.         Do While rStuff.Offset(, 3) <> 0    ' 還有尚未出貨的資料
  26.           If vBalance > rStuff.Offset(, 3) Then ' 尚未出貨數量大於當下未交數
  27.             Application.EnableEvents = False
  28.               With .Cells(lRow, 5)
  29.                 .NumberFormat = "yyyy/m/d"
  30.                 .Value = .Parent.Cells(Target.Row, 1) ' 日期
  31.               End With
  32.               .Cells(lRow, 6) = .Cells(Target.Row, 2) ' 客戶料號
  33.               .Cells(lRow, 7) = rStuff.Offset(, 1) ' 客戶PO
  34.               With .Cells(lRow, 8)
  35.                 .NumberFormat = "#,##0_ "
  36.                 .Value = rStuff.Offset(, 3) ' 出貨數
  37.               End With
  38.               vBalance = vBalance - rStuff.Offset(, 3)
  39.               rStuff.Offset(, 3) = 0
  40.               lRow = lRow + 1
  41.             Application.EnableEvents = True
  42.           Else
  43.             Application.EnableEvents = False
  44.               With .Cells(lRow, 5)
  45.                 .NumberFormat = "yyyy/m/d"
  46.                 .Value = .Parent.Cells(Target.Row, 1) ' 日期
  47.               End With
  48.               .Cells(lRow, 6) = .Cells(Target.Row, 2) ' 客戶料號
  49.               .Cells(lRow, 7) = rStuff.Offset(, 1) ' 客戶PO
  50.               With .Cells(lRow, 8)
  51.                 .NumberFormat = "#,##0_ "
  52.                 .Value = vBalance ' 出貨數
  53.               End With
  54.               rStuff.Offset(, 3) = rStuff.Offset(, 3) - vBalance
  55.             Application.EnableEvents = True
  56.             Exit Sub ' 尚未出貨數量等於0則跳出
  57.           End If
  58.         Loop ' While rStuff.Offset(, 3) <> 0
  59.       Loop Until rStuff = "" ' 直到最後一筆資料
  60.         If vBalance > 0 Then ' 輸入的出貨數未能全部分配完成
  61.   Application.EnableEvents = False ' 禁能會被觸發的動
  62.           vTemp = "輸入的出貨數未能全部分配完成, 出貨數由 " & rTemp & "調降至 "
  63.           rTemp = rTemp - vBalance
  64.           MsgBox vTemp & rTemp
  65.   Application.EnableEvents = True ' 致能(恢復)會被觸發的動作
  66.         End If
  67.     End If
  68.   End With
  69. End Sub
複製代碼
自動核消表-Ans5.zip (34.14 KB)
當初會加那一段也是考慮到若使用者不小心輸入過多的出貨量,
會造成無法還原回未輸入前的狀態,
結果因考慮不週迴圈條件未跟著調整,
反而衍申出其他的錯誤出現,
謝謝你的指正.

TOP

回復 17# luhpro


    我這幾天很努力的看你寫的程式
    但是還是頭暈暈 跟不上.......
    感謝你願意更新...讓我有學習的機會
50 字節以內
不支持自定義 Discuz! 代碼

TOP

感謝luhpro 兄多次修改,小弟現使用上暫無問題,在此再次誠心感謝,真的幫了小弟的大忙^^

TOP

        靜思自在 : 每天無所事事,是人生的消費者,積極、有用才是人生的創造者。
返回列表 上一主題