Copy dữ liệu có chọn lọc từ nhiều file vào 1 file

Liên hệ QC

hanguyen0472

Thành viên mới
Tham gia
30/11/09
Bài viết
39
Được thích
3
Xin chào các bác, chẳng là vừa rồi mình được sếp giao cho vài chục file và yêu cầu copy dữ liệu từ mấy chục cái file này vào 1 file duy nhất. Mà mấy chục cái file này có cấu trúc không được thuận lợi nên mình lên đây nhờ các bác xem có thể code để có thể click 1 cái thì nó tự chạy với ạ. Mình gửi lên 2 file gốc và 1 file Ketqua để làm mẫu. Xin các bác cao thủ có cao kiến giúp với ạ. Cám ơn các bác trước.
 

File đính kèm

  • BID.xlsx
    20.4 KB · Đọc: 23
  • Ketqua.xlsx
    20.3 KB · Đọc: 21
  • VNM.xlsx
    19.7 KB · Đọc: 17
Xin chào các bác, chẳng là vừa rồi mình được sếp giao cho vài chục file và yêu cầu copy dữ liệu từ mấy chục cái file này vào 1 file duy nhất. Mà mấy chục cái file này có cấu trúc không được thuận lợi nên mình lên đây nhờ các bác xem có thể code để có thể click 1 cái thì nó tự chạy với ạ. Mình gửi lên 2 file gốc và 1 file Ketqua để làm mẫu. Xin các bác cao thủ có cao kiến giúp với ạ. Cám ơn các bác trước.
Bạn có thể cho biết thêm về sự khác nhau giữa vài chục file đó và kết quả mong muốn là như thế nào không?
 
Bạn có thể cho biết thêm về sự khác nhau giữa vài chục file đó và kết quả mong muốn là như thế nào không?
Mấy cái file gốc đó nó khác nhau về số cột bạn ạ. Có file sẽ có số liệu từ 2010 đến nay (tức là 11 cột dữ liệu), có file thì dữ liệu từ 2012, hoặc thậm chí 2015, do dó số lượng cột dữ liệu sẽ ít hơn. trong 2 file gốc mình gửi cũng có sự khác nhau như vậy.
 
Mấy cái file gốc đó nó khác nhau về số cột bạn ạ. Có file sẽ có số liệu từ 2010 đến nay (tức là 11 cột dữ liệu), có file thì dữ liệu từ 2012, hoặc thậm chí 2015, do dó số lượng cột dữ liệu sẽ ít hơn. trong 2 file gốc mình gửi cũng có sự khác nhau như vậy.
Bạn nén lại và gửi các file đó lên xem thế nào. (Vui lòng không dùng từ cao thủ hoặc các từ khác tương tự và đừng đưa sếp siếc vào để trình bày. Tại diễn đàn này, các thành viên giúp nhau chứ không giúp sếp nào bạn nhé).
 
Lần chỉnh sửa cuối:
Sorry bạn nhé, bị trước đây mình có đọc sách của thầy Ông Văn Thông nên bị ảnh hưởng cách dùng văn của thầy Thông khi xưng hô. Mình up lên các file gốc bạn xem thử nhé. Cám ơn bạn và mọi người trước.
 

File đính kèm

  • datas.zip
    163.6 KB · Đọc: 14
Sorry bạn nhé, bị trước đây mình có đọc sách của thầy Ông Văn Thông nên bị ảnh hưởng cách dùng văn của thầy Thông khi xưng hô. Mình up lên các file gốc bạn xem thử nhé. Cám ơn bạn và mọi người trước.
Không có gì, nếu từ nào tiếng Việt có thì không nên dùng tiếng nước khác bạn nhé. (Sorry, up, ...)
 
Copy mấy chục files ấy vào một file. Mỗi file copy vào 2 sheets.
Đồng bộ các bảng từ 2010 đến 2020. Bảng nào thiếu thì thêm cột vào cho đủ.
Chèn thêm cột A, ghi tên công ty/doanh nghiệp.
Copy qua bảng chính.
Hết.

Cái này mỗi sheet tôi làm trong vòng 1 phút (*). Một file có 2 sheets tức là 2 phút. Vài chục files tôi làm khoảng xấp xỉ 2 tiếng đồng hồ.

Muốn code VBA thì cũng có thể theo trình tự trên. Nhưng đợi code và test code thì tôi đã làm gần xong rồi.

(*) máy tôi dùng 2 màn hình cho nên ba cái vụ copy này hiệu suất rất cao.
Công ty tài chính mà làm việc không có màn hình đôi là dỏm, hà tiện không đúng chỗ.
 
Copy mấy chục files ấy vào một file. Mỗi file copy vào 2 sheets.
Đồng bộ các bảng từ 2010 đến 2020. Bảng nào thiếu thì thêm cột vào cho đủ.
Chèn thêm cột A, ghi tên công ty/doanh nghiệp.
Copy qua bảng chính.
Hết.

Cái này mỗi sheet tôi làm trong vòng 1 phút (*). Một file có 2 sheets tức là 2 phút. Vài chục files tôi làm khoảng xấp xỉ 2 tiếng đồng hồ.

Muốn code VBA thì cũng có thể theo trình tự trên. Nhưng đợi code và test code thì tôi đã làm gần xong rồi.

(*) máy tôi dùng 2 màn hình cho nên ba cái vụ copy này hiệu suất rất cao.
Công ty tài chính mà làm việc không có màn hình đôi là dỏm, hà tiện không đúng chỗ.
Cám ơn bạn nhé, để mình xin duyệt thêm tiền trang bị máy có 2 màn hình.
 
Các file của bạn có file thì 1 sheet, có file 2 sheet. Vậy file 1 sheet vẫn copy hay bỏ qua bạn nhỉ?
Bạn ơi, vì cái file ketqua nó có 2 sheet nên những sheet "Chỉ_số_tài_chính_xxxx" sẽ copy chung với nhau, tương tự như vậy cho các sheet "Lưu_chuyển_tiền_tệ_xxxx". Vì vậy những file nào có 1 sheet thì vẫn copy vào sheet cùng tên trong file ketqua. Cám ơn bạn nhé.
 
Bạn ơi, vì cái file ketqua nó có 2 sheet nên những sheet "Chỉ_số_tài_chính_xxxx" sẽ copy chung với nhau, tương tự như vậy cho các sheet "Lưu_chuyển_tiền_tệ_xxxx". Vì vậy những file nào có 1 sheet thì vẫn copy vào sheet cùng tên trong file ketqua. Cám ơn bạn nhé.
Với yêu cầu của bạn thì VBA sẽ xử lý được mặc dù code hơi vất cả chút. Tuy nhiên để xử lý tốt cho công việc về lâu dài thì ưu tiên dữ liệu phải khoa học. Bạn hãy xem lại cái file BID. 2015 có 2 cột, 2017 cũng 2 cột. Việc copy thủ công cũng không biết làm sao đừng nói chi đến code

Vài lời chia sẻ
 
Với yêu cầu của bạn thì VBA sẽ xử lý được mặc dù code hơi vất cả chút. Tuy nhiên để xử lý tốt cho công việc về lâu dài thì ưu tiên dữ liệu phải khoa học. Bạn hãy xem lại cái file BID. 2015 có 2 cột, 2017 cũng 2 cột. Việc copy thủ công cũng không biết làm sao đừng nói chi đến code

Vài lời chia sẻ
Không biết làm sao: Dân hỏi trên đây ỷ lại quen rồi. Việc soát lại dữ liệu là việc của người viết code chứ đâu phải là việc của người nhờ viết code.

Code hơi vất vả: bạn vất vả chứ người ta chỉ ngồi chờ, mắc mớ gì sợ vất vả.
Nếu làm tay thì dẫu có làm chậm gấp 3 lần tôi nói ở trên thì giờ này cũng đã xong rồi.
 
Với yêu cầu của bạn thì VBA sẽ xử lý được mặc dù code hơi vất cả chút. Tuy nhiên để xử lý tốt cho công việc về lâu dài thì ưu tiên dữ liệu phải khoa học. Bạn hãy xem lại cái file BID. 2015 có 2 cột, 2017 cũng 2 cột. Việc copy thủ công cũng không biết làm sao đừng nói chi đến code

Vài lời chia sẻ
Cám ơn bạn, đây là do lỗi người cập nhật, mình mới lấy về nên cũng chưa kiểm tra. Mình cũng đã làm tay như bạn @VetMini nói và cũng gần xong rồi. Mình đưa lên đây để nhờ các bạn xem và code giúp để kỳ sau thì sẽ làm nhanh hơn chứ không có ý ỷ lại hoặc ngồi chờ như bạn @VetMini nói bên trên. Xin lỗi vì đã làm bạn vất vả.
Bài đã được tự động gộp:

Không biết làm sao: Dân hỏi trên đây ỷ lại quen rồi. Việc soát lại dữ liệu là việc của người viết code chứ đâu phải là việc của người nhờ viết code.

Code hơi vất vả: bạn vất vả chứ người ta chỉ ngồi chờ, mắc mớ gì sợ vất vả.
Nếu làm tay thì dẫu có làm chậm gấp 3 lần tôi nói ở trên thì giờ này cũng đã xong rồi.
Rất cám ơn cao kiến của bạn về việc mua máy 2 màn hình.
 
Cám ơn bạn, đây là do lỗi người cập nhật, mình mới lấy về nên cũng chưa kiểm tra. Mình cũng đã làm tay như bạn @VetMini nói và cũng gần xong rồi. Mình đưa lên đây để nhờ các bạn xem và code giúp để kỳ sau thì sẽ làm nhanh hơn chứ không có ý ỷ lại hoặc ngồi chờ như bạn @VetMini nói bên trên. Xin lỗi vì đã làm bạn vất vả.
Bài đã được tự động gộp:
Code này không hoàn chỉnh nhưng có thể xài tạm được. Thay chỗ 1 to 20 cho phù hợp với những lần chạy kế tiếp
Sau khi tổng hợp dùng autofilter để xóa những dòng không mong muốn
Mã:
Sub Tong_Hop()
Dim ObjFile As Object, Res(), Source As String, sh As Worksheet, sArr()
Dim LastC As Long, i As Long, k As Long, j As Long, Dic As Object, nam As Long, cot As Long
Set Dic = CreateObject("scripting.dictionary")
For i = 1 To 20
   Dic(i + 2009) = i
Next
Sheet1.[A2].Resize(10000, 20).ClearContents
Sheet2.[A2].Resize(10000, 20).ClearContents
With CreateObject("Scripting.FileSystemObject")
   With .GetFolder(ThisWorkbook.Path)
      For Each ObjFile In .Files
         If ObjFile.Name <> ThisWorkbook.Name Then
            If Left(ObjFile.Name, 1) <> "~" Then
               Source = ThisWorkbook.Path & "\" & ObjFile.Name
               With Workbooks.Open(Source, 0)
                  For Each sh In .Worksheets
                     ReDim Res(1 To 100, 1 To 22)
                     LastC = sh.[Z11].End(1).Column
                     sArr = sh.Range("A11", sh.[A65536].End(3)).Resize(, LastC).Value
                     For i = 2 To UBound(sArr) - 9
                        For j = 2 To UBound(sArr, 2)
                           nam = sArr(1, j)
                           If Dic.exists(nam) Then
                              cot = Dic.Item(nam)
                              Res(i, 1) = Split(ObjFile.Name, ".")(0)
                              Res(i, 2) = sArr(i, 1)
                              Res(i, cot + 2) = sArr(i, j)
                              
                           End If
                        Next
                     Next
                     If sh.Name Like "L*" Then
                        Sheet1.[A65536].End(3).Offset(1).Resize(i, UBound(Res, 2)) = Res
                     Else
                        Sheet2.[A65536].End(3).Offset(1).Resize(i, UBound(Res, 2)) = Res
                     End If
                  Next
                  .Close False
               End With
            End If
         End If
      Next
   End With
End With
End Sub
 
Code này không hoàn chỉnh nhưng có thể xài tạm được. Thay chỗ 1 to 20 cho phù hợp với những lần chạy kế tiếp
Sau khi tổng hợp dùng autofilter để xóa những dòng không mong muốn
Mã:
Sub Tong_Hop()
Dim ObjFile As Object, Res(), Source As String, sh As Worksheet, sArr()
Dim LastC As Long, i As Long, k As Long, j As Long, Dic As Object, nam As Long, cot As Long
Set Dic = CreateObject("scripting.dictionary")
For i = 1 To 20
   Dic(i + 2009) = i
Next
Sheet1.[A2].Resize(10000, 20).ClearContents
Sheet2.[A2].Resize(10000, 20).ClearContents
With CreateObject("Scripting.FileSystemObject")
   With .GetFolder(ThisWorkbook.Path)
      For Each ObjFile In .Files
         If ObjFile.Name <> ThisWorkbook.Name Then
            If Left(ObjFile.Name, 1) <> "~" Then
               Source = ThisWorkbook.Path & "\" & ObjFile.Name
               With Workbooks.Open(Source, 0)
                  For Each sh In .Worksheets
                     ReDim Res(1 To 100, 1 To 22)
                     LastC = sh.[Z11].End(1).Column
                     sArr = sh.Range("A11", sh.[A65536].End(3)).Resize(, LastC).Value
                     For i = 2 To UBound(sArr) - 9
                        For j = 2 To UBound(sArr, 2)
                           nam = sArr(1, j)
                           If Dic.exists(nam) Then
                              cot = Dic.Item(nam)
                              Res(i, 1) = Split(ObjFile.Name, ".")(0)
                              Res(i, 2) = sArr(i, 1)
                              Res(i, cot + 2) = sArr(i, j)
                             
                           End If
                        Next
                     Next
                     If sh.Name Like "L*" Then
                        Sheet1.[A65536].End(3).Offset(1).Resize(i, UBound(Res, 2)) = Res
                     Else
                        Sheet2.[A65536].End(3).Offset(1).Resize(i, UBound(Res, 2)) = Res
                     End If
                  Next
                  .Close False
               End With
            End If
         End If
      Next
   End With
End With
End Sub
Cám ơn bạn nhiều nhé. Mình sẽ chạy thử.
 
Bạn ơi, vì cái file ketqua nó có 2 sheet nên những sheet "Chỉ_số_tài_chính_xxxx" sẽ copy chung với nhau, tương tự như vậy cho các sheet "Lưu_chuyển_tiền_tệ_xxxx". Vì vậy những file nào có 1 sheet thì vẫn copy vào sheet cùng tên trong file ketqua. Cám ơn bạn nhé.
Bạn tạm tham khảo file nhé, lưu ý kiểm tra, hiệu chỉnh dữ liệu nguồn bị trùng lặp trước khi gộp. Mình mới tập nên chắc khó được như ý.
 

File đính kèm

  • Gop_du_lieu.rar
    237.4 KB · Đọc: 17
Lần chỉnh sửa cuối:
Web KT
Back
Top Bottom