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

Liên hệ QC
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
 
Web KT

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

Back
Top Bottom