- 帖子
- 835
- 主題
- 6
- 精華
- 0
- 積分
- 915
- 點名
- 0
- 作業系統
- Win 10,7
- 軟體版本
- 2019,2013,2003
- 閱讀權限
- 50
- 性別
- 男
- 註冊時間
- 2010-5-3
- 最後登錄
- 2024-11-14
|
2#
發表於 2019-3-2 07:25
| 只看該作者
本帖最後由 luhpro 於 2019-3-2 07:29 編輯
有些要找老師和高手幫忙, 萬分感激.
我平時會在sheets"checking"的A2用 scaner掃瞄文件上的bar code號 ...
john2006168 發表於 2019-3-1 09:45 
抱歉,不是看得很懂你的意思,只能以自己的理解來實作了.
在此假設你是要在輸入Barcode時,
自動在Data中以SHIPMENT REF欄位為鍵值,
找到相關資料帶入shipment record內,
那麼程式可以這樣寫 :(底下===中是程式所放的地方)
首先,將Data的資料建立索引以方便之後抓取,
這裡有個Dictionary函數滿好用的,
它可以直接建立相關索引.
另外,為了方便後續取用,
也將定義三個工作表.
因為都要在不同的Sheet中也能使用,
所以要在模組中使用Public來定義
===Module1===- Public dShi
- Public shDat As Worksheet, shChk As Worksheet, shShr As Worksheet
複製代碼 其次,要在程式一執行就先將Data的資料建立索引以方便之後抓取,
所以要放在 Workbook_Open 裡.
===ThisWorkBook 的 Workbook_Open===- Dim lRow&, lRows&
-
- Set shDat = Sheets("Data")
- Set shChk = Sheets("Checking")
- Set shShr = Sheets("shipment record")
-
- Set dShi = CreateObject("Scripting.Dictionary")
-
- With shDat
- lRows = .Cells(Rows.Count, 1).End(xlUp).Row
- For lRow = 2 To lRows
- dShi(CStr(.Cells(lRow, 8))) = lRow
- Next
- End With
複製代碼 (題外話)這裡忍不住又要再講一次,
建立 Dictionary 的函數範例中,
Scripting.Dictionary 從一開始就忘了加雙引號,
一直到現在仍然還是沒加...囧
剛開始學習時我在這裡挫折過,
沒想到換這麼多版本了還是沒變,
看來微軟是打算錯到底了.
接著,如果Data有新增資料也要即時加入Dictionary裡以方便後續使用.
===Data 的 Worksheet_Change===- With Target
- If .Column = 8 Then
- dShi(.Text) = .Row
- ' 如果清掉 SHIPMENT REF 要刪除整列資料
- Application.EnableEvents = False ' 變更資料中,關閉觸發Change程序
- If .Text = "" Then Rows(.Row).Delete
- Application.EnableEvents = True ' 資料變更完畢,恢復可觸發Change程序
- End If
- End With
複製代碼 再來,要記錄Checking資料最末列,
以便後續添加資料.
===Module1======ThisWorkBook 的 Workbook_Open===- lShrRow = shShr.Cells(Rows.Count, 1).End(xlUp).Row
複製代碼 前置作業完畢,接著就是重頭戲了.
===Checking 的 Worksheet_Change===- Dim rTar As Range ' 填資料標的儲存格A欄
-
- With Target
- If .Address = "$A$2" Then
- lRow = dShi(.Text)
- Application.EnableEvents = False ' 變更資料中,關閉觸發Change程序
- .Offset(, 1) = shDat.Cells(lRow, 1) ' B2
- .Offset(, 2) = shDat.Cells(lRow, 6) ' C2
- ' 其餘請自行調整填入
-
- lShrRow = lShrRow + 1
- Set rTar = shShr.Cells(lShrRow, 1) ' [A末筆欄數]
- With rTar
- .Offset(-1).Resize(, Columns.Count - 1).Copy ' 複製上一行的儲存格
- .PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone ' 貼上格式
- .Value = Date ' 今天日期-A欄
- End With
- rTar.Offset(, 19) = .Offset(, 0) 'T欄
- rTar.Offset(, 17) = .Offset(, 1) 'R欄
- rTar.Offset(, 14) = .Offset(, 2) 'O欄
- ' 其餘請自行調整填入
-
- .Resize(, Columns.Count - 1).Clear ' 清掉輸入區整行資料等待輸入下一筆
- Application.EnableEvents = True ' 資料變更完畢,恢復可觸發Change程序
- End If
- End With
複製代碼 當然還有改善的空間,
那就要靠你自己努力了.
test abc recv - ANS.zip (58.82 KB)
|
|