返回列表 上一主題 發帖

[發問] 使用VBA跨檔案抓取多個工作表裡的資料

[發問] 使用VBA跨檔案抓取多個工作表裡的資料

本帖最後由 ABK 於 2018-9-2 18:16 編輯

請教各位大大:

我要在第一個Excel的工作表上 抓取第二個Excel檔案裡多個不同工作表裡面的資料,
第一個檔"三廠生產日報" 放在C:/Users/Golden/Desktop/
第二個檔"三廠各機生產紀錄" 放在D:/生產日報/

生產代碼是唯一的,不會重複。
想用VBA讓第一個檔"三廠生產日報"以 生產代碼 搜尋 第二個檔"三廠各機生產紀錄" A1、A2、A3、B1、B2、C1、C2 工作表裡相同生產代碼的 投產數量 紀錄到第一個檔"三廠生產日報"裡。
跨檔抓資料紀錄.jpg

生產日報-跨檔抓資料.rar (25.77 KB)

回復 2# faye59


    謝謝faye59大!
  我研究一下您提供的方法!

TOP

本帖最後由 ABK 於 2018-9-3 21:52 編輯

回復 3# n7822123

謝謝 n7822123大
我把檔案分開壓縮試試看 !
我是在產線工作,產線產出後各機台共用一張Excel表,由各機台負責人Key入產出資料, 主管要看的是部分的匯總資料。

三廠生產日報.rar (8.78 KB)

三廠各機生產紀錄.rar (17.05 KB)

TOP

本帖最後由 ABK 於 2018-9-4 02:27 編輯

回復 7# n7822123


    感謝阿龍大的熱心回復!  讓你費這麼多時間 !  真是抱歉!
    我來拜讀研究一下 !   感謝!  感謝!

TOP

回復 8# ABK


再請教一下各位前輩!
當我使用阿龍大的範例抓取資料時, Excel 會要求我關閉被抓取資料那個檔才能抓取資料,
有辦法做到不關閉資料檔也可以抓取資料嗎?
資料檔案開啟中-請關閉.jpg

TOP

回復 10# 准提部林

謝謝准提大

這兩個檔案實際使用情形是:
1. 資料檔(生產紀錄) 和 要抓資料的檔(生產日報)是存放在同一個資料夾裡並開放共用。
2. 資料檔是產線一直開著, 一但有產出就由產線即時輸入產出資料,其他電腦只能用唯讀模式開啟   這個檔案。
3. 抓資料的檔是主管在另外一台電腦開啟使用的。


我將准提大的碼 置入阿龍大程式碼的這個位置,
如果資料檔和抓資料的檔在同一台電腦同時開著,可以抓取資料且資料檔不會關閉。
但若是 資料檔是關閉時, 執行抓資料程式就會出現錯誤訊息。


可否:
1.當資料檔無任何人開啟時, 讓主管只開啟抓資料的檔  執行抓資料程式時,資料檔會自行開啟並執行抓取資料,完成後資料檔不會自行關閉 (由主管自行手動關閉)

2.當有其他台電腦在使用資料檔時, 主管只開啟抓資料的檔  執行抓資料程式時,資料檔是以唯讀模式開啟後抓取資料,資料抓取完成後資料檔(唯讀模式)不會自行關閉 (由主管自行手動關閉)


以下是准提大的程式碼置入阿龍大的程式碼:
  1. Sub 查詢投產數量()

  2. '宣告變數
  3. Dim 檔名$, 路徑檔名$, tt$, R&

  4. Application.ScreenUpdating = False '螢幕即時更新關閉

  5. Set Dy = CreateObject("scripting.dictionary")  '設Dy為字典物件
  6. Path = ThisWorkbook.Path  '抓取本檔案路徑

  7. '命名此工作表為 "要填的表"
  8. Set 要填的表 = ThisWorkbook.Sheets("2018三廠機台生產追蹤")

  9. '如果[G5]有資料就依[G5]路徑的檔案,如果沒到就找同路徑下的另一個excel檔
  10. If [G5] <> "" Then
  11.   路徑檔名 = [G5]
  12.   檔名 = Right(路徑檔名, Len(路徑檔名) - InStrRev(路徑檔名, "\"))
  13.   If Dir(路徑檔名) = "" Then MsgBox "依[G5]輸入的路徑與檔名找不到檔案,請檢查有無錯誤": Exit Sub
  14. Else
  15.   檔名 = Dir(Path & "\*.xls*")
  16.   If 檔名 = ThisWorkbook.Name Then 檔名 = Dir
  17.   路徑檔名 = Path & "\" & 檔名
  18. End If
  19.   
  20. '檢查資料檔案是否已開啟
  21. For Each wb In Workbooks
  22.   'If wb.Name = 檔名 Then MsgBox "資料檔案開啟中,請關閉": Exit Sub
  23.   
  24.   
  25. '檢查資料檔案是否已開啟, 若未開啟則以[唯讀]開啟, 並以uChk標示為1
  26. On Error Resume Next
  27. uChk = 0: Set 資料檔 = Workbooks(檔名)
  28. On Error GoTo 0
  29. If 資料檔 Is Nothing Then uChk = 1: Set 資料檔 = Workbooks.Open(路徑檔名, ReadOnly:=True)
  30. '關閉檔案_不存檔 (若資料檔不是程式所開啟, 則不關閉)
  31. If uChk = 1 Then 資料檔.Close 0

  32. Next

  33. '打開資料檔案,並且命名為"資料檔"
  34. Set 資料檔 = Workbooks.Open(路徑檔名)

  35. '逐一把工作表的生產代碼與頭產數量輸入到字典物件Dy裡面
  36. For Each ws In 資料檔.Sheets
  37.   ws.Activate
  38.   If ws.[D1] <> "投產數量" Then GoTo 跳過 '檢查是否為要的工作表
  39.   For R = 2 To ws.[A1].End(xlDown).Row
  40.     tt = Cells(R, 3): Dy(tt) = Cells(R, 4)
  41.   Next R
  42. 跳過:
  43. Next

  44. '啟用要填的表
  45. 要填的表.Activate

  46. '逐一把字典物件Dy裡面的值輸入到此工作表(要填的表)
  47. For R = 2 To [A1].End(xlDown).Row
  48.   tt = Cells(R, 4)
  49.   Cells(R, 5) = Dy(tt)
  50. Next R

  51. '不跳出確認訊息
  52. Application.DisplayAlerts = False

  53. '存檔關閉+釋放記憶體
  54. '資料檔.Close True: Set 資料檔 = Nothing
  55. 'Set Dy = Nothing

  56. '螢幕即時更新打開
  57. Application.ScreenUpdating = True
  58. End Sub
複製代碼
未開啟資料檔 直接執行抓取資料的錯誤訊息.jpg

TOP

回復 14# 准提部林

謝謝准堤大

1. 廠別/機台/日期/生產代碼 都是事先輸入
2. 只依據生產代碼 抓投產數量
3. 上次抓檔資料要清除 (產線有可能修正Key錯的資料,重新抓一次比較保險)

※ 生產代碼是唯一的, 不會重複。
生產代碼是唯一的.jpg

三廠生產日報.rar (13.98 KB)

三廠生產記錄.rar (20.62 KB)

TOP

回復 16# 准提部林


    謝謝准堤大 !
   我來好好研究一下!   感恩!  感恩!

TOP

        靜思自在 : 改變自己是自救,影響別人是救人。
返回列表 上一主題