Lấy dữ liệu từ folder có nhiều file excel về gộp thành 1 file Total

Liên hệ QC

dinhquangtrong

Thành viên mới
Tham gia
2/3/11
Bài viết
33
Được thích
0
Em có một vấn đề việc lấy dữ liệu từ các file trong một folder. Cụ thể là trong folder có rất nhiều file excel với định dạng như xlsx xls xlsm ... Giả sử bây giờ em muốn lấy dữ liệu từ các file như app1, app2, app3, ... app50, tên các sheet cần lấy đều giống nhau và có tên là app (các file không trùng tên). Vậy bây giờ có cách nào để lấy dữ liệu từ các file này không... Em muốn lấy cột từ name tới timeaverage hoặc có thể hơn nữa... và bỏ vào file Total.

Em xin cảm ơn ạ.
 

File đính kèm

Em có một vấn đề việc lấy dữ liệu từ các file trong một folder. Cụ thể là trong folder có rất nhiều file excel với định dạng như xlsx xls xlsm ... Giả sử bây giờ em muốn lấy dữ liệu từ các file như app1, app2, app3, ... app50, tên các sheet cần lấy đều giống nhau và có tên là app (các file không trùng tên). Vậy bây giờ có cách nào để lấy dữ liệu từ các file này không... Em muốn lấy cột từ name tới timeaverage hoặc có thể hơn nữa... và bỏ vào file Total.

Em xin cảm ơn ạ.
Thử xài Code sau xem sao ....lưu ý trong Folder 2016 có bao nhiêu File Excel nó lấy hết miễn sao Tổng số dòng của 1 sheet của các file cộng lại ko vượt quá số dòng của một sheet nó tổng hợp ....nếu quá là nghỉ chơi
Mã:
Public Sub GetDataFiles(strPath$, SheetName$, DataRange$, Col&, Target As Range)
Application.ScreenUpdating = False
    On Error Resume Next ''Xu ly loi khi co Sheet Empty
    Dim Fso As Object, ObjFile As Object, Sht$, FilePath$
    Dim Res(), Arr(), i As Long, j As Long, k As Long, Cols As Long
    Set Fso = CreateObject("Scripting.FileSystemObject")
    For Each ObjFile In Fso.GetFolder(strPath).Files
        If Fso.GetExtensionName(ObjFile) Like "xls*" Then
            If Left(ObjFile.Name, 2) <> "~$" Then
                If ObjFile.Name <> ThisWorkbook.Name Then
                    Sht = SheetName & "'!" & DataRange
                    FilePath = "='" & Fso.GetParentFolderName(ObjFile) _
                        & "\[" & Fso.GetFilename(ObjFile) & "]" & Sht
                    With Target.Range(DataRange)
                        .FormulaArray = FilePath
                        Res = .Value
                        Cols = .Columns.Count
                        .ClearContents
                    End With
                    ReDim Preserve Arr(1 To 65536, 1 To Cols)
                    For i = 1 To UBound(Res)
                        If Res(i, Col) <> Empty Then
                            k = k + 1
                            For j = 1 To UBound(Res, 2)
                                Arr(k, j) = Res(i, j)
                            Next
                        End If
                    Next
                End If
            End If
        End If
    Next
    If k Then Target.Resize(k, UBound(Res, 2)).Value = Arr
    Set Fso = Nothing
Application.ScreenUpdating = True
End Sub


 Chạy sub sau .... còn hàm trên hiểu được đến đâu thì hiểu mà ko hiểu càng khỏe ....


Public Sub Main()
    Dim Path As String, Sht As String, Data As String
    Path = ThisWorkbook.Path & "\2016"
    Sht = "app"
    Data = ("B2:L100")
    Range("B2:L65536").ClearContents
    GetDataFiles Path, Sht, Data, 1, [B2]       ''1 = Cot Loc theo dieu kien co du lieu
End Sub
 
Lần chỉnh sửa cuối:
Thử xài Code sau xem sao ....lưu ý trong Folder 2016 có bao nhiêu File Excel nó lấy hết miễn sao Tổng số dòng của 1 sheet của các file cộng lại ko vượt quá số dòng của một sheet nó tổng hợp ....nếu quá là nghỉ chơi
Mã:
Public Sub GetDataFiles(strPath$, SheetName$, DataRange$, Col&, Target As Range)
Application.ScreenUpdating = False
    On Error Resume Next ''Xu ly loi khi co Sheet Empty
    Dim Fso As Object, ObjFile As Object, Sht$, FilePath$
    Dim Res(), Arr(), i As Long, j As Long, k As Long, Cols As Long
    Set Fso = CreateObject("Scripting.FileSystemObject")
    For Each ObjFile In Fso.GetFolder(strPath).Files
        If Fso.GetExtensionName(ObjFile) Like "xls*" Then
            If Left(ObjFile.Name, 2) <> "~$" Then
                If ObjFile.Name <> ThisWorkbook.Name Then
                    Sht = SheetName & "'!" & DataRange
                    FilePath = "='" & Fso.GetParentFolderName(ObjFile) _
                        & "\[" & Fso.GetFilename(ObjFile) & "]" & Sht
                    With Target.Range(DataRange)
                        .FormulaArray = FilePath
                        Res = .Value
                        Cols = .Columns.Count
                        .ClearContents
                    End With
                    ReDim Preserve Arr(1 To 65536, 1 To Cols)
                    For i = 1 To UBound(Res)
                        If Res(i, Col) <> Empty Then
                            k = k + 1
                            For j = 1 To UBound(Res, 2)
                                Arr(k, j) = Res(i, j)
                            Next
                        End If
                    Next
                End If
            End If
        End If
    Next
    If k Then Target.Resize(k, UBound(Res, 2)).Value = Arr
    Set Fso = Nothing
Application.ScreenUpdating = True
End Sub


 Chạy sub sau .... còn hàm trên hiểu được đến đâu thì hiểu mà ko hiểu càng khỏe ....


Public Sub Main()
    Dim Path As String, Sht As String, Data As String
    Path = ThisWorkbook.Path & "\2016"
    Sht = "app"
    Data = ("B2:L100")
    Range("B2:L65536").ClearContents
    GetDataFiles Path, Sht, Data, 1, [B2]       ''1 = Cot Loc theo dieu kien co du lieu
End Sub

Nói thật là em hoàn toàn mù tịt về VBA, em copy sub vô module thì nó báo lỗi là Compile Error Expected End sub. Còn hàm GetDataFiles thì em bỏ vô trong ThisWorkbook. Lúc đầu thì chạy được nhưng chạy lần thứ hai và về sau bị báo lỗi như hình trong attach. Mong cao nhân giúp đỡ em với ạ.
 

File đính kèm

  • Screenshot 2016-08-10 18.28.49.jpg
    Screenshot 2016-08-10 18.28.49.jpg
    16.6 KB · Đọc: 30
Lần chỉnh sửa cuối:
Nói thật là em hoàn toàn mù tịt về VBA, em copy sub vô module thì nó báo lỗi là Compile Error Expected End sub. Còn hàm GetDataFiles thì em bỏ vô trong ThisWorkbook. Lúc đầu thì chạy được nhưng chạy lần thứ hai và về sau bị báo lỗi như hình trong attach. Mong cao nhân giúp đỡ em với ạ.
Chép hết vào Module xong chạy Sub Main
Hay Tai File Sau về Mà Xài Thay thế File của Bạn
 

File đính kèm

Chỉ có 100 dòng thì vầy được. Chứ dữ liệu mà cả 100 ngàn dòng trở lên thì vẫn chậm như thường... Sao không xác định dòng cuối ấy nhỉ, có phải đỡ được phần nào hơn hông???--=0--=0--=0
làm vậy máy chạy được máy không ... sai tè le chưa xác định được lỗi ....bỏ qua
Nhưng nó nhanh gấp nhiều lần Workbook.Open
 
Chỉ có 100 dòng thì vầy được. Chứ dữ liệu mà cả 100 ngàn dòng trở lên thì vẫn chậm như thường... Sao không xác định dòng cuối ấy nhỉ, có phải đỡ được phần nào hơn hông???--=0--=0--=0

Dòng cuối của mỗi file hình như khoảng 4000 dòng là max. Mà cho em hỏi là hình như File tổng và Folder cần lấy phải nằm cùng nhau mới lấy dữ liệu được. Em cut qua thư mục khác thì hình như không lấy được. Có cách nào mình hướng link folder cho nó được không ta.
 
Web KT

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

Back
Top Bottom