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

Liên hệ QC

Bình22222

Thành viên mới
Tham gia
17/9/19
Bài viết
18
Được thích
2
Chào mọi người.

Nhờ mọi người giúp mình vấn đề gộp các file excel riêng lẻ vào 1 sheet trong file excel.
Mình đã lên các diễn đàn và youtube xem hướng dẫn dùng VBA giải quết cho vấn đề này, nhưng mình không làm được cho trường hợp của mình, rất mong được mọi người giúp đỡ.

Trong tháng mình có khoảng hơn 100 file excel ghi nhận báo cáo kiểm tra chất lượng sản phẩm, mỗi file có 4 sheet.
Mình cần gộp sheet tên "ket qua KT " ở các file excel khác nhau vào chung 1 sheet, dòng bắt đầu lấy dữ liệu là dòng 12.
Lưu ý trong file excel của mình:
- dòng 4 đến dòng 8 bị ẩn và có chứa công thức liên kết với các sheet trong file excel.
- vùng G12:L12 sẽ bị thay đổi dữ liệu theo từng file excel.
- số dòng chứa dữ liệu khác nhau với mỗi file excel khác nhau (dao động từ 30 tới 300 dòng).
- các file excel sẽ được cập nhật dữ liệu theo ngày.

Cám ơn mọi người và diễn đàn.
 

File đính kèm

  • File báo cáo.rar
    1.1 MB · Đọc: 27
Chào mọi người.

Nhờ mọi người giúp mình vấn đề gộp các file excel riêng lẻ vào 1 sheet trong file excel.
Mình đã lên các diễn đàn và youtube xem hướng dẫn dùng VBA giải quết cho vấn đề này, nhưng mình không làm được cho trường hợp của mình, rất mong được mọi người giúp đỡ.

Trong tháng mình có khoảng hơn 100 file excel ghi nhận báo cáo kiểm tra chất lượng sản phẩm, mỗi file có 4 sheet.
Mình cần gộp sheet tên "ket qua KT " ở các file excel khác nhau vào chung 1 sheet, dòng bắt đầu lấy dữ liệu là dòng 12.
Lưu ý trong file excel của mình:
- dòng 4 đến dòng 8 bị ẩn và có chứa công thức liên kết với các sheet trong file excel.
- vùng G12:L12 sẽ bị thay đổi dữ liệu theo từng file excel.
- số dòng chứa dữ liệu khác nhau với mỗi file excel khác nhau (dao động từ 30 tới 300 dòng).
- các file excel sẽ được cập nhật dữ liệu theo ngày.

Cám ơn mọi người và diễn đàn.
Bạn thử:
PHP:
Sub Test()
    Dim Nguon, F, LR1&, LR2&
    Dim Dich As Worksheet, ActivelistWB As Workbook
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    Set Dich = Sheets("tonghop")
    Nguon = Application.GetOpenFilename(FileFilter:="Excel Files (*.xls),*.xls*", _
                                        Title:="Select File", _
                                        MultiSelect:=True)
    If VarType(Nguon) = vbBoolean Then
        If Not F Then Exit Sub
    End If
    For Each F In Nguon
        Set ActivelistWB = Workbooks.Open(F)
        LR2 = Dich.Range("A" & Rows.Count).End(xlUp).Row
        LR1 = Sheets("ket qua KT ").Range("A65000").End(3).Row
        ActivelistWB.Sheets("ket qua KT ").Range("A13:CZ" & LR1).Copy
        Dich.Range("A" & LR2 + 1).PasteSpecial xlPasteValues
        ActivelistWB.Close False
        Application.CutCopyMode = False
    Next
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
End Sub
 
Upvote 0
Cám ơn phulien1902.

Khi chạy file thì bị lỗi như hình nha bạn
Bạn thử:
PHP:
Sub Test()
    Dim Nguon, F, LR1&, LR2&
    Dim Dich As Worksheet, ActivelistWB As Workbook
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    Set Dich = Sheets("tonghop")
    Nguon = Application.GetOpenFilename(FileFilter:="Excel Files (*.xls),*.xls*", _
                                        Title:="Select File", _
                                        MultiSelect:=True)
    If VarType(Nguon) = vbBoolean Then
        If Not F Then Exit Sub
    End If
    For Each F In Nguon
        Set ActivelistWB = Workbooks.Open(F)
        LR2 = Dich.Range("A" & Rows.Count).End(xlUp).Row
        LR1 = Sheets("ket qua KT ").Range("A65000").End(3).Row
        ActivelistWB.Sheets("ket qua KT ").Range("A13:CZ" & LR1).Copy
        Dich.Range("A" & LR2 + 1).PasteSpecial xlPasteValues
        ActivelistWB.Close False
        Application.CutCopyMode = False
    Next
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
End Sub
 

File đính kèm

  • hinh 1.PNG
    hinh 1.PNG
    29 KB · Đọc: 29
Upvote 0
Bạn sử dụng code dưới, Hỏi thêm nữa thì tôi đành "lùi bước".

1. Bạn muốn tự động thì sửa như sau:
Sửa đoạn: ListAllFiles ThisWorkbook.Path, , Files, False, ".xls*"
ThisWorkbook.Path là path hiện tại của Workbook, có thể sửa thành "D:\Path" Path của bạn muốn.

2. Bạn muốn chọn File thì xóa: ListAllFiles ThisWorkbook.Path, , Files, False, ".xls*"
và chèn:
Files= Application.GetOpenFilename(FileFilter:="Excel Files (*.xls),*.xls*", _
Title:="Select File", _
MultiSelect:=True)
--------------------------
Tham khảo thêm các hàm lấy đường dẫn file và folder do tôi viết tại đây

Bạn có thể ủng hộ tôi tại đây

PHP:
Sub Test()
  Dim File, Files, LR&, LR_KQ&, LR_TH&, LC%, R&, C%, K&, Arr, tArr()
  Dim TH As Worksheet, WS As Worksheet, WB As Workbook
  Application.ScreenUpdating = False
  Application.DisplayAlerts = False
  Const CR = 12, nWS = "TongHop"
  On Error Resume Next
  Set TH = ThisWorkbook.Worksheets(nWS)
  If Err Then: Set TH = Application.Workbooks.Add: TH.Name = nWS

  R = TH.Range("A" & Rows.Count).End(xlUp).Row
  If R > CR Then TH.Range("A" & CR + 1).Resize(Rows.Count - CR, 1).ClearContents
  Err.Clear
  ListAllFiles ThisWorkbook.Path, , Files, False, ".xls*"
  If Not IsArray(Files) Then Exit Sub
  For Each File In Files
    Set WS = Nothing
    Set WB = Application.Workbooks(File)
    If Err Then Set WB = Application.Workbooks.Open(File, , True)
    Err.Clear
    For Each WS In WB.Worksheets
      If Not WS.Name Like "*(*)*" And LCase(WS.Name) Like "ket qua kt*" Then Exit For
      Set WS = Nothing
    Next WS
    If Not WS Is Nothing Then
      LR_KQ = WS.Range("A" & Rows.Count).End(3).Row - CR
      If LC <= 0 Then LC = WS.Cells(CR - 1, Columns.Count).End(xlToLeft).Column
      If LR_KQ > 0 And LC > 0 Then
        If LR = 0 Then
          Application.CutCopyMode = False
          WS.Range("A" & CR - 3).Resize(4, LC).Copy TH.Range("A" & CR - 3).Resize(4, LC)
          TH.Range("A" & CR - 3).Resize(4, LC).value = TH.Range("A" & CR - 3).Resize(4, LC).value2
          Application.CutCopyMode = True
        End If
        ReDim Preserve tArr(1 To LC, 1 To LR + LR_KQ)
        Arr = WS.Range("A" & CR + 1).Resize(LR_KQ, LC).Value2
        For C = 1 To LC
          For R = LR + 1 To LR + LR_KQ
            tArr(C, R) = Arr(R - LR, C)
            If C = 1 Then: K = K + 1: tArr(C, R) = K
          Next R
        Next C
        LR = LR + LR_KQ
      End If
    End If
    WB.Close False
    Set WB = Nothing
  Next
  On Error GoTo 0
  If LR > 0 And LC > 0 Then
    ReDim Total(1 To LR, 1 To LC)
    For R = 1 To LR: For C = 1 To LC
        Total(R, C) = tArr(C, R)
    Next C, R
    TH.Range("A" & CR + 1).Resize(LR, LC).Value = Total
    TH.Activate
  End If
  Set WS = Nothing: Set TH = Nothing
  Application.ScreenUpdating = True
  Application.DisplayAlerts = True
End Sub

Sub ListAllFiles(ByVal aFolder, _
        Optional ByRef FSO As Object, _
        Optional ByRef Files As Variant, _
        Optional ByVal IncludeSubfolders As Boolean, _
        Optional ByVal Types = "*.*", _
        Optional ByVal NameTypes = "", _
        Optional ByVal iShortPart As Boolean)
  If TypeName(aFolder) = "String" Then aFolder = Array(aFolder)
  Dim I&, K&, T$, T2$
  Dim aTypes(), Arr(), dArr()
  Dim SF, Item, Folder, sFolder
  I = -1
  If TypeName(NameTypes) = "String" Then
    If NameTypes <> vbNullString Then I=I+1:ReDim aTypes(I): aTypes(I) = LCase(NameTypes)
  Else
    ReDim aTypes(UBound(NameTypes))
    For I = LBound(Files) To UBound(Files): Arr(I) = LCase(NameTypes(I)): Next I
  End If
  If TypeName(Types) = "String" Then
    If Types <> vbNullString Then
      I = I + 1
      ReDim Preserve aTypes(I+1)
      aTypes(I+1) = "*" & LCase(Types)
    End If
  Else
    ReDim  Preserve aTypes(UBound(Types) + IIf(I = -1, 0, I))
    For K = LBound(Types) To UBound(Types): aTypes(K + IIf(I = -1, 0, I)) = "*" & LCase(Types(K)): Next K
  End If
  If FSO Is Nothing Then Set FSO = CreateObject("Scripting.FileSystemObject")
  I = -1: K = 0
  If IsArray(Files) Then
    ReDim Arr(UBound(Files))
    For I = LBound(Files) To UBound(Files): Arr(I) = Files(I): Next I
  End If
  For Each Folder In aFolder
    If FSO.FolderExists(Folder) Then
      Set sFolder = FSO.GetFolder(Folder)
      For Each Item In sFolder.Files
        T = vbNullString: T = LCase(Item.Name)
        T2 = vbNullString: T2 = LCase(Item.Type)
        For Each SF In aTypes
          If Left(T, 1) <> "~" And (T Like SF Or T2 Like SF) Then
            I = I + 1: ReDim Preserve Arr(I): Arr(I) = IIf(iShortPart, Item.ShortPath, Item.Path)
            Exit For
          End If
        Next SF
      Next Item
      If IncludeSubfolders Then
        For Each SF In sFolder.SubFolders
          ReDim Preserve dArr(K): dArr(K) = SF.Path: K = K + 1
        Next SF
      End If
    End If
  Next Folder
  Files = Arr
  If IncludeSubfolders Then
    ListAllFiles dArr, FSO, Files, True, Types, NameTypes, iShortPart
  End If
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Gửi bạn file báo cáo cập nhật.
Rõ ràng chiều nay & buổi tối tôi còn cập nhật được dữ liệu của bạn. Vậy mà giờ thì không thể cập nhật, không biết tại sao?
Bác nào ngang qua có thể cho tôi biết lý do không nhỉ?
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn sử dụng code dưới, Hỏi thêm nữa thì tôi đành "lùi bước".
--------------------------
Tham khảo thêm các hàm lấy đường dẫn file và folder do tôi viết tại đây

Bạn có thể ủng hộ tôi tại đây

PHP:
Sub Test()
  Dim File, Files, LR&, LR_KQ&, LR_TH&, LC%, R&, C%, K&, Arr, tArr()
  Dim TH As Worksheet, WS As Worksheet, WB As Workbook
  Application.ScreenUpdating = False
  Application.DisplayAlerts = False
  Const CR = 12, nWS = "TongHop"
  On Error Resume Next
  Set TH = ThisWorkbook.Worksheets(nWS)
  If Err Then: Set TH = Application.Workbooks.Add: TH.Name = nWS

  R = TH.Range("A" & Rows.Count).End(xlUp).Row
  If R > CR Then TH.Range("A" & CR + 1).Resize(Rows.Count - CR, 1).ClearContents
  Err.Clear
  ListAllFiles ThisWorkbook.Path, , Files, False, ".xlsx"
  If Not IsArray(Files) Then Exit Sub
  For Each File In Files
    Set WS = Nothing
    Set WB = Application.Workbooks(File)
    If Err Then Set WB = Application.Workbooks.Open(File, , True)
    Err.Clear
    For Each WS In WB.Worksheets
      If Not WS.Name Like "*(*)*" And LCase$(WS.Name) Like "ket qua kt*" Then Exit For
      Set WS = Nothing
    Next WS
    If Not WS Is Nothing Then
      LR_KQ = WS.Range("A" & Rows.Count).End(3).Row - CR
      If LC <= 0 Then LC = WS.Cells(CR - 1, Columns.Count).End(xlToLeft).Column
      If LR_KQ > 0 And LC > 0 Then
        If LR = 0 Then
          Application.CutCopyMode = False
          WS.Range("A" & CR - 3).Resize(4, LC).Copy TH.Range("A" & CR - 3).Resize(4, LC)
          Application.CutCopyMode = True
        End If
        ReDim Preserve tArr(1 To LC, 1 To LR + LR_KQ)
        Arr = WS.Range("A" & CR + 1).Resize(LR_KQ, LC).Value2
        For C = 1 To LC
          For R = LR + 1 To LR + LR_KQ
            tArr(C, R) = Arr(R - LR, C)
            If C = 1 Then: K = K + 1: tArr(C, R) = K
          Next R
        Next C
        LR = LR + LR_KQ
      End If
    End If
    WB.Close False
    Set WB = Nothing
  Next
  On Error GoTo 0
  If LR > 0 And LC > 0 Then
    ReDim Total(1 To LR, 1 To LC)
    For R = 1 To LR: For C = 1 To LC
        Total(R, C) = tArr(C, R)
    Next C, R
    TH.Range("A" & CR + 1).Resize(LR, LC).Value = Total
    TH.Activate
  End If
  Set WS = Nothing: Set TH = Nothing
  Application.ScreenUpdating = True
  Application.DisplayAlerts = True
End Sub

Sub ListAllFiles(ByVal aFolder, _
        Optional ByRef FSO As Object, _
        Optional ByRef Files As Variant, _
        Optional ByVal IncludeSubfolders As Boolean, _
        Optional ByVal Types = "*.*", _
        Optional ByVal NameTypes = "", _
        Optional ByVal iShortPart As Boolean)
  If TypeName(aFolder) = "String" Then aFolder = Array(aFolder)
  Dim I&, K&, T$, T2$
  Dim aTypes(), Arr(), dArr()
  Dim SF, Item, Folder, sFolder
  I = -1
  If TypeName(NameTypes) = "String" Then
    If NameTypes <> vbNullString Then ReDim aTypes(0): aTypes(0) = LCase$(NameTypes)
  Else
    ReDim aTypes(UBound(NameTypes))
    For I = LBound(Files) To UBound(Files): Arr(I) = LCase$(NameTypes(I)): Next I
  End If
  If TypeName(Types) = "String" Then
    ReDim aTypes(I + 1)
    aTypes(I + 1) = "*" & LCase$(Types)
  Else
    ReDim aTypes(UBound(Types) + IIf(I = -1, 0, I))
    For K = LBound(Types) To UBound(Types): aTypes(K + IIf(I = -1, 0, I)) = "*" & LCase$(Types(K)): Next K
  End If
  If FSO Is Nothing Then Set FSO = CreateObject("Scripting.FileSystemObject")
  I = -1: K = 0
  If IsArray(Files) Then
    ReDim Arr(UBound(Files))
    For I = LBound(Files) To UBound(Files): Arr(I) = Files(I): Next I
  End If
  For Each Folder In aFolder
    If FSO.FolderExists(Folder) Then
      Set sFolder = FSO.GetFolder(Folder)
      For Each Item In sFolder.Files
        T = vbNullString: T = LCase$(Item.Name)
        T2 = vbNullString: T2 = LCase$(Item.Type)
        For Each SF In aTypes
          If Left$(T, 1) <> "~" And (T Like SF Or T2 = SF) Then
            I = I + 1: ReDim Preserve Arr(I): Arr(I) = IIf(iShortPart, Item.ShortPath, Item.Path)
            Exit For
          End If
        Next SF
      Next Item
      If IncludeSubfolders Then
        For Each SF In sFolder.SubFolders
          ReDim Preserve dArr(K): dArr(K) = SF.Path: K = K + 1
        Next SF
      End If
    End If
  Next Folder
  Files = Arr
  If IncludeSubfolders Then
    ListAllFiles dArr, FSO, Files, True, Types, NameTypes, iShortPart
  End If
End Sub

Rõ ràng chiều nay & buổi tối tôi còn cập nhật được dữ liệu của bạn. Vậy mà giờ thì không thể cập nhật, không biết tại sao?
Bạn có thể dùng Code #8.

Mình đã thử các file 2 bạn gửi, tuy vẫn chưa chạy được nhưng rất cám ơn "phulien1902" giúp mình từ chiều đến giờ và "HeSanbi" nhiều nhe.
Huy vọng 1 vài ngày tiếp theo các thành viên trong diễn đàn sẽ giúp mình tiếp tục giải quyết vấn đề này.
 
Upvote 0
Mình đã thử các file 2 bạn gửi, tuy vẫn chưa chạy được nhưng rất cám ơn "phulien1902" giúp mình từ chiều đến giờ và "HeSanbi" nhiều nhe.
Huy vọng 1 vài ngày tiếp theo các thành viên trong diễn đàn sẽ giúp mình tiếp tục giải quyết vấn đề này.
Thôi bớt hy vọng đi. Nếu hai người này không giải quyết được thì ở đây không còn ai đủ sức cả.
 
Upvote 0
Rõ ràng chiều nay & buổi tối tôi còn cập nhật được dữ liệu của bạn. Vậy mà giờ thì không thể cập nhật, không biết tại sao?
Bác nào ngang qua có thể cho tôi biết lý do không nhỉ?

Vì trong tệp tin gửi ở bài #7 đâu có sheet nào tên là "tonghop" đâu.
 
Upvote 0
Vì trong tệp tin gửi ở bài #7 đâu có sheet nào tên là "tonghop" đâu.
Cảm ơn bạn đã trả lời.
Trong File CAPNHAT có Sheets("tonghop") mà bạn. Sáng nay tôi đến cơ quan, chạy lại Code hôm qua, dữ liệu lại cập nhật bình thường.
Chi tiết trong File.
 

File đính kèm

  • TONGHOP.xls
    84 KB · Đọc: 22
Upvote 0
Cảm ơn bạn đã trả lời.
Trong File CAPNHAT có Sheets("tonghop") mà bạn. Sáng nay tôi đến cơ quan, chạy lại Code hôm qua, dữ liệu lại cập nhật bình thường.
Chi tiết trong File.

Í lộn, code sẽ khác nhau ở Rows.Count. Máy bạn thử với file dữ liệu là xls chỉ có 65000 dòng, còn file dữ liệu của bạn kia là file xlsx thì Rows.Count trả về trên 1000 000 cơ, nhưng mà Sheets("tonghop") lại nằm trên file xls nên sẽ không có địa chỉ A1000000 nhé.
Tại sao dòng dưới bạn biết dùng Range("A65000") mà dòng trên lại xài Range("A" & Rows.Count) chi cho lỗi chơi vậy bạn ? hihi
 
Upvote 0
Í lộn, code sẽ khác nhau ở Rows.Count. Máy bạn thử với file dữ liệu là xls chỉ có 65000 dòng, còn file dữ liệu của bạn kia là file xlsx thì Rows.Count trả về trên 1000 000 cơ, nhưng mà Sheets("tonghop") lại nằm trên file xls nên sẽ không có địa chỉ A1000000 nhé.
Tại sao dòng dưới bạn biết dùng Range("A65000") mà dòng trên lại xài Range("A" & Rows.Count) chi cho lỗi chơi vậy bạn ? hihi


Nếu mình save as lại tất cả các file về ".xls" thì code của bạn "phulien1902" chạy được, nhưng như vây rất tốn thời gian với hơn 100 file.
Nhờ "AutoReply" và "phulien1902" giúp mình chỉnh lại code để cho file có thể chạy được trên định dạng ".xlsx" nhe.
Mình không biết gì về VBA nên mình thử sáng giờ mà file vẫn không chạy được với định dạng ".xlsx".
 
Upvote 0
Nếu mình save as lại tất cả các file về ".xls" thì code của bạn "phulien1902" chạy được, nhưng như vây rất tốn thời gian với hơn 100 file.
Nhờ "AutoReply" và "phulien1902" giúp mình chỉnh lại code để cho file có thể chạy được trên định dạng ".xlsx" nhe.
Mình không biết gì về VBA nên mình thử sáng giờ mà file vẫn không chạy được với định dạng ".xlsx".
Bạn thử thay:
PHP:
 Nguon = Application.GetOpenFilename(FileFilter:="Excel Files (*.xls),*.xls*", _
                                        Title:="Select File", _
                                        MultiSelect:=True)
bằng:
PHP:
 Nguon = Application.GetOpenFilename(FileFilter:="Excel Files (*.xlsx),*.xls*", _
                                        Title:="Select File", _
                                        MultiSelect:=True)

Và thay:
PHP:
LR1 = Sheets("ket qua KT ").Range("A65000").End(3).Row
bằng
PHP:
LR1 = Sheets("ket qua KT ").Range("A1000000").End(3).Row

Bạn thử đi, tôi không kiểm tra được, lý do cơ quan vẫn dùng Office 2003.
 
Upvote 0
Bạn thử thay:
PHP:
Nguon = Application.GetOpenFilename(FileFilter:="Excel Files (*.xls),*.xls*", _
                                        Title:="Select File", _
                                        MultiSelect:=True)
bằng:
PHP:
Nguon = Application.GetOpenFilename(FileFilter:="Excel Files (*.xlsx),*.xls*", _
                                        Title:="Select File", _
                                        MultiSelect:=True)

Và thay:
PHP:
LR1 = Sheets("ket qua KT ").Range("A65000").End(3).Row
bằng
PHP:
LR1 = Sheets("ket qua KT ").Range("A1000000").End(3).Row

Bạn thử đi, tôi không kiểm tra được, lý do cơ quan vẫn dùng Office 2003.

Cám ơn "phulien1902", lần này chỉ mở được 1 file excel đầu tiên trong folder.
Gửi bạn hình thông báo lỗi.hình 3.PNG
 
Upvote 0
Nếu mình save as lại tất cả các file về ".xls" thì code của bạn "phulien1902" chạy được, nhưng như vây rất tốn thời gian với hơn 100 file.
Nhờ "AutoReply" và "phulien1902" giúp mình chỉnh lại code để cho file có thể chạy được trên định dạng ".xlsx" nhe.
Mình không biết gì về VBA nên mình thử sáng giờ mà file vẫn không chạy được với định dạng ".xlsx".
Bạn thử cách này xem có nhanh hơn xíu nào không nhé
Lưu ý, bỏ chung File "Cập nhật" vào cùng folder chưa các file cần copy dữ liệu
Mã:
Function GetExcelConnection(ByVal Path As String, Optional ByVal Header As Boolean = True)
    Dim StrConn As String, ObjConn As Object, Pro As String, Ext As String
    Set ObjConn = CreateObject("ADODB.Connection")
    If Application.Version < 12 Then
        Pro = "Provider=Microsoft.JET.OLEDB.4.0;"
        Ext = ";Extended Properties=""Excel 8.0;"
    Else
        Pro = "Provider=Microsoft.ACE.OLEDB.12.0;"
        Ext = ";Extended Properties=""Excel 12.0;"
    End If
    StrConn = Pro & "Data Source=" & Path & Ext & "HDR=" & IIf(Header, "Yes", "No") & ";IMEX=1"";"
    ObjConn.Open StrConn
    Set GetExcelConnection = ObjConn
End Function

Sub Copy_DATA()
Dim ObjConn As Object, RS As Object, Files, arr()
Dim StrRequest As String, Path As String, i As Long, lr As Long

On Error Resume Next
Path = ThisWorkbook.Path
    With Sheets("tonghop")
    lr = .Range("DC1000").End(xlUp).Row
    arr = .Range("DC2:DC" & lr).Value
    .Range("A13:CZ60000").ClearContents
    .Range("A13").Value = "A1"
    For i = 1 To UBound(arr, 1)
        Files = arr(i, 1)
        Set RS = CreateObject("ADODB.Recordset")
        Set ObjConn = GetExcelConnection(Path & "\" & Files, 0)
        StrRequest = "SELECT * FROM [ket qua KT $A13:CZ1000]"
        RS.Open StrRequest, ObjConn, 3, 1
        Sheets("tonghop").Range("A65000").End(xlUp).Resize(1).CopyFromRecordset RS
        ObjConn.Close
        Next
        lr = .Range("A65000").End(xlUp).Row
        .Range("A" & lr + 1).Resize(10000, 200).ClearContents
        .Range("DC1:DC200").ClearContents
    End With
    Set RS = Nothing
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
End Sub
Sub Getname()
    Application.Calculation = xlCalculationManual
    Application.ScreenUpdating = False
    Dim sh As Worksheet, fso As Object, fo As Folder, f As File, lr As Integer
    Set sh = ThisWorkbook.Sheets("tonghop")
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set fo = fso.GetFolder(ThisWorkbook.Path)
    sh.Range("DC1:DC1000").ClearContents
    For Each f In fo.Files
    lr = sh.Range("DC1000").End(xlUp).Row + 1
    sh.Range("DC" & lr).Value = f.Name
    Next
    Set fso = Nothing
    Call Copy_DATA
End Sub
 

File đính kèm

  • CAP NHAT.xls
    114 KB · Đọc: 19
Upvote 0
Chào mọi người.

Nhờ mọi người giúp mình vấn đề gộp các file excel riêng lẻ vào 1 sheet trong file excel.
Mình đã lên các diễn đàn và youtube xem hướng dẫn dùng VBA giải quết cho vấn đề này, nhưng mình không làm được cho trường hợp của mình, rất mong được mọi người giúp đỡ.

Trong tháng mình có khoảng hơn 100 file excel ghi nhận báo cáo kiểm tra chất lượng sản phẩm, mỗi file có 4 sheet.
Mình cần gộp sheet tên "ket qua KT " ở các file excel khác nhau vào chung 1 sheet, dòng bắt đầu lấy dữ liệu là dòng 12.
Lưu ý trong file excel của mình:
- dòng 4 đến dòng 8 bị ẩn và có chứa công thức liên kết với các sheet trong file excel.
- vùng G12:L12 sẽ bị thay đổi dữ liệu theo từng file excel.
- số dòng chứa dữ liệu khác nhau với mỗi file excel khác nhau (dao động từ 30 tới 300 dòng).
- các file excel sẽ được cập nhật dữ liệu theo ngày.

Cám ơn mọi người và diễn đàn.
Dùng thử code
Mã:
Sub ABC()
  Dim cn As Object, rs As Object
  Dim sFile, oFile, sh As Worksheet, eRow&
    
  Application.ScreenUpdating = False
  Set sh = Sheets("tonghop")
  eRow = sh.Range("A" & Rows.Count).End(xlUp).Row 'Dong cuoi, Xoa du lieu cu
  If eRow > 12 Then sh.Range("A13:CZ" & eRow).ClearContents 'Xoa du lieu cu
 
  sFile = Application.GetOpenFilename(FileFilter:="Excel Files (*.xlsx),*.xls*", _
                                        Title:="Select File", MultiSelect:=True)
  If VarType(sFile) = vbBoolean Then MsgBox ("Chua chon File du lieu"): Exit Sub
  Set cn = CreateObject("adodb.connection")
  For Each oFile In sFile
    eRow = sh.Range("A" & Rows.Count).End(xlUp).Row
    cn.Open ("provider=Microsoft.ACE.OLEDB.12.0;data source=" & oFile & ";mode=Read;extended properties=""Excel 12.0;hdr=no"";")
    Set rs = cn.Execute("select * from [ket qua KT $A13:CZ65000] where f1 is not null")
    eRow = sh.Range("A" & Rows.Count).End(xlUp).Row
    If eRow < 13 Then eRow = 13
    If Not rs.EOF Then sh.Range("A" & eRow + 1).CopyFromRecordset rs
    rs.Close:    cn.Close
  Next
  Set cn = Nothing: Set rs = Nothing
  Application.ScreenUpdating = True
End Sub
 

File đính kèm

  • CAP NHAT.xlsm
    18.3 KB · Đọc: 20
Upvote 0
Web KT
Back
Top Bottom