Lấy dữ liệu thô từ nhiều file báo cáo tổng hợp về 1 file

Liên hệ QC

alex-luu

Thành viên thường trực
Tham gia
10/3/15
Bài viết
300
Được thích
52
Chào các anh chị.

Em muốn tạo 1 button, khi click vào, nó sẽ hiện ra bảng hỏi đường dẫn đến các file report, sau khi mình chỉ đường dẫn (bằng cách chọn tô đen nhiều file report) và nhấn ok thì nó sẽ vào Sheet 1 của file report thứ 1, lấy dữ liệu từ ô A9:F20000 ; J9:K20000 ; N9:N20000 rồi dán (paste value) vào sheet lấy Report của file tổng hợp .
Xong rồi thì tiếp tục vào sheet 2 của file report thứ 1, cũng làm tương tự, dán xuống hàng dưới cùng.
Rồi tiếp tục tới sheet 3 của file report thứ 1..

Sau khi hết sheet thì tiếp tục làm đến file report thứ 2, cũng làm y như vậy, dữ liệu cứ dán tiếp tục từ dòng cuối cùng cho đến hết các file report thì dừng.

Chú ý : paste Value nhé,

1622734567934.png
Nhờ các anh chị trên diễn đàn viết giúp em đoạn code để đỡ phải làm thủ công ạ.
Em cảm ơn.
 

File đính kèm

  • Report 1.xlsx
    10.9 KB · Đọc: 7
  • Report 2.xlsx
    9.7 KB · Đọc: 5
  • tong hop.xlsx
    12.1 KB · Đọc: 5
Lần chỉnh sửa cuối:
Tôi thích cách trình bày rành mạch như bạn.
 
Chào các anh chị.

Em muốn tạo 1 button, khi click vào, nó sẽ hiện ra bảng hỏi đường dẫn đến các file report.
Sau đó nó sẽ vào Sheet 1 của file report thứ 1, lấy dữ liệu từ ô A9:F20000 ; J9:K20000 ; N9:N20000 dán vào sheet lấy Report của file tổng hợp .
Xong rồi thì tiếp tục vào sheet 2 của file report thứ 1, cũng làm tương tự, dán xuống hàng dưới cùng.
Rồi tiếp tục tới sheet 3 của file report thứ 1..

Sau khi hết sheet thì tiếp tục làm đến file report thứ 2, cũng làm y như vậy, dữ liệu cứ dán tiếp tục từ dòng cuối cùng cho đến hết các file report thì dừng.

View attachment 260000
Nhờ các anh chị trên diễn đàn viết giúp em đoạn code để đỡ phải làm thủ công ạ.
Em cảm ơn.
"Em muốn tạo 1 button, khi click vào, nó sẽ hiện ra bảng hỏi đường dẫn đến các file report." Sau đó bạn làm gì ?
 
"Em muốn tạo 1 button, khi click vào, nó sẽ hiện ra bảng hỏi đường dẫn đến các file report." Sau đó bạn làm gì ?
Dạ, sau khi mình click vào button, nó hỏi mình đường dẫn đến các file report, mình chỉ đường dẫn xong, nó sẽ lần lượt mở file report thứ 1, vào sheet 1 của file report đó, copy dữ liệu từ ô A9:F20000 ; J9:K20000 ; N9:N20000, rồi dán vào sheet lấy report của file tổng hợp.
Xong rồi thì lại tiếp tục, vào sheet 2 của file report thứ 1, cũng tiêp tục lấy dữ liệu từ ô A9:F20000 ; J9:K20000 ; N9:N20000, dán xuống hàng cuối cùng của sheet Lấy report trong file tổng hợp.... tiếp tục tới hết thì lại qua file report thứ 2....
Hiện nay mình đang phải làm thủ công, mất thời gian nhiều lắm

Lưu ý : paste value nha,
cảm ơn bạn, bạn làm giúp mình nhé
 
Dạ, sau khi mình click vào button, nó hỏi mình đường dẫn đến các file report, mình chỉ đường dẫn xong, nó sẽ lần lượt mở file report thứ 1, vào sheet 1 của file report đó, copy dữ liệu từ ô A9:F20000 ; J9:K20000 ; N9:N20000, rồi dán vào sheet lấy report của file tổng hợp.
Xong rồi thì lại tiếp tục, vào sheet 2 của file report thứ 1, cũng tiêp tục lấy dữ liệu từ ô A9:F20000 ; J9:K20000 ; N9:N20000, dán xuống hàng cuối cùng của sheet Lấy report trong file tổng hợp.... tiếp tục tới hết thì lại qua file report thứ 2....
Hiện nay mình đang phải làm thủ công, mất thời gian nhiều lắm

Lưu ý : paste value nha,
cảm ơn bạn, bạn làm giúp mình nhé
Bạn tham khảo..
 

File đính kèm

  • 1 tong hop.xlsm
    21.3 KB · Đọc: 14
Cảm ơn bạn rất nhiều, nhưng bạn ơi cho mình hỏi, bạn lấy hết nguyên vùng từ A9:N1000000 là chưa đúng ý mình rồi,
chỉ lấy dữ liệu từ ô A9:F20000 ; J9:K20000 ; N9:N20000 thôi, những chỗ khác có dữ liệu khác, nếu bê nguyên vùng lớn như bạn thì file mình bị sai và sẽ rất nặng file, mình cố gắng giảm dung lượng file xuống thấp nhất bằng cách chỉ lấy những dữ liệu cần thiết thôi, không lấy nguyên vùng lớn đến vậy đâu
Bạn giúp mình lần nữa nhé. Cảm ơn bạn
 
Lần chỉnh sửa cuối:
Cảm ơn bạn rất nhiều, nhưng bạn ơi cho mình hỏi, bạn lấy hết nguyên vùng từ A9:N1000000 là chưa đúng ý mình rồi,
chỉ lấy dữ liệu từ ô A9:F20000 ; J9:K20000 ; N9:N20000 thôi, những chỗ khác có dữ liệu khác, nếu bê nguyên vùng lớn như bạn thì file mình bị sai
Để mình chỉnh lại một chút.
Bài đã được tự động gộp:

Cảm ơn bạn rất nhiều, nhưng bạn ơi cho mình hỏi, bạn lấy hết nguyên vùng từ A9:N1000000 là chưa đúng ý mình rồi,
chỉ lấy dữ liệu từ ô A9:F20000 ; J9:K20000 ; N9:N20000 thôi, những chỗ khác có dữ liệu khác, nếu bê nguyên vùng lớn như bạn thì file mình bị sai và sẽ rất nặng file, mình cố gắng giảm dung lượng file xuống thấp nhất bằng cách chỉ lấy những dữ liệu cần thiết thôi, không lấy nguyên vùng lớn đến vậy đâu
Bạn giúp mình lần nữa nhé. Cảm ơn bạn
Bạn kiểm tra lại nhé, 1.000.000 là vùng xóa thôi bạn.
Mình chỉnh đúng đến dòng 20.000 cho bạn rồi đấy.
 

File đính kèm

  • 1 tong hop.xlsm
    21.8 KB · Đọc: 12
Lần chỉnh sửa cuối:
Chào các anh chị.

Em muốn tạo 1 button, khi click vào, nó sẽ hiện ra bảng hỏi đường dẫn đến các file report, sau khi mình chỉ đường dẫn (bằng cách chọn tô đen nhiều file report) và nhấn ok thì nó sẽ vào Sheet 1 của file report thứ 1, lấy dữ liệu từ ô A9:F20000 ; J9:K20000 ; N9:N20000 rồi dán (paste value) vào sheet lấy Report của file tổng hợp .
Xong rồi thì tiếp tục vào sheet 2 của file report thứ 1, cũng làm tương tự, dán xuống hàng dưới cùng.
Rồi tiếp tục tới sheet 3 của file report thứ 1..

Sau khi hết sheet thì tiếp tục làm đến file report thứ 2, cũng làm y như vậy, dữ liệu cứ dán tiếp tục từ dòng cuối cùng cho đến hết các file report thì dừng.

Chú ý : paste Value nhé,

View attachment 260000
Nhờ các anh chị trên diễn đàn viết giúp em đoạn code để đỡ phải làm thủ công ạ.
Em cảm ơn.
Chạy sub XYZ
Mã:
Sub XYZ()
  Dim aFile, StrFolder$, cn As Object, eRow&, n&
 
  Application.ScreenUpdating = False
  StrFolder = Get_Folder("")
  If StrFolder = Empty Then MsgBox "Phai chon thu muc chua file nguon!": Exit Sub
  aFile = Get_FileList(StrFolder)
  If TypeName(aFile) <> "String()" Then MsgBox "Khong tim thay file nguon!": Exit Sub
  On Error Resume Next
  With Sheet1 'Xoa du lieu
    eRow = .Range("A" & Rows.Count).End(xlUp).Row
    If eRow > 8 Then .Range("A9:N" & eRow).ClearContents
  End With
  Set cn = CreateObject("ADODB.Connection")
  For n = 1 To UBound(aFile)
    cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & aFile(n) & ";Extended Properties=""Excel 12.0;HDR=No"";"
    Call CopyDuLieu(cn)
    cn.Close
  Next n
  Set cn = Nothing: On Error GoTo 0
  Application.ScreenUpdating = True
End Sub

Private Sub CopyDuLieu(cn)
  Dim aSheet, aAddress, strSQL$, eRow&
 
  aSheet = Array("Sheet1$", "Sheet2$", "Sheet3$")
  aAddress = Array("A9:F20000", "J9:K20000", "N9:N20000")
  With Sheet1
    For i = 0 To 2
      eRow = .Range("A" & Rows.Count).End(xlUp).Row
      For r = 0 To 2
        strSQL = "select * from [" & aSheet(i) & aAddress(r) & "] where f1 is not null"
        .Range(Mid(aAddress(r), 1, 1) & eRow + 1).CopyFromRecordset cn.Execute(strSQL)
      Next r
    Next i
  End With
End Sub

Function Get_Folder(strPath As String) As String
  With Application.FileDialog(msoFileDialogFolderPicker)
    .Title = "Chon Folder chua các file cân tông hop"
    .AllowMultiSelect = False
    .InitialFileName = strPath
    If .Show = -1 Then Get_Folder = .SelectedItems(1)
  End With
End Function

Function Get_FileList(ByVal StrFolder As String) As Variant
  Dim fso As Object, ObjFile As Object, S, Arr$(), Res$(), k&, stt, j&, n&
  Set fso = CreateObject("Scripting.FileSystemObject")
  ReDim Arr(1 To 1)
  With fso.GetFolder(StrFolder)
    For Each ObjFile In .Files
      If fso.GetExtensionName(ObjFile) Like "xlsx" Then
        If Mid(ObjFile.Name, 1, 1) <> "~" Then
          S = Split(" " & fso.GetBaseName(ObjFile.Name), " ")
          stt = S(UBound(S))
          If IsNumeric(stt) Then
            k = k + 1
            stt = CLng(stt)
            If stt > UBound(Arr) Then ReDim Preserve Arr(1 To stt)
            Arr(stt) = ObjFile.Path
          End If
        End If
      End If
    Next
  End With
  If k Then
    ReDim Res(1 To k)
    For j = 1 To UBound(Arr)
      If Arr(j) <> Empty Then
        n = n + 1
        Res(n) = Arr(j)
      End If
    Next j
    Get_FileList = Res
  End If
  Set fso = Nothing: Set ObjFile = Nothing
End Function
 
Để mình chỉnh lại một chút.
Bài đã được tự động gộp:


Bạn kiểm tra lại nhé, 1.000.000 là vùng xóa thôi bạn.
Mình chỉnh đúng đến dòng 20.000 cho bạn rồi đấy.
Tuyệt vời. Cảm ơn bạn rất nhiều
Bài đã được tự động gộp:

Chạy sub XYZ
Mã:
Sub XYZ()
  Dim aFile, StrFolder$, cn As Object, eRow&, n&
 
  Application.ScreenUpdating = False
  StrFolder = Get_Folder("")
  If StrFolder = Empty Then MsgBox "Phai chon thu muc chua file nguon!": Exit Sub
  aFile = Get_FileList(StrFolder)
  If TypeName(aFile) <> "String()" Then MsgBox "Khong tim thay file nguon!": Exit Sub
  On Error Resume Next
  With Sheet1 'Xoa du lieu
    eRow = .Range("A" & Rows.Count).End(xlUp).Row
    If eRow > 8 Then .Range("A9:N" & eRow).ClearContents
  End With
  Set cn = CreateObject("ADODB.Connection")
  For n = 1 To UBound(aFile)
    cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & aFile(n) & ";Extended Properties=""Excel 12.0;HDR=No"";"
    Call CopyDuLieu(cn)
    cn.Close
  Next n
  Set cn = Nothing: On Error GoTo 0
  Application.ScreenUpdating = True
End Sub

Private Sub CopyDuLieu(cn)
  Dim aSheet, aAddress, strSQL$, eRow&
 
  aSheet = Array("Sheet1$", "Sheet2$", "Sheet3$")
  aAddress = Array("A9:F20000", "J9:K20000", "N9:N20000")
  With Sheet1
    For i = 0 To 2
      eRow = .Range("A" & Rows.Count).End(xlUp).Row
      For r = 0 To 2
        strSQL = "select * from [" & aSheet(i) & aAddress(r) & "] where f1 is not null"
        .Range(Mid(aAddress(r), 1, 1) & eRow + 1).CopyFromRecordset cn.Execute(strSQL)
      Next r
    Next i
  End With
End Sub

Function Get_Folder(strPath As String) As String
  With Application.FileDialog(msoFileDialogFolderPicker)
    .Title = "Chon Folder chua các file cân tông hop"
    .AllowMultiSelect = False
    .InitialFileName = strPath
    If .Show = -1 Then Get_Folder = .SelectedItems(1)
  End With
End Function

Function Get_FileList(ByVal StrFolder As String) As Variant
  Dim fso As Object, ObjFile As Object, S, Arr$(), Res$(), k&, stt, j&, n&
  Set fso = CreateObject("Scripting.FileSystemObject")
  ReDim Arr(1 To 1)
  With fso.GetFolder(StrFolder)
    For Each ObjFile In .Files
      If fso.GetExtensionName(ObjFile) Like "xlsx" Then
        If Mid(ObjFile.Name, 1, 1) <> "~" Then
          S = Split(" " & fso.GetBaseName(ObjFile.Name), " ")
          stt = S(UBound(S))
          If IsNumeric(stt) Then
            k = k + 1
            stt = CLng(stt)
            If stt > UBound(Arr) Then ReDim Preserve Arr(1 To stt)
            Arr(stt) = ObjFile.Path
          End If
        End If
      End If
    Next
  End With
  If k Then
    ReDim Res(1 To k)
    For j = 1 To UBound(Arr)
      If Arr(j) <> Empty Then
        n = n + 1
        Res(n) = Arr(j)
      End If
    Next j
    Get_FileList = Res
  End If
  Set fso = Nothing: Set ObjFile = Nothing
End Function
Cảm ơn bạn rất nhiều. cách của bạn rât hay. đúng như ý mình luôn
 
Lần chỉnh sửa cuối:
Chạy sub XYZ
Mã:
Sub XYZ()
  Dim aFile, StrFolder$, cn As Object, eRow&, n&
 
  Application.ScreenUpdating = False
  StrFolder = Get_Folder("")
  If StrFolder = Empty Then MsgBox "Phai chon thu muc chua file nguon!": Exit Sub
  aFile = Get_FileList(StrFolder)
  If TypeName(aFile) <> "String()" Then MsgBox "Khong tim thay file nguon!": Exit Sub
  On Error Resume Next
  With Sheet1 'Xoa du lieu
    eRow = .Range("A" & Rows.Count).End(xlUp).Row
    If eRow > 8 Then .Range("A9:N" & eRow).ClearContents
  End With
  Set cn = CreateObject("ADODB.Connection")
  For n = 1 To UBound(aFile)
    cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & aFile(n) & ";Extended Properties=""Excel 12.0;HDR=No"";"
    Call CopyDuLieu(cn)
    cn.Close
  Next n
  Set cn = Nothing: On Error GoTo 0
  Application.ScreenUpdating = True
End Sub

Private Sub CopyDuLieu(cn)
  Dim aSheet, aAddress, strSQL$, eRow&
 
  aSheet = Array("Sheet1$", "Sheet2$", "Sheet3$")
  aAddress = Array("A9:F20000", "J9:K20000", "N9:N20000")
  With Sheet1
    For i = 0 To 2
      eRow = .Range("A" & Rows.Count).End(xlUp).Row
      For r = 0 To 2
        strSQL = "select * from [" & aSheet(i) & aAddress(r) & "] where f1 is not null"
        .Range(Mid(aAddress(r), 1, 1) & eRow + 1).CopyFromRecordset cn.Execute(strSQL)
      Next r
    Next i
  End With
End Sub

Function Get_Folder(strPath As String) As String
  With Application.FileDialog(msoFileDialogFolderPicker)
    .Title = "Chon Folder chua các file cân tông hop"
    .AllowMultiSelect = False
    .InitialFileName = strPath
    If .Show = -1 Then Get_Folder = .SelectedItems(1)
  End With
End Function

Function Get_FileList(ByVal StrFolder As String) As Variant
  Dim fso As Object, ObjFile As Object, S, Arr$(), Res$(), k&, stt, j&, n&
  Set fso = CreateObject("Scripting.FileSystemObject")
  ReDim Arr(1 To 1)
  With fso.GetFolder(StrFolder)
    For Each ObjFile In .Files
      If fso.GetExtensionName(ObjFile) Like "xlsx" Then
        If Mid(ObjFile.Name, 1, 1) <> "~" Then
          S = Split(" " & fso.GetBaseName(ObjFile.Name), " ")
          stt = S(UBound(S))
          If IsNumeric(stt) Then
            k = k + 1
            stt = CLng(stt)
            If stt > UBound(Arr) Then ReDim Preserve Arr(1 To stt)
            Arr(stt) = ObjFile.Path
          End If
        End If
      End If
    Next
  End With
  If k Then
    ReDim Res(1 To k)
    For j = 1 To UBound(Arr)
      If Arr(j) <> Empty Then
        n = n + 1
        Res(n) = Arr(j)
      End If
    Next j
    Get_FileList = Res
  End If
  Set fso = Nothing: Set ObjFile = Nothing
End Function
Bạn ơi, cho mình hỏi để hiểu thêm 1 chút, khi mình chọn thư mục ( mà không cần chọn từng file) thì nếu trong thư mục đó có nhiều file khác nữa ngoài các file report thì sao ? làm sao code biết lấy file nào ?
Mình có thử và thấy : các file report phải đặt cùng tên , chỉ khác số kiểu rep 1.xlsx ; rep 2.xlsx ; rep 3.xlsx ... thì nó hiểu, nhưng nếu đặt khác nhau thì nó không hiểu ; VD : thư mục report của mình nó có các file report ND1.xlsx ; bao cao HP.xlsx ;... thì nó không hiểu
 
Bạn ơi, cho mình hỏi để hiểu thêm 1 chút, khi mình chọn thư mục ( mà không cần chọn từng file) thì nếu trong thư mục đó có nhiều file khác nữa ngoài các file report thì sao ? làm sao code biết lấy file nào ?
Mình có thử và thấy : các file report phải đặt cùng tên , chỉ khác số kiểu rep 1.xlsx ; rep 2.xlsx ; rep 3.xlsx ... thì nó hiểu, nhưng nếu đặt khác nhau thì nó không hiểu ; VD : thư mục report của mình nó có các file report ND1.xlsx ; bao cao HP.xlsx ;... thì nó không hiểu
" lần lượt mở file report thứ 1, ... qua file report thứ 2 ..."
Làm sao biết được là cần mở file nào? hay là lấy hết?
Mở từng file theo thứ tự hay file nào mở trước cũng được?
 
" lần lượt mở file report thứ 1, ... qua file report thứ 2 ..."
Làm sao biết được là cần mở file nào? hay là lấy hết?
Mở từng file theo thứ tự hay file nào mở trước cũng được?
À, hay là mình thống nhất vậy được, mình sẽ tạo 1 thư mục report (chỉ để chứa đúng mấy file report cần lấy dữ liệu thôi), tên thì đặt sao cũng được, miễn là có đuôi. xls hoặc xlsx,
Khi mình chỉ đường dẫn đến thư mục report, thì mặc định nó sẽ lấy hết tất cả các 1 file có trong thư mục này, file nào trước cũng được, rồi import vào
 
À, hay là mình thống nhất vậy được, mình sẽ tạo 1 thư mục report (chỉ để chứa đúng mấy file report cần lấy dữ liệu thôi), tên thì đặt sao cũng được, miễn là có đuôi. xls hoặc xlsx,
Khi mình chỉ đường dẫn đến thư mục report, thì mặc định nó sẽ lấy hết tất cả các 1 file có trong thư mục này, file nào trước cũng được, rồi import vào
Lấy toàn bộ file .xlsx và .xls trong thư mục chỉ định
Chỉnh ]Function Get_FileList
Mã:
Function Get_FileList(ByVal StrFolder As String) As Variant
  Dim fso As Object, ObjFile As Object, S, Arr$(), Res$(), extFile$, k&, stt, j&, n&
  Set fso = CreateObject("Scripting.FileSystemObject")
  ReDim Arr(1 To 1)
  With fso.GetFolder(StrFolder)
    For Each ObjFile In .Files
      extFile = fso.GetExtensionName(ObjFile)
      If extFile Like "xlsx" Or extFile Like "xls" Then
        If Mid(ObjFile.Name, 1, 1) <> "~" Then
          k = k + 1
          ReDim Preserve Res(1 To k)
          Res(k) = ObjFile.Path
        End If
      End If
    Next
  End With
  If k Then Get_FileList = Res
  Set fso = Nothing: Set ObjFile = Nothing
End Function
 
Lấy toàn bộ file .xlsx và .xls trong thư mục chỉ định
Chỉnh ]Function Get_FileList
Mã:
Function Get_FileList(ByVal StrFolder As String) As Variant
  Dim fso As Object, ObjFile As Object, S, Arr$(), Res$(), extFile$, k&, stt, j&, n&
  Set fso = CreateObject("Scripting.FileSystemObject")
  ReDim Arr(1 To 1)
  With fso.GetFolder(StrFolder)
    For Each ObjFile In .Files
      extFile = fso.GetExtensionName(ObjFile)
      If extFile Like "xlsx" Or extFile Like "xls" Then
        If Mid(ObjFile.Name, 1, 1) <> "~" Then
          k = k + 1
          ReDim Preserve Res(1 To k)
          Res(k) = ObjFile.Path
        End If
      End If
    Next
  End With
  If k Then Get_FileList = Res
  Set fso = Nothing: Set ObjFile = Nothing
End Function
perfect. Hoàn hảo rồi. Cảm ơn bạn nhiều lắm
 
Web KT
Back
Top Bottom