Tổng hợp dữ liệu từ nhiều file excel vào 1 file không cần mở file

Liên hệ QC

ffcb1900

Thành viên chính thức
Tham gia
27/7/08
Bài viết
77
Được thích
4
Mình lúc nào cũng sẽ có 5 file dữ liệu (mỗi file khoảng 2000-5000 dòng dữ liệu), download trực tiếp hàng ngày từ server với định dạng định sẵn dưới định dạng .xls (số cột và vị trí cột định sẵn theo mẫu đính kèm là các file CA1, CA2, CA3, CA4, CA5).

Mình cần tổng hợp lại 5 file vào 1 file duy nhất (như mẫu đính kèm) trong đó du liệu của các file CA1, CA2, CA3, CA4, CA5 sẽ nối tiếp nhau ghep vào 1 sheet theo đúng cột tương ứng. Để tổng hợp đc mà k cần mở cả 5 file lên là tốt nhất (như kiểu paste link và có linh external data vậy).

Mong mọi người giúp đỡ với
 

File đính kèm

  • tong hop du lieu vao 1 file.zip
    35.1 KB · Đọc: 951
Mình lúc nào cũng sẽ có 5 file dữ liệu (mỗi file khoảng 2000-5000 dòng dữ liệu), download trực tiếp hàng ngày từ server với định dạng định sẵn dưới định dạng .xls (số cột và vị trí cột định sẵn theo mẫu đính kèm là các file CA1, CA2, CA3, CA4, CA5).

Mình cần tổng hợp lại 5 file vào 1 file duy nhất (như mẫu đính kèm) trong đó du liệu của các file CA1, CA2, CA3, CA4, CA5 sẽ nối tiếp nhau ghep vào 1 sheet theo đúng cột tương ứng. Để tổng hợp đc mà k cần mở cả 5 file lên là tốt nhất (như kiểu paste link và có linh external data vậy).

Mong mọi người giúp đỡ với

Bạn gôm 5 File vào 1 Foder rồi sử dụng File gộp các File vào 1 File, nhấn Ctrl+Q để chạy Code, hộp thoại Open file mở ra, bạn vào mục look in chọn ổ dĩa và chọn Folder cần gộp File và nhấn nút Open, tiếp theo chọn tất cả các File cần gộp và nhấn nút Open (hoặc nhấn nút Enter), chờ Macro chạy và lấy tất cả các sheet có trong tất cả các File vào File (gộp các File vào 1 File).

Bạn tìm trên diễn đàn đã có bài gộp các sheet vào 1 sheet tải về sử dụng, nếu tìm và làm không được tôi sẽ giúp sau.

Lưu ý:
- Trong tất cả các sheet tôi đặt tên sheet ở cột B, để khi gộp các sheet lại bạn sẽ phân biệt vùng nào là của sheet nào gộp vô, sau đó sử dụng PivotTable để tổng hợp thì mới có kết quả của từng tên như đã đặt ở cột B.
- Bạn không được làm ẩn sheet (nếu để ẩn thì phát sinh lỗi).
 

File đính kèm

  • sodangoai_xa Lang Minh.rar
    1.2 MB · Đọc: 2,114
Lần chỉnh sửa cuối:
Upvote 0
Mình lúc nào cũng sẽ có 5 file dữ liệu (mỗi file khoảng 2000-5000 dòng dữ liệu), download trực tiếp hàng ngày từ server với định dạng định sẵn dưới định dạng .xls (số cột và vị trí cột định sẵn theo mẫu đính kèm là các file CA1, CA2, CA3, CA4, CA5).

Mình cần tổng hợp lại 5 file vào 1 file duy nhất (như mẫu đính kèm) trong đó du liệu của các file CA1, CA2, CA3, CA4, CA5 sẽ nối tiếp nhau ghep vào 1 sheet theo đúng cột tương ứng. Để tổng hợp đc mà k cần mở cả 5 file lên là tốt nhất (như kiểu paste link và có linh external data vậy).

Mong mọi người giúp đỡ với
Dùng ADO sẽ không cần mở file:
Mã:
Function GetData(ByVal FileName As String, ByVal SheetName As String, ByVal RangeAddress As String, _
            ByVal HasTitle As Boolean, ByVal UseTitle As Boolean)
            
  Dim rsCon As Object, rsData As Object, cat As Object, tbl As Object
  Dim tmpArr, Arr()
  Dim szConnect As String, szSQL As String, tmp As String
  Dim lCount As Long, lR As Long, lC As Long, lVer As Long
  lVer = Val(Application.Version)
  Set rsCon = CreateObject("ADODB.Connection")
  Set rsData = CreateObject("ADODB.Recordset")
  Set cat = CreateObject("ADOX.Catalog")
  
  If lVer < 12 Then
    szConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & FileName & ";" & _
                "Extended Properties=""Excel 8.0;HDR=" & IIf(HasTitle, "Yes", "No") & """;"
  Else
    szConnect = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & FileName & ";" & _
                "Extended Properties=""Excel 12.0;HDR=" & IIf(HasTitle, "Yes", "No") & """;"
  End If
  If SheetName = "" Then
    Dim Dbs  As Object, db As Object
    Set Dbs = CreateObject("DAO.DBEngine." & IIf(lVer < 12, "36", "120"))
    Set db = Dbs.OpenDatabase(FileName, False, False, "Excel 8.0;")
    tmp = db.TableDefs(0).Name
    tmp = Replace(tmp, " ", "?")
    tmp = Replace(tmp, "'", " ")
    tmp = WorksheetFunction.Trim(tmp)
    tmp = Replace(tmp, " ", "'")
    tmp = Replace(tmp, "?", " ")
    SheetName = tmp
    db.Close
    Set Dbs = Nothing: Set db = Nothing
  End If
  If Right(SheetName, 1) <> "$" Then SheetName = SheetName & "$"
  rsCon.Open szConnect
  cat.ActiveConnection = rsCon
  
  szSQL = "SELECT * FROM [" & SheetName & RangeAddress & "];"
  rsData.Open szSQL, rsCon, 0, 1, 1
  tmpArr = rsData.GetRows
  ReDim Arr(UBound(tmpArr, 2) - UseTitle, UBound(tmpArr, 1) + 1)
  If UseTitle Then
    For lC = LBound(tmpArr, 1) To UBound(tmpArr, 1)
      Arr(0, lC) = rsData.Fields(lC).Name
    Next
  End If
  For lR = LBound(tmpArr, 2) To UBound(tmpArr, 2)
    For lC = LBound(tmpArr, 1) To UBound(tmpArr, 1)
      Arr(lR - UseTitle, lC) = tmpArr(lC, lR)
    Next
  Next
  rsData.Close: Set rsData = Nothing
  rsCon.Close: Set rsCon = Nothing
  GetData = Arr
End Function

Sub Main()
  Dim vFile, FileItem, aRes, Target As Range
  Dim FileName As String, SheetName As String, RangeAddress As String
  On Error Resume Next
  vFile = Application.GetOpenFilename("Excel File, *.xls; *.xlsx; *.xlsm", , , , True)
  If TypeName(vFile) = "Variant()" Then
    SheetName = "Sheet1": RangeAddress = "A8:V10000"
    For Each FileItem In vFile
      FileName = CStr(FileItem)
      If UCase(FileName) <> UCase(ThisWorkbook.FullName) Then
        aRes = GetData(FileName, SheetName, RangeAddress, False, False)
        If IsArray(aRes) Then
          Set Target = Sheet1.Range("A60000").End(xlUp).Offset(1)
          Target.Resize(UBound(aRes, 1) + 1, UBound(aRes, 2) + 1).Value = aRes
        End If
      End If
    Next
    MsgBox "Done!"
  End If
End Sub
Cách dùng:
- Cho code trên vào Module
- Chạy sub Main
- Cửa sổ Open File hiện ra, dùng chuột chọn file đầu, bấm giữ phím Shift rồi còn file cuối ---> Bấm nút Open
- Chờ trong giây lát, khi MsgBox hiện ra báo hiệu hoàn tất, kiểm tra lại dữ liệu trong file hiện hành xem đã cập nhật chưa
-------------
Lưu ý: File TongHop phải được lưu theo định dạng XLSM (nếu lưu bằng XLSX sẽ mất sạch code)
 

File đính kèm

  • tong hop du lieu vao 1 file.rar
    51.2 KB · Đọc: 2,513
Upvote 0
Cảm ơn 2 thầy be09 và ndu96081631!
Em thử file của thầy be09 thì có 2 lỗi phát sinh như em đính kèm file để thầy sửa giúp xem vì sao ạ. Nếu ra từng sheet riêng rẽ này thì em dùng Pivot chỉ biết làm cho 1 sheet, nhiều sheet thi Pivot xử thế nào, thầy chỉ cho em biết với.

File của thầy ndu96081631, em thử chạy tốt. Thầy cho em hỏi, với code này, thì sẽ có những hạn chế gì mà sẽ khiến file k chạy được ạ ? Ví dụ hạn chế về số dòng, số cột, định dạng, số lượng gộp file... ? Nếu sau em có thêm file data để gộp và vùng gộp cũng thay đổi số cột thì thầy em sẽ chỉnh đoạn nào trong code để có thể tự thay đổi đc ạ?

Ngoài ra em còn 1 đề nữa ở topic khác, nhờ 2 thầy và các bạn giải dùm với
http://www.giaiphapexcel.com/forum/showthread.php?84528-Tự-động-đếm-số-lân-cho-từng-mã-trong-1-tháng
 

File đính kèm

  • Error 1 - sodangoa.jpg
    Error 1 - sodangoa.jpg
    145.7 KB · Đọc: 187
  • Error 2 - sodangoa.jpg
    Error 2 - sodangoa.jpg
    270.1 KB · Đọc: 155
Upvote 0
Bạn không nên dùng chữ thầy trong bài viết, ý của tôi là chỉ trả lời bài viết với mục đích "người biết thì trả lời người chưa biết để giúp nhau trong công việc. Trong bài viết tác giả đã nêu rõ ở dòng tiêu đề:

Tổng hợp dữ liệu từ nhiều file excel vào 1 file

Còn việc gộp các sheet vào 1 sheet thì tôi cũng đã nêu:

Bạn tìm trên diễn đàn đã có bài gộp các sheet vào 1 sheet tải về sử dụng, nếu tìm và làm không được tôi sẽ giúp sau


Vì vậy nếu bạn chưa gộp các sheet vào thì khi sử dụng Pivottable thì kết quả chỉ được 1 sheet là đúng rồi, còn vấn đề lỗi tôi cũng đã nêu ở trên.

Bạn không được làm ẩn sheet (nếu để ẩn thì phát sinh lỗi)

Trong File tại B3 tôi cũng đã nêu: "Chỗ B3 chọn loại Office 2003, 2007, 2010".
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn 2 thầy be09 và ndu96081631!
Em thử file của thầy be09 thì có 2 lỗi phát sinh như em đính kèm file để thầy sửa giúp xem vì sao ạ. Nếu ra từng sheet riêng rẽ này thì em dùng Pivot chỉ biết làm cho 1 sheet, nhiều sheet thi Pivot xử thế nào, thầy chỉ cho em biết với.

File của thầy ndu96081631, em thử chạy tốt. Thầy cho em hỏi, với code này, thì sẽ có những hạn chế gì mà sẽ khiến file k chạy được ạ ? Ví dụ hạn chế về số dòng, số cột, định dạng, số lượng gộp file... ? Nếu sau em có thêm file data để gộp và vùng gộp cũng thay đổi số cột thì thầy em sẽ chỉnh đoạn nào trong code để có thể tự thay đổi đc ạ?

Ngoài ra em còn 1 đề nữa ở topic khác, nhờ 2 thầy và các bạn giải dùm với
http://www.giaiphapexcel.com/forum/showthread.php?84528-Tự-động-đếm-số-lân-cho-từng-mã-trong-1-tháng

Anh ndu96081631 cho em hỏi thêm là sau khi chạy với file test thì chạy tốt. Nhưng chạy với file download xuống thì bị lỗi là:
-Vẫn báo "Done" nhưng dữ liệu trống ko tổng hợp sang. Rất tiếc là file down xuống nằm trong máy tính của công ty mà k thế upload trực tiếp lên đc ạ

- Nếu copy all từ file down xuống và paste all vao 1 new document. Rồi dùng file tổng hợp trỏ đến new document thì chạy ngon còn trỏ vào file down xuống thì k chạy. Liệu có restriction gì cài đặt trong file down xuống làm hạn chế này ko ạ ? Liệu có loại restriction nào như the k ạ ?
 
Upvote 0
File của thầy ndu96081631, em thử chạy tốt. Thầy cho em hỏi, với code này, thì sẽ có những hạn chế gì mà sẽ khiến file k chạy được ạ ? Ví dụ hạn chế về số dòng, số cột, định dạng, số lượng gộp file... ? Nếu sau em có thêm file data để gộp và vùng gộp cũng thay đổi số cột thì thầy em sẽ chỉnh đoạn nào trong code để có thể tự thay đổi đc ạ?

Bạn chỉ cần để ý Sub Main này thôi:
Mã:
Sub Main()
  Dim vFile, FileItem, aRes, Target As Range
  Dim FileName As String, SheetName As String, RangeAddress As String
  On Error Resume Next
  vFile = Application.GetOpenFilename("Excel File, *.xls; *.xlsx; *.xlsm", , , , True)
  If TypeName(vFile) = "Variant()" Then
    [COLOR=#ff0000][B]SheetName = "Sheet1"[/B][/COLOR]: [B][COLOR=#0000cd]RangeAddress = "A8:V10000"[/COLOR][/B]
    For Each FileItem In vFile
      [B][COLOR=#006400]FileName = CStr(FileItem)[/COLOR][/B]
      If UCase(FileName) <> UCase(ThisWorkbook.FullName) Then
        aRes = GetData(FileName, SheetName, RangeAddress, False, False)
        If IsArray(aRes) Then
          Set Target = Sheet1.Range("A60000").End(xlUp).Offset(1)
          Target.Resize(UBound(aRes, 1) + 1, UBound(aRes, 2) + 1).Value = aRes
        End If
      End If
    Next
    MsgBox "Done!"
  End If
End Sub
Khai báo cho đúng: màu đỏ là tên sheet, màu xanh dương là vùng dữ liệu, xanh lá là tên file
----------------------
Anh ndu96081631 cho em hỏi thêm là sau khi chạy với file test thì chạy tốt. Nhưng chạy với file download xuống thì bị lỗi là:
-Vẫn báo "Done" nhưng dữ liệu trống ko tổng hợp sang. Rất tiếc là file down xuống nằm trong máy tính của công ty mà k thế upload trực tiếp lên đc ạ

- Nếu copy all từ file down xuống và paste all vao 1 new document. Rồi dùng file tổng hợp trỏ đến new document thì chạy ngon còn trỏ vào file down xuống thì k chạy. Liệu có restriction gì cài đặt trong file down xuống làm hạn chế này ko ạ ? Liệu có loại restriction nào như the k ạ ?
Bạn nói chung chung thế sao tôi biết được. Khám bệnh thì phải có bệnh nhân bạn à
 
Upvote 0
Thầy ndu96081631ơi cho em hỏi thêm chút: Nếu các file em cần tổng hợp nằm ở nhiều thư mục khác nhau thì có cách nào để dùng được code này ko thầy? Mong được thầy chỉ dạy.
Em cảm ơn thầy.
 
Upvote 0
Thầy ndu96081631ơi cho em hỏi thêm chút: Nếu các file em cần tổng hợp nằm ở nhiều thư mục khác nhau thì có cách nào để dùng được code này ko thầy? Mong được thầy chỉ dạy.
Em cảm ơn thầy.

Đương nhiên là được! Chỉ cần bạn biết được các file ấy nằm ở đâu (đường dẫn)
Nếu chỉ 1 vài file thì bạn cũng không cần phải For.. Next làm gì, cứ liệt kê đường dẫn ấy ra rồi tổng hợp từng cái là được
--------------
Bạn tự "mò" hoặc cho file cụ thể lên đây nếu không làm được nhé
 
Upvote 0
Đương nhiên là được! Chỉ cần bạn biết được các file ấy nằm ở đâu (đường dẫn)
Nếu chỉ 1 vài file thì bạn cũng không cần phải For.. Next làm gì, cứ liệt kê đường dẫn ấy ra rồi tổng hợp từng cái là được
--------------
Bạn tự "mò" hoặc cho file cụ thể lên đây nếu không làm được nhé
Vâng, em hiểu ý thầy và như vậy là mình phải làm nhiều lần, mỗi lần chỉ được 1 thư mục. Em hỏi khó thầy tí là em muốn làm 1 lần cho một số thư mục (các thư mục này nằm trong 1 thư mục cấp cao hơn)
Cảm ơn thầy nhiều!
 
Upvote 0
Vâng, em hiểu ý thầy và như vậy là mình phải làm nhiều lần, mỗi lần chỉ được 1 thư mục. Em hỏi khó thầy tí là em muốn làm 1 lần cho một số thư mục (các thư mục này nằm trong 1 thư mục cấp cao hơn)
Cảm ơn thầy nhiều!

Thì chỉ yêu cầu bạn biết trước đường dẫn của file là được rồi
Có thể đầu tiên ta liệt kê các đường dẫn ấy vào 1 Array, xong dùng vòng lập quét qua array này (để lấy đường dẫn) ---> Vậy xem như là làm 1 lần rồi
 
Upvote 0
Em lại làm phiền các thầy 1 chút:
Em Copy đoạn Code của thầy và làm như hướng dẫn cho 1 file ví dụ thì chạy rất tốt nhưng khi em đưa code vào file chính thức của em lại ko chạy được. Em nghi là file tổng hợp của em có vấn đề gì đó mà em ko thể tìm ra lỗi. Em cũng hỏi thêm là vùng dữ liệu sau khi khi tổng hợp hiện tại nó đang nằm ở 1 vị trí mặc định, em muốn sửa code để vùng dữ liệu này nằm ở vị trí tùy ý thì sửa ở chỗ nào.
Mong thầy chỉ bảo giúp em.
Cảm ơn thầy.
Vui lòng xem file đính kèm.
 

File đính kèm

  • GPE.rar
    53.5 KB · Đọc: 217
Upvote 0
...vùng dữ liệu sau khi khi tổng hợp hiện tại nó đang nằm ở 1 vị trí mặc định, em muốn sửa code để vùng dữ liệu này nằm ở vị trí tùy ý thì sửa ở chỗ nào.
....

Trong khi chờ Ndu trả lời, trong sub Main bạn thử thay câu lệnh

Set Target = Sheet1.Range("A60000").End(xlUp).Offset(1)

thành

Set Target = Sheet1.Range(selection)

Lưu ý: vị trí bạn đặt con trỏ sẽ là ô đầu tiên (ô trái trên) của vùng dữ liệu. Vì vậy bạn phải chọn vị trí đặt dữ liệu trước khi chạy code
 
Upvote 0
Em lại làm phiền các thầy 1 chút:
Em Copy đoạn Code của thầy và làm như hướng dẫn cho 1 file ví dụ thì chạy rất tốt nhưng khi em đưa code vào file chính thức của em lại ko chạy được. Em nghi là file tổng hợp của em có vấn đề gì đó mà em ko thể tìm ra lỗi. Em cũng hỏi thêm là vùng dữ liệu sau khi khi tổng hợp hiện tại nó đang nằm ở 1 vị trí mặc định, em muốn sửa code để vùng dữ liệu này nằm ở vị trí tùy ý thì sửa ở chỗ nào.
Mong thầy chỉ bảo giúp em.
Cảm ơn thầy.
Vui lòng xem file đính kèm.

Đoạn code Set Target = Sheet1.Range("A60000").End(xlUp).Offset(1)
Trong file của bạn chẳng có sheet nào là Sheet1 cả
Nên nhớ viết kiểu như thế Excel hiểu rằng đó là Sheet CodeName nha
Cái "Sheet1" mà bạn nhìn thấy có Sheet CodeName = "Sheet6"
Vậy, hoặc là bạn sửa đoạn code trên thành:
Set Target = Sheet6.Range("A60000").End(xlUp).Offset(1)
Hoặc là sửa thành:
Set Target = Worksheets("Sheet1").Range("A60000").End(xlUp).Offset(1)
---------------------
Trong khi chờ Ndu trả lời, trong sub Main bạn thử thay câu lệnh

Set Target = Sheet1.Range("A60000").End(xlUp).Offset(1)

thành

Set Target = Sheet1.Range(selection)


Lưu ý: vị trí bạn đặt con trỏ sẽ là ô đầu tiên (ô trái trên) của vùng dữ liệu. Vì vậy bạn phải chọn vị trí đặt dữ liệu trước khi chạy code
Vầy mới đúng chứ anh Set Target = Selection
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn các thầy đã giúp. Em đã làm theo chỉ dẫn của các thầy và đã thành công.
Mỗi ngày lên GPE là 1 ngày em học được bao điều bổ ích.
Yêu GPE...
 
Upvote 0
Bạn chỉ cần để ý Sub Main này thôi:
Mã:
Sub Main()
  Dim vFile, FileItem, aRes, Target As Range
  Dim FileName As String, SheetName As String, RangeAddress As String
  On Error Resume Next
  vFile = Application.GetOpenFilename("Excel File, *.xls; *.xlsx; *.xlsm", , , , True)
  If TypeName(vFile) = "Variant()" Then
    [COLOR=#ff0000][B]SheetName = "Sheet1"[/B][/COLOR]: [B][COLOR=#0000cd]RangeAddress = "A8:V10000"[/COLOR][/B]
    For Each FileItem In vFile
      [B][COLOR=#006400]FileName = CStr(FileItem)[/COLOR][/B]
      If UCase(FileName) <> UCase(ThisWorkbook.FullName) Then
        aRes = GetData(FileName, SheetName, RangeAddress, False, False)
        If IsArray(aRes) Then
          Set Target = Sheet1.Range("A60000").End(xlUp).Offset(1)
          Target.Resize(UBound(aRes, 1) + 1, UBound(aRes, 2) + 1).Value = aRes
        End If
      End If
    Next
    MsgBox "Done!"
  End If
End Sub
Khai báo cho đúng: màu đỏ là tên sheet, màu xanh dương là vùng dữ liệu, xanh lá là tên file
----------------------

Bạn nói chung chung thế sao tôi biết được. Khám bệnh thì phải có bệnh nhân bạn à


Anh ndu ơi, em đã sữ dụng file anh up lên, copy data ok. Nhưng em phát hiện có 1 vấn đề là: nếu ô trong file nguồn là dạng text (có số 0 ở đầu dãy), nhưng lúc copy qua thì bị mất số 0 ở đầu anh ơi. (em có file ví dụ, nhưng ko upload ở đây đc ;( ).
ANh xem giúp em với nha. Cám ơn anh
 
Upvote 0
hiện tại em cũng có 2 file cần tổng hợp là 1 nhưng làm như hướng dẫn ko được. Nhờ các anh giúp với. Trong file excel của em có công thức cũng như 1 số đoạn code tổng hợp.
Em có tổng cộng 3 file: 2 file Team HN,HCM và 1 file tổng hợp.
 
Upvote 0
Dùng ADO sẽ không cần mở file:
Cách dùng:
- Cho code trên vào Module
- Chạy sub Main
- Cửa sổ Open File hiện ra, dùng chuột chọn file đầu, bấm giữ phím Shift rồi còn file cuối ---> Bấm nút Open
- Chờ trong giây lát, khi MsgBox hiện ra báo hiệu hoàn tất, kiểm tra lại dữ liệu trong file hiện hành xem đã cập nhật chưa
-------------
Lưu ý: File TongHop phải được lưu theo định dạng XLSM (nếu lưu bằng XLSX sẽ mất sạch code)
Mọi người lam ơn cho hỏi có file của bài #3chay ko ra k quả trên excel 2003 phải ko các anh chị, em mầm mãi ko được như thầy Ndu96081631 giới thiệu
Xin giải pháp khắc phục với ah
cảm ơn các anh chị
 
Lần chỉnh sửa cuối:
Upvote 0
Nhờ BQT xóa giúp 2 bài #18;#19 của tôi trên đây
Cảm ơn
 
Upvote 0
Web KT
Back
Top Bottom