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
code gộp dữ liệu của thành viên meoluoi2010 cũng rất tốt
 

File đính kèm

  • gopfile.rar
    23.1 KB · Đọc: 153
Upvote 0
Bạn chạy mỗi code này. Còn code trong file tôi không sửa nha

Mã:
Option Explicit

Public Sub GPE()
Dim FOb As Object, Fso As Object, Item, cn As Object, rs As Object, fOld As String, fNew As String
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Set Fso = CreateObject("Scripting.FileSystemObject")
Set cn = CreateObject("ADODB.Connection")
If Application.Version < 12 Then
    fOld = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
    fNew = ";Extended Properties=""Excel 8.0;HDR=No;IMEX=1"";"
Else
    fOld = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
    fNew = ";Extended Properties=""Excel 12.0;HDR=No;IMEX=1"";"
End If
With Application.FileDialog(msoFileDialogFilePicker)
    .AllowMultiSelect = True
    .Filters.Add "Microsoft Excel Files", "*.xls*", 1
    If Not .Show = -1 Then
        MsgBox "Ban chua chon File", vbInformation, "----Mr.GPE----"
        Exit Sub
    End If
Range("A7").CurrentRegion.Offset(1).ClearContents
On Error Resume Next
For Each Item In .SelectedItems
    If Left(Item, 1) <> "~" Then
        cn.Open (fOld & Item & fNew)
            Set rs = cn.Execute("select * from [Data$A8:V] where F1 Is Not Null")
            If Not rs.EOF Then Range("A65000").End(3)(2).CopyFromRecordset rs
            rs.Close
            cn.Close
    End If
Next Item
End With
Set cn = Nothing
Set rs = Nothing
MsgBox "Done!"
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
Mình cảm ơn bạn hpkhuong nhé, mình sẽ sử dụng code này và trong quá trình sử dụng nếu có phát sinh vấn đề cần chỉnh sửa thì rất mong nhận được sự giúp đỡ của bạn.
Chân thành cảm ơn.
 
Upvote 0
Các bác cho hỏi làm sao lấy dữ liệu mà dàn hàng ngang thay vì nối tiếp theo cột ko a

như ví du #1
 

File đính kèm

  • tong hop du lieu vao 1 file.rar
    53.9 KB · Đọc: 20
Upvote 0
Xin hỏi thêm là nếu muốn tự động đọc các file theo [Danh sách], copy dữ liệu từ 1 vùng dữ liệu thỏa mãn điều kiện vào vùng tương ứng trong file tổng hợp thì
Bạn chạy mỗi code này. Còn code trong file tôi không sửa nha

Mã:
Option Explicit

Public Sub GPE()
Dim FOb As Object, Fso As Object, Item, cn As Object, rs As Object, fOld As String, fNew As String
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Set Fso = CreateObject("Scripting.FileSystemObject")
Set cn = CreateObject("ADODB.Connection")
If Application.Version < 12 Then
    fOld = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
    fNew = ";Extended Properties=""Excel 8.0;HDR=No;IMEX=1"";"
Else
    fOld = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
    fNew = ";Extended Properties=""Excel 12.0;HDR=No;IMEX=1"";"
End If
With Application.FileDialog(msoFileDialogFilePicker)
    .AllowMultiSelect = True
    .Filters.Add "Microsoft Excel Files", "*.xls*", 1
    If Not .Show = -1 Then
        MsgBox "Ban chua chon File", vbInformation, "----Mr.GPE----"
        Exit Sub
    End If
Range("A7").CurrentRegion.Offset(1).ClearContents
On Error Resume Next
For Each Item In .SelectedItems
    If Left(Item, 1) <> "~" Then
        cn.Open (fOld & Item & fNew)
            Set rs = cn.Execute("select * from [Data$A8:V] where F1 Is Not Null")
            If Not rs.EOF Then Range("A65000").End(3)(2).CopyFromRecordset rs
            rs.Close
            cn.Close
    End If
Next Item
End With
Set cn = Nothing
Set rs = Nothing
MsgBox "Done!"
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub

Xin hỏi thêm là nếu muốn tự động đọc các file theo [Danh sách] đã có, copy dữ liệu theo [điều kiện] vào vùng tương ứng trong file tổng hợp thì đoạn code cần bổ sung thêm thế nào vậy bạn?
 
Upvote 0
Muốn quét tất cả các sheet name trong "Vfile" và chọn sheet name đúng điều kiện của mình thì như thế nào ah?

Cảm ơn.
 
Upvote 0
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)
Em đã sữ dụng file anh ndu up lên, copy data ok. Nhưng ô trong file nguồn là dạng text (có số 0 ở đầu dãy),thì lúc copy qua , bị mất số 0 ở đầu; và nếu ô trong file nguồn là dạng dd/mm/yyyy , thì lúc copy qua ,bị chuyển sang số.
ANh xem giúp em với nha. Cám ơn anh
 
Upvote 0
Em đã sữ dụng file anh ndu up lên, copy data ok. Nhưng ô trong file nguồn là dạng text (có số 0 ở đầu dãy),thì lúc copy qua , bị mất số 0 ở đầu; và nếu ô trong file nguồn là dạng dd/mm/yyyy , thì lúc copy qua ,bị chuyển sang số.
ANh xem giúp em với nha. Cám ơn anh
Qua link sau Bài #9 nha nghiên cứu đi cũng có cái mới lạ đó nhe
http://www.giaiphapexcel.com/diendan/threads/tổng-hợp-dữ-liệu-theo-nhóm-từ-nhiều-file.129870/#post-815211

mà code này chưa xài được qua link đó coi code đó xong trong đầu phải U vài cục quá .... Tui coi xong thấy mắt còn cay cay chứ lị ...:D:p
 
Lần chỉnh sửa cuối:
Upvote 0
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)
Thầy cho e hỏi 1 chút ạ. E có dùng code trên chia sẻ để tổng hợp dữ liệu. File chạy tốt nhưng ko hiểu sao chỉ lấy tối đa được 16 file, Từ File thứ 17 trở đi khi chạy vẫn ok nhưng ko có dữ liệu cập nhật vào ạ.
 
Upvote 0
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)
Cảm ơn tác giả. Cho phép tôi sử dụng code không vì mục đích lợi nhuận.
 
Upvote 0
Cho em hỏi về chủ đề này cái:
Em muốn có thêm cột để biết dữ liệu đấy lấy từ file nào?
Em có thấy bài viết thêm code:
Mã:
"SELECT *,""" & files(k) & """ as [From File] FROM [" & SheetName & RangeAddress & "]")
Thay vì code ban đầu là
Mã:
szSQL = "SELECT *,""" & files(k) & """ as [From File] FROM [" & SheetName & RangeAddress & "]"
Tuy nhiên em đã thử và bị lỗi chỗ file(k), mọi người giúp em sửa code trong đoạn code ban đầu của bác Ndu để hoàn chỉnh.
Cám ơn mọi người
 
Upvote 0
Sử dụng nút gộp File, gộp sheet, tổng hợp, nội dung chi tiết xem sheet Hướng dẫn trong File

Lưu ý:

Tại B4 của sheet Hướng dẫn cần chọn loại Office 2003, 2007, 2010 của File cần gộp.
Em đang muốn lấy 1 sheet hay 1 số sheet (nghĩa là không lất hết tất cả các sheet của 1 file) của nhiều file về 1 file thì code của bài #21 sửa như thế nào, nhờ các anh chị giúp đỡ, em cảm ơn!
 
Upvote 0
Cho em hỏi về chủ đề này cái:
Em muốn có thêm cột để biết dữ liệu đấy lấy từ file nào?
Em có thấy bài viết thêm code:
Mã:
"SELECT *,""" & files(k) & """ as [From File] FROM [" & SheetName & RangeAddress & "]")
Thay vì code ban đầu là
Mã:
szSQL = "SELECT *,""" & files(k) & """ as [From File] FROM [" & SheetName & RangeAddress & "]"
Tuy nhiên em đã thử và bị lỗi chỗ file(k), mọi người giúp em sửa code trong đoạn code ban đầu của bác Ndu để hoàn chỉnh.
Cám ơn mọi người
Sửa file(k) thành Filename theo tên biến trong code ý
 
Upvote 0
Các bác làm ơn giúp em gộp dữ liệu của các file cùng định dạng nhưng khác tên sheet như sau vào 1 file mở sẵn được không ạ. Cảm ơn các bác rất nhiều
 

File đính kèm

  • 4.XLS
    8 KB · Đọc: 2
  • 3.XLS
    8 KB · Đọc: 1
  • 2.XLS
    8 KB · Đọc: 3
  • 1.XLS
    8 KB · Đọc: 3
  • 5.XLS
    8 KB · Đọc: 2
  • CIF.XLS
    82 KB · Đọc: 6
Upvote 0
Cho em hỏi khi em chạy lệnh, excel bị lỗi define name. Mấy anh chỉ cho e cách khắc ohucj lỗi này xóa define name với ạ
 
Upvote 0
Nhờ các anh chị trên diễn đàn giúp em file tổng hợp dữ liệu từ nhiều file, nhiều sheet vào 1 file tổng hợp với.
em có tải file trên về thì code là dạng copy dữ liệu theo thứ tự và chép liên tục xuống.
Còn file em gửi lên là muốn tổng hợp dạng cộng cell: A8 sheet1 file tong hop =A8 sheet1 file CA1+A8 sheet1 file CA2+A8 Sheet1 file CA3+..
A8 sheet2 file tong hop =A8 sheet2 file CA1+A8 sheet2 file CA2+A8 Sheet2 file CA3+..
A8 sheet3 file tong hop =A8 sheet3 file CA1+A8 sheet3 file CA2+A8 Sheet3 file CA3+..
và tương tự cho các cell khác thì làm thế nào ạ, thay vì dùng hàm, mình chuyển thành code; các định dạng là giống nhau ví dụ là sheet 1 các file, tương tự cho sheet 2, sheet 3
 

File đính kèm

  • tong hop du lieu vao 1 file.rar
    57.4 KB · Đọc: 9
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 à
Thầy và các anh chị giúp em cái file tổng hợp này với, ý đồ của em là muốn mở chọn các file cần tổng hợp như bài viết
việc tiếp theo em có ghi macro2 nhưng không biết phải đưa vào code ở đâu và như thế nào nhờ thầy và các anh chị giúp với!
Macro2 là sử dụng Consolidate, ở đây mỗi sheet trong mỗi file con em chỉ ví dụ 1 vùng dữ liệu nếu có thêm vùng dữ liệu thì mình làm cách nào ạ?
Cảm ơn thầy và các anh chị.
 

File đính kèm

  • tong hop du lieu vao 1 file.rar
    64.9 KB · Đọc: 7
Upvote 0
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)

Có thể chỉ lấy sheet chỉ định được không thầy? Ví dụ có 4 file A B C D, file nào cũng có sheet tên là ABC, em muốn tổng hợp vào một file mà trong file ấy chứa các sheet này (Ví dụ ABC1, ABC2, ABC3, ABC4 chẳng hạn, không phải tổng hợp vào một sheet)
 
Lần chỉnh sửa cuối:
Upvote 0
ên diễn đàn giúp em file tổng hợp dữ liệu từ nhiều file, nhiều sheet vào 1 file tổng hợp với.
em có tải file trên về thì code là dạng copy dữ liệu theo thứ tự và chép liên tục xuống.
Còn file em gửi lên là muốn tổng hợp dạng cộng cell: A8 sheet1 file tong hop =A8 sheet1 file CA1+A8 sheet1 file CA2+A8 Sheet1 file CA3+..
A8 sheet2 file tong hop =A8 sheet2 file CA1+A8 sheet2 file CA2+A8 Sheet2 file CA3+..
A8 sheet3 file tong hop =A8 sheet3 file CA1+A8 sheet3 file CA2+A8 Sheet3 file CA3+..
Có thể chỉ lấy sheet chỉ định được không thầy? Ví dụ có 4 file A B C D, file nào cũng có sheet tên là ABC, em muốn tổng hợp vào một file mà trong file ấy chứa các sheet này (Ví dụ ABC1, ABC2, ABC3, ABC4 chẳng hạn, không phải tổng hợp vào một sheet)
Đây là lấy sheet của từng file vào 1 file, mình có code này tham khảo, bạn tùy chỉnh lại nhé!
Mã:
Sub Join_Mutifile_into_1file()
Dim FolderPath As String
Dim FileName As String
Dim WS As Worksheet
Application.ScreenUpdating = False
' Ban thay duong dan nhe
FolderPath = "C:\Users\SONY\Downloads\VBA\TU HOC\Tong hop nhieu file vao 1 file\"
FileName = Dir(FolderPath & "*.xls*")
Do While FileName <> ""
Workbooks.Open FileName:=FolderPath & FileName, ReadOnly:=True
For Each WS In ActiveWorkbook.Sheets
WS.Copy after:=ThisWorkbook.Sheets(1)
Next WS
Workbooks(FileName).Close
FileName = Dir()
Loop
Application.ScreenUpdating = True
End Sub
Ps: File này mình tập tành nên cũng chưa ưng ý lắm, bạn xài tạm nhé!
 
Upvote 0
Web KT
Back
Top Bottom