返回列表 上一主題 發帖

出貨單建立

本帖最後由 Andy2483 於 2022-10-7 16:21 編輯

回復 5# cclo0728


    謝謝前輩發表此主題與範例
後學提供另一種方法供前輩參考
今天習得陣列倒入字典與至字典中取出陣列
練習陣列語字典

'刪除結果表舊資料!再帶入新資料
Option Explicit
Sub test_A()
Dim Arr, T, xD, xA, xB
'↑宣告變數

Set xD = CreateObject("Scripting.Dictionary")
'↑令xD是字典

Set xA = Sheets("資料輸入")
'↑令xA是工作表 "資料輸入"

Set xB = Sheets("出貨資料")
'↑令xB是工作表"出貨資料"

T = xA.Cells(Rows.Count, 3).End(3).Row - 4
'↑令T是"資料輸入"表要帶入 "出貨資料"表的列數

Arr = xA.Cells(5, 2).Resize(T, 6)
'↑來源表資料倒入Arr陣列

xD(1) = Arr
'↑Arr陣列倒入字典

xD(2) = xA.Cells(2, 1)
'↑客戶名稱倒入字典

xD(3) = xA.Cells(2, 2)
'↑單號倒入字典

xB.UsedRange.Offset(1, 0).EntireRow.Delete
'↑舊資料刪除

xB.[C2].Resize(UBound(Arr), 6) = xD(1)
'↑帶出陣列放入結果表

xB.[A2].Resize(T, 1) = xD(2)
'↑帶出客戶名稱放入結果表

xB.[B2].Resize(T, 1) = xD(3)
'↑帶出單號放入結果表

End Sub

TOP

回復 9# cclo0728
前輩很有想法
後學請教前輩
1.出貨資料表是用來列印?列印完就刪除
2.還是累積到隔天才刪除?
3.或者是當天多次累積後列印?
4.還是其它情境?

5.資料輸入會一直累積資料?
6.還是資料輸入匯至出貨資料後就刪除?
7.還是累積資料給其他人員看而已

因為這些疑問會影響此樓的情境
例如:
資料輸入表只是純粹輸入介面表?還是資料庫?

TOP

本帖最後由 Andy2483 於 2022-10-8 16:13 編輯

回復 12# cclo0728


    謝謝前輩再回覆
範例請試試看
[B2].滑鼠快按兩下開始!就會有提示
今天習得資料庫建立
練習陣列與字典
test_1_20221008_3.zip (38.02 KB)

資料輸入:


出貨資料:


資料庫:

TOP

本帖最後由 Andy2483 於 2022-10-9 11:35 編輯

回復 12# cclo0728
建議前輩公用的資料庫獨立出來
1.可以設計個excel檔做為界面,各依各的使用者身份及密碼按鈕程序開起資料輸入檔或不必密碼只唯讀開啟資料庫來使用
1.1.開啟後界面即關閉
1.2.界面檔可以多人唯讀開啟且不能另存,即使把界面檔要複製到其它地方也不能使用,方便於管理,且程式可以邊上線使用邊修改程式碼
1.3.資料輸入檔與資料庫檔是獨立的,也都讓使用者按界面檔,按按鈕唯讀開啟,且都具備使用者使用中時,程式開發員修改程式碼的效果,方便更新程式版本
1.4.可以記錄誰使用了檔案存入新的出貨資料
........

Excel vb很好用!前輩很有想法!
後學經驗分享,僅供前輩參考!

TOP

回復 13# Andy2483


    謝謝前輩再回覆
後學把 搜尋資料庫決定單號複習並註解了一下!
後學也是藉由這一主題學到變數的宣告將字串與數字做變換
謝謝前輩發表此主題與範例
以下心得供前輩參考

Sub 搜尋資料庫決定單號()

'↓數字與字串可以由一開始的宣告就決定這變數是字串或數字!
Dim Arr, T, xA, xB, xC, N, Mx&, D1$, O1$, D2&, O2&, M1$, M2&
'↑宣告變數

Set xA = Sheets("資料輸入")
'↑令xA是 "資料輸入" 工作表

Set xB = Sheets("出貨資料")
'↑令xB是 "出貨資料" 工作表

Set xC = Sheets("資料庫")
'↑令xA是 "資料庫" 工作表

If xB.Cells(Rows.Count, "B").End(3).Row > 1 Then
'↑如果 "出貨資料" 最後一列列數大於1 !

   xB.Activate
   '↑畫面就跳到 "出貨資料" 工作表
   
   MsgBox "舊的出貨資料未處理!"
   Exit Sub
   '↑出現提示!結束程式!
   
End If
O1 = xA.[B2]: O2 = O1
'↑令O1這變數是 "資料輸入" 工作表.[B2] 字串
'↑令O2這變數是 O1變數轉整數


M1 = xC.Cells(Rows.Count, "B").End(3)
'↑令M1這變數是 "資料庫" 工作表.B欄最後那儲存格 字串

M2 = M1
'↑令M2這變數是 M1變數轉整數

D1 = Format(Date, "yymmdd")
'↑令D1是今天日期組成的字串例如22/10/11 轉成 "221011"

D2 = D1 & "001"
'↑令D2是 組成今日第一筆出貨單的序號(數字)

If InStr(M1, D1) Then
'↑如果M1字串有包含D1字串

   xA.[B2] = M2 + 1
   '↑條件若成立!代表 "資料庫" 工作表已經有今天的序號
   '↑M2是數字就+1 填到 "資料輸入" 工作表的.[B2]

   
   xA.[B2].Interior.ColorIndex = xlNone
   '↑令 "資料輸入" 工作表的.[B2]底色無色
   
   xA.[B2].Font.ColorIndex = 1
   '↑令 "資料輸入" 工作表的.[B2]字色是黑色
   
   Else
      xA.[B2] = D2
      '↑否則代表今天還沒有存入今天的出貨單
      '↑"資料輸入" 工作表的.[B2] 就讓他是今天的第一筆序號D2

      
      xA.[B2].Interior.ColorIndex = xlNone
      '↑令 "資料輸入" 工作表的.[B2]底色無色
      
      xA.[B2].Font.ColorIndex = 1
      '↑令 "資料輸入" 工作表的.[B2]字色是黑色
      
End If
End Sub

TOP

回復 15# cclo0728


    後學的範例邏輯如下
1.想要自動判斷[B2]序號的流水號!必須先將出貨資料表資料存到資料庫並清空出貨資料表資料
2.判讀資料庫最後一筆的序號才給予[B2]新的序號
3.如果按刪除出貨資料_帶入新資料鈕!不管出貨資料表是不是已清空!都會詢問是不是真的要刪除舊的出貨資料
4.出貨資料表可以再做編輯後才連同格式複製到資料庫!出貨資料表可以做這部分的緩衝!
5.資料存入資料庫後要記得存檔!當然前輩也可以讓資料移到資料庫就存檔!

以下是 存入資料庫 程式碼的心得供參考!

Sub 存入資料庫()
Dim Arr, T, xB, xC
Dim CH
'↑宣告變數

Set xB = Sheets("出貨資料").[A1].CurrentRegion.Offset(1, 0).EntireRow
'↑令xB是 "出貨資料" 工作表有使用的列範圍往下偏移1列的範圍
'就是不包含第一列的意思


Set xC = Sheets("資料庫")
'↑令xC是 "資料庫" 工作表

T = xC.Cells(Rows.Count, "B").End(3).Row + 1
'↑令T是 "資料庫" 工作表的第1 個空白列

xB.Copy xC.Cells(T, "A")
'↑將"出貨資料" 工作表的資料複製到"資料庫" 工作表的第1 個空白列

xB.Delete xlUp
'↑將"出貨資料" 工作表的資料刪除

MsgBox "記得要存檔!"
End Sub

TOP

回復 18# cclo0728
謝謝前輩回覆
後學現在不方便處理!
如果是只有新序號問題,前輩可再試著改看看!後學的範例有註解!
Samwang的範例跟您的需求更貼近,
如果您急著要用,可以以回覆的方式,請samwang前輩幫忙!

後學干擾了兩位前輩的研討!
向兩位道歉!sorry!

TOP

回復 9# cclo0728
這範例有幾個疑問
1.一家廠商一個檔案?還是所有的廠商混合在一起在一個檔案裡?
2.序號是分各廠商累加?還是所有的廠商混合在一起先出先累積序號?

最好是提供更貼近需求情境的範例!

TOP

回復 18# cclo0728


    前輩早安
範例請試試看
test_1_20221012_1.zip (31.36 KB)

開始情境:


[B2]左鍵快按兩下:


按 複製到出貨資料鈕 的出貨資料表結果


資料輸入表的結果:


Sub 搜尋出貨資料決定單號()

'↓數字與字串可以由一開始的宣告就決定這變數是字串或數字!
Dim Arr, T, xA, xB, N, Mx&, D1$, O1$, D2&, O2&, M1$, M2&
'↑宣告變數

Set xA = Sheets("資料輸入")
'↑令xA是 "資料輸入" 工作表

Set xB = Sheets("出貨資料")
'↑令xB是 "出貨資料" 工作表

M1 = xB.Cells(Rows.Count, "B").End(3)
'↑令M1這變數是 "資料庫" 工作表.B欄最後那儲存格 字串

M2 = M1
'↑令M2這變數是 M1變數轉整數

D1 = Format(Date, "yymmdd")
'↑令D1是今天日期組成的字串例如22/10/11 轉成 "221011"

D2 = D1 & "001"
'↑令D2是 組成今日第一筆出貨單的序號(數字)

If InStr(M1, D1) Then
'↑如果M1字串有包含D1字串

   xA.[B2] = M2 + 1
   '↑條件若成立!代表 "資料庫" 工作表已經有今天的序號
   '↑M2是數字就+1 填到 "資料輸入" 工作表的.[B2]

   
   xA.[B2].Interior.ColorIndex = xlNone
   '↑令 "資料輸入" 工作表的.[B2]底色無色
   
   xA.[B2].Font.ColorIndex = 1
   '↑令 "資料輸入" 工作表的.[B2]字色是黑色
   
   Else
      xA.[B2] = D2
      '↑否則代表今天還沒有存入今天的出貨單
      '↑"資料輸入" 工作表的.[B2] 就讓他是今天的第一筆序號D2

      
      xA.[B2].Interior.ColorIndex = xlNone
      '↑令 "資料輸入" 工作表的.[B2]底色無色
      
      xA.[B2].Font.ColorIndex = 1
      '↑令 "資料輸入" 工作表的.[B2]字色是黑色
      
End If
End Sub

TOP

回復 24# cclo0728


    謝謝前輩回覆
O1,O2是上一版本漏刪除的!不影響執行!

工作空檔練習陣列與字典!
以後可以大幅縮短程式執行時間!

謝謝前輩提出主題與範例,後學可以學到很多!
學生就是該勤勞練習!
猜老師會考什麼? 也很有趣!

題目或範例考得太簡單!也要複雜化!
以檢測自己的思考是否周全!

學十幾年了!熱情依舊!
後學臉皮厚!心得註解也不擔心前輩指正或提醒 !
不違反版規!就好了!
人生的貴人就在 發帖/參與/回復主題 裡

TOP

        靜思自在 : 人生沒有所有權,只有生命的使用權。
返回列表 上一主題