Tổng hợp dữ liệu từ nhiều file o (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

saobekhonglac

Thành viên mới
Tham gia
1/11/08
Bài viết
1,565
Được thích
1,454
Giới tính
Nam
Chào anh/chị.

Em có nhiều file excel (mỗi file có nhiều sheet). Em muốn làm 1 file tổng hợp sau cho chỉ tổng hợp dữ liệu của các sheet “TH” trong các file 1.xls, 2.xls (những sheet còn lại không tổng hợp) sẽ được tổng hợp vào sheet “TH” trong file Tong hop.xls. Nhờ anh/chị hướng dẫn code VBA giúp.

Cám ơn anh/chị.
 

File đính kèm

Mã:
Public Sub beThichMuaCot()
Dim cn As Object, rs As Object, i As Byte, mRow As Long
Set cn = CreateObject("adodb.connection")
    'Provider=Microsoft.ACE.OLEDB.12.0
    'microsoft.jet.oledb.4.0
    For i = 1 To 2 Step 1
        cn.Open ("provider=microsoft.jet.oledb.4.0; data source=" & _
        ThisWorkbook.Path & "\" & i & ".xls" & _
                 ";mode=read;extended properties=""Excel 8.0;hdr=no"";")
        Set rs = cn.Execute("select * from [TH$A:E] where f1 is not null")
        mRow = Sheet1.[A50000].End(xlUp).Row + 1
        If Not rs.EOF Then Worksheets("TH").Range("A" & mRow).CopyFromRecordset rs
        rs.Close
        cn.Close
    Next
End Sub
 
Tên sub "beThichMuaCot" đặt hay phết.
 
Cám ơn anh.

Em chạy được rồi, nếu trường hợp em có nhiều file và mỗi file có tên khách nhau chứ không phải là 1,2,3,..., (mà là A, H, D,...) thì nó không hiểu. Anh có thể sữa giúp em khi mình run nó cho mình chọn file cần tổng hợp không anh.

Cám ơn anh.

Mã:
Public Sub beThichMuaCot()
Dim cn As Object, rs As Object, i As Byte, mRow As Long
Set cn = CreateObject("adodb.connection")
    'Provider=Microsoft.ACE.OLEDB.12.0
    'microsoft.jet.oledb.4.0
    For i = 1 To 2 Step 1
        cn.Open ("provider=microsoft.jet.oledb.4.0; data source=" & _
        ThisWorkbook.Path & "\" & i & ".xls" & _
                 ";mode=read;extended properties=""Excel 8.0;hdr=no"";")
        Set rs = cn.Execute("select * from [TH$A:E] where f1 is not null")
        mRow = Sheet1.[A50000].End(xlUp).Row + 1
        If Not rs.EOF Then Worksheets("TH").Range("A" & mRow).CopyFromRecordset rs
        rs.Close
        cn.Close
    Next
End Sub
 
Sao máy tôi chạy code ADO trên không được vậy nhỉ? liệu có phải tick thêm gì trong References không nhỉ?
mình biết bạn sẽ hỏi câu đó mà . vì máy mình cũng đâu có chạy được code đó
trong phần chú thích lấy cái thằng
Microsoft.ACE.OLEDB.12.0
thế vào chỗ
microsoft.jet.oledb.4.0
mới chạy được
máy chúng ta là hệ 64 bit lại chơi cái off 2013 nữa nên nó không có JET . chỉ có ACE thôi
 
Cám ơn anh.

Em chạy được rồi, nếu trường hợp em có nhiều file và mỗi file có tên khách nhau chứ không phải là 1,2,3,..., (mà là A, H, D,...) thì nó không hiểu. Anh có thể sữa giúp em khi mình run nó cho mình chọn file cần tổng hợp không anh.

Cám ơn anh.

đây là làm theo kiểu chọn File
Mã:
Public Sub beThichMuaCot()
Dim cn As Object, rs As Object, i As Byte, mRow As Lon
Set cn = CreateObject("adodb.connection")
    'Provider=Microsoft.ACE.OLEDB.12.0
    'microsoft.jet.oledb.4.0
    With Application.FileDialog(msoFileDialogOpen)
        .InitialFileName = ThisWorkbook.Path
        .Filters.Clear
        .Filters.Add "hello", "*.xls*"
        .AllowMultiSelect = True
        .Show
        For i = 1 To .SelectedItems.Count Step 1
            cn.Open ("provider=microsoft.jet.oledb.4.0; data source=" & _
            .SelectedItems(i) & _
                     ";mode=read;extended properties=""Excel 8.0;hdr=no"";")
            Set rs = cn.Execute("select * from [TH$A:E] where f1 is not null")
            mRow = Sheet1.[A50000].End(xlUp).Row + 1
            If Not rs.EOF Then Worksheets("TH").Range("A" & mRow).CopyFromRecordset rs
            rs.Close
            cn.Close
        Next
    End With
End Sub
 
Em làm đươc rồi. cám ơn anh. Nếu trong file em muốn tổng hợp thêm những file có đuôi là xlsx thì sữa code thành như thế nào vậy anh.

đây là làm theo kiểu chọn File
Mã:
Public Sub beThichMuaCot()
Dim cn As Object, rs As Object, i As Byte, mRow As Lon
Set cn = CreateObject("adodb.connection")
    'Provider=Microsoft.ACE.OLEDB.12.0
    'microsoft.jet.oledb.4.0
    With Application.FileDialog(msoFileDialogOpen)
        .InitialFileName = ThisWorkbook.Path
        .Filters.Clear
        .Filters.Add "hello", "*.xls*"
        .AllowMultiSelect = True
        .Show
        For i = 1 To .SelectedItems.Count Step 1
            cn.Open ("provider=microsoft.jet.oledb.4.0; data source=" & _
            .SelectedItems(i) & _
                     ";mode=read;extended properties=""Excel 8.0;hdr=no"";")
            Set rs = cn.Execute("select * from [TH$A:E] where f1 is not null")
            mRow = Sheet1.[A50000].End(xlUp).Row + 1
            If Not rs.EOF Then Worksheets("TH").Range("A" & mRow).CopyFromRecordset rs
            rs.Close
            cn.Close
        Next
    End With
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
máy bạn có đọc được xlsx thì chơi vầy luôn
Mã:
Cn.Open ("provider=Microsoft.ACE.OLEDB.12.0;data source=" & _
        .SelectedItems(i) & ";mode=Read;extended properties=""Excel 12.0;hdr=no"";")
 
Cám ơn anh nhiều. Nếu trường hợp em cần tổng hợp dữ liệu ở nhiều file khách nhau, nhưng mỗi file chỉ có 1 sheet (tên các sheet trong mỗi file không giống nhau, vd T01, T02, T03, ....) thì code như thế nào vậy anh (code vẫn chọn file được nha anh)

Cám ơn anh.

máy bạn có đọc được xlsx thì chơi vầy luôn
Mã:
Cn.Open ("provider=Microsoft.ACE.OLEDB.12.0;data source=" & _
        .SelectedItems(i) & ";mode=Read;extended properties=""Excel 12.0;hdr=no"";")
 
Cám ơn anh nhiều. Nếu trường hợp em cần tổng hợp dữ liệu ở nhiều file khách nhau, nhưng mỗi file chỉ có 1 sheet (tên các sheet trong mỗi file không giống nhau, vd T01, T02, T03, ....) thì code như thế nào vậy anh (code vẫn chọn file được nha anh)

Cám ơn anh.

select * from [A:E] .......
 
Cho mình hỏi là nếu các file con có số cột khác nhau chỉ có cột tiêu đề là giống nhau thôi, vậy code sẽ chuyển thành gì để nó vẫn chạy được vậy bạn
 
Anh cho em hỏi nếu em muốn cập nhật dữ liệu từ dòng 6 của các file và cập nhật sang dòng 6 của file tổng thì sữa code như thế nào vậy anh.

Cám ơn.
 

File đính kèm

Lần chỉnh sửa cuối:
select * from [A6:E]
trước khi bắt đầu vòng lặp For thì xóa hết dữ liệu cũ trong file tổng hợp
 
kiếm cái này
Mã:
mRow = Sheet2.[B50000].End(xlUp).Row + 1

sửa lại thành
Mã:
mRow = WorksheetFunction.Max(Sheet2.[B50000].End(xlUp).Row + 1, 6)
Cho mình hỏi "ngu" chút xíu, sửa thành như thế này có được không nhỉ?
mRow = Sheet2.[B50000].End(xlUp).Row + 5
P/s: Hông có ngồi trên máy nên hông test được. hehe
---------------------------------------------------
À, mình biết "ngu" ở chỗ nào rồi.
 
Lần chỉnh sửa cuối:
Cho mình hỏi "ngu" chút xíu, sửa thành như thế này có được không nhỉ?
mRow = Sheet2.[B50000].End(xlUp).Row + 5
P/s: Hông có ngồi trên máy nên hông test được. hehe

khi nào bạn xuống xe vào nhà uống ly cafe , tải file nén kia về chạy thử với 3 file con là biết liền hà
 
Sửa vậy khi tổng hợp dữ liệu các file sẽ cách nhau 5 ô, mình không biết vba nhưng cũng mò thử trước rồi, mò nhiệt tình lắm nhưng không được mới nhờ giúp đỡ.

Cho mình hỏi "ngu" chút xíu, sửa thành như thế này có được không nhỉ?
mRow = Sheet2.[B50000].End(xlUp).Row + 5
P/s: Hông có ngồi trên máy nên hông test được. hehe
---------------------------------------------------
À, mình biết "ngu" ở chỗ nào rồi.
 
Sửa vậy khi tổng hợp dữ liệu các file sẽ cách nhau 5 ô, mình không biết vba nhưng cũng mò thử trước rồi, mò nhiệt tình lắm nhưng không được mới nhờ giúp đỡ.
Bởi vậy mình mới nói là hỏi "ngu" chút xíu, chứ mình cũng như bạn mù tịt mấy khoản này luôn, nên chấp nhận chịu "ngu" để hỏi cho khôn ra ý.
 
Em chào cả nhà :)
Em định lập thớt nhưng nhân tiện có thớt này nên em hỏi luôn ở đây.
Lâu nay em có file tổng hợp dữ liệu từ nhiều file khác mà không cần mở file. Giờ em muốn chèn thêm 1 đoạn code để khi chạy macro này thì tạo luôn 1 đường link bên cạnh để ta bấm vào đó là mở được file kia ra.
Đoạn code cũ của em vẫn dùng đây ạ:
PHP:
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 Danhsach_Thauphu()
  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 = "Ma TP": RangeAddress = "B2:O2"
    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 = Sheet3.Range("A60000").End(xlUp).Offset(1)
          Target.Resize(UBound(aRes, 1) + 1, UBound(aRes, 2) + 1).Value = aRes
        End If
      End If
    Next
        Cells.Select
         Range("A8").Activate
         Selection.EntireColumn.Hidden = False
         Range("A9:A10").Select
         MsgBox "HOÀN THÀNH!"
  End If
End Sub
Các bác giúp em với nhé, em cảm ơn nhiều ạ -=.,,
 
Em chào cả nhà :)
Em định lập thớt nhưng nhân tiện có thớt này nên em hỏi luôn ở đây.
Lâu nay em có file tổng hợp dữ liệu từ nhiều file khác mà không cần mở file. Giờ em muốn chèn thêm 1 đoạn code để khi chạy macro này thì tạo luôn 1 đường link bên cạnh để ta bấm vào đó là mở được file kia ra.
Đoạn code cũ của em vẫn dùng đây ạ:
PHP:
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 Danhsach_Thauphu()
  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 = "Ma TP": RangeAddress = "B2:O2"
    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 = Sheet3.Range("A60000").End(xlUp).Offset(1)
          Target.Resize(UBound(aRes, 1) + 1, UBound(aRes, 2) + 1).Value = aRes
        End If
      End If
    Next
        Cells.Select
         Range("A8").Activate
         Selection.EntireColumn.Hidden = False
         Range("A9:A10").Select
         MsgBox "HOÀN THÀNH!"
  End If
End Sub
Các bác giúp em với nhé, em cảm ơn nhiều ạ -=.,,

Tôi chỉ thêm đường dẫn vào, chuyện còn lại bạn viết code để chuyển đường dẫn đó thành liên kết nhé.

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 [SIZE=4][COLOR=#ff0000][B]'" & FileName & "',[/B][/COLOR][/SIZE]* 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 Danhsach_Thauphu()
  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 = "Ma TP": RangeAddress = "B2:O2"
    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 = Sheet3.Range("A60000").End(xlUp).Offset(1)
          Target.Resize(UBound(aRes, 1) + 1, UBound(aRes, 2) + 1).Value = aRes
        End If
      End If
    Next
        Cells.Select
         Range("A8").Activate
         Selection.EntireColumn.Hidden = False
         Range("A9:A10").Select
         MsgBox "HOÀN THÀNH!"
  End If
End Sub
 
Em cần thêm tên file đã ghép vào 1 cột mới ở mỗi dòng trong file tổng hợp. Các anh chị giúp em với. Thanks
 

Bài viết mới nhất

Back
Top Bottom