Lấy dữ liệu từ nhiều tập tin, theo điều kiện? (1 người xem)

Liên hệ QC

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

Hoàng Nhật Phương

Thành viên gắn bó
Tham gia
5/11/15
Bài viết
1,895
Được thích
1,219
Xin chào tất cả các bạn.
Như tiêu đề Oanh Thơ đã nêu, Oanh Thơ muốn lấy dữ liệu từ các tập tin A,B,C vào tập tin tổng hợp như dữ liệu mẫu minh họa trong tập tin Tonghop.

Rất mong nhận được sự giúp đỡ của các bạn.
Trân trọng cảm ơn.
Nguyễn Hoàng Oanh Thơ
 

File đính kèm

Trong lúc chờ đợi bạn thử dùng cái Code dài thòng này thử xem sao:
Mã:
Sub ImportData()
    Dim Master As Worksheet, Sh As Worksheet, wk As Workbook
    Dim strFolderPath As String, strFileName As String
    Dim Arr As Variant , v As Integer , cll, Rng As Range, DK As Boolean
    Dim Er As Long, Ep As Long, Tenfile
Application.ScreenUpdating = False
Set Master = ActiveWorkbook.Sheets("Sheet1")
Master.Range("C5:AH" & Master.Range("C65535").End(3).Row+1).ClearContents
On Error GoTo Thoat
Arr = Application.GetOpenFilename( _
        filefilter:="Excel Files (*.xls*),*.xlsx*", MultiSelect:=True)
For v = LBound(Arr) To UBound(Arr)
    strFileName = Arr(v)
    Set wk = Workbooks.Open(strFileName)
    For Each Sh In wk.Sheets
        If Sh.Name Like "Sheet*" Then
            With Sh
                DK = False
                Er = .Range("E65535").End(3).Row
                If Er > 5 Then
                    Set Rng = .Range("E" & Er & ":AF" & Er)
                    Ep = Master.Range("C65535").End(3).Row + 1
                    For Each cll In Rng
                        If cll <> Empty And IsNumeric(cll) = True Then
                            DK = True
                            Exit For
                        End If
                    Next
                    If DK = True Then
                        With Master
                            Tenfile = Split(Mid(strFileName, InStrRev(strFileName, "\") + 1), ".")
                            .Range("C" & Ep) = Tenfile(0)
                            .Range("D" & Ep) = Sh.Name
                            .Range("E" & Ep) = Sh.Range("E3"): .Range("F" & Ep) = Sh.Range("E4")
                            .Range("G" & Ep).Resize(, 28) = Rng.Value
                        End With
                    End If
                End If
            End With
        End If
    Next Sh
    wk.Close False
Next
MsgBox "Qua trinh lay du lieu hoan thanh   "
Thoat:
Exit Sub
Application.ScreenUpdating = True
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Xin cảm ơn 2 bạn: PacificPR,giaiphap rất nhiều.

Kết quả đã đúng ý tôi rồi.
Tôi không nhớ rõ đã đọc ở đâu trên diễn đàn là phương pháp sử dụng ADO cho trường hợp lấy dữ liệu từ nhiều tập tin là giải pháp rất tối ưu về tốc độ?

Nếu không phiền mong các bạn cho giúp thêm 1 cho tôi 1 cách về phương pháp sử dụng ADO để tham khảo ạ.
 
Upvote 0
ADO chắc phải nhờ bạn #2 hoặc các thành viên khác còn tôi thì mù tịch ADO (chưa được đào tạo về cơ sở dữ liệu nên việc tổ chức thông tin sẽ không ổn đâu, vã lại tôi thấy cái file của bạn tổ chức thông tin như vậy mà sử dụng ADO hơi bị khó à, mà không chừng tại trình độ của tôi chưa đủ để giải quyết vấn đề của bạn).
 
Upvote 0
ADO chắc phải nhờ bạn #2 hoặc các thành viên khác còn tôi thì mù tịch ADO (chưa được đào tạo về cơ sở dữ liệu nên việc tổ chức thông tin sẽ không ổn đâu, vã lại tôi thấy cái file của bạn tổ chức thông tin như vậy mà sử dụng ADO hơi bị khó à, mà không chừng tại trình độ của tôi chưa đủ để giải quyết vấn đề của bạn).

Xin chào giaiphap,
Cảm ơn bạn rất nhiều vì đã giúp đỡ, Oanh Thơ cảm thấy ngại quá ạ.
Hiện Oanh Thơ đang sử dụng code của bạn để lấy dữ liệu từ nhiều tập tin (thực tế có 21 tập tin).
Nên thời gian xử lý cũng có chút chậm nên muốn tham khảo thêm cách khác. Nhưng như thế này đối với Oanh Thơ là tuyệt vời rồi ạ.
 
Upvote 0
Xin chào giaiphap,
Nếu tên các tập tin co có dấu ' , ví dụ A'.xlsx thì code sẽ bị lỗi, phiền bạn giúp đỡ thêm ạ.
 
Upvote 0
Cái vụ tên đặt có dấu thì tôi thua rồi bạn, bạn cho một lý tại sao phải đặt tên file có dấu, vã lại nếu đặt tên có dấu sẽ gặp rắc rối sau này vì có một số phần mềm hoặc ứng dụng sẽ bị lỗi nếu đọc file có dấu tiếng việt.
 
Upvote 0
Cái vụ tên đặt có dấu thì tôi thua rồi bạn, bạn cho một lý tại sao phải đặt tên file có dấu, vã lại nếu đặt tên có dấu sẽ gặp rắc rối sau này vì có một số phần mềm hoặc ứng dụng sẽ bị lỗi nếu đọc file có dấu tiếng việt.
Xin chào giaiphap,
Cảm ơn bạn đã thông tin, hic tôi cũng không biết nữa có lẽ việc đặt dấu tên file để phân biệt tập tin cùng chủng loại mặt hàng. Nhưng vì có quá nhiều mặt hàng lên mới chia làm nhiều tập tin như vậy.
Còn lý do nào nữa tôi không biết được. Rất xin lỗi bạn.
Còn chuyện đổi tên tập tin thì là một chuyện rất đơn giản nhưng không thể đổi được nữa bạn ạ, vì hệ thống có rất nhiều tập tin khác cũng liên kết đến các tập tin con này.
Nếu thay đổi thì sẽ rất rắc rối. :((
 
Upvote 0
Tôi cũng từng bị rắc rồi khi đặt tên file bằng tiếng việt, trước kia (không biết bây giờ còn không) tôi tạo liên kết cho các file đều sử dụng dấu tiếng việt (vài trăm file) khi ghi ra đĩa bằng Nero thì nó lại không đọc được file có dấu unicode, thế là phải thiết kế lại hết các liên kết. Khi tạo cơ sở dữ liệu để lưu trữ thông tin sau đó dùng phần mềm khác tham chiếu đến file đó để lấy dữ liệu cũng gặp phải trường hợp tên file unicode và nó cũng không hổ trợ thế là làm lại từ đầu... Khi bạn sử dụng nhiều phần mềm có liên quan đến đọc ghi dữ liệu bạn sẽ gặp rắc rối ngay chổ unicode.
 
Upvote 0
Cái vụ tên đặt có dấu thì tôi thua rồi bạn, bạn cho một lý tại sao phải đặt tên file có dấu, vã lại nếu đặt tên có dấu sẽ gặp rắc rối sau này vì có một số phần mềm hoặc ứng dụng sẽ bị lỗi nếu đọc file có dấu tiếng việt.
Hình như Macro4 vướng với đường dẫn là chữ có dấu, còn FSO thì không vấn đề gì.
Vậy anh tạm có thể chuyển qua Workbooks.Open rồi lấy dữ liệu vào mảng.
 
Upvote 0
Xin chào giaiphap,
Cảm ơn bạn đã thông tin, hic tôi cũng không biết nữa có lẽ việc đặt dấu tên file để phân biệt tập tin cùng chủng loại mặt hàng. Nhưng vì có quá nhiều mặt hàng lên mới chia làm nhiều tập tin như vậy.
Còn lý do nào nữa tôi không biết được. Rất xin lỗi bạn.
Còn chuyện đổi tên tập tin thì là một chuyện rất đơn giản nhưng không thể đổi được nữa bạn ạ, vì hệ thống có rất nhiều tập tin khác cũng liên kết đến các tập tin con này.
Nếu thay đổi thì sẽ rất rắc rối. :((
Do "tác giả" lấy code từ chỗ khác nên không biết sửa :)
 

File đính kèm

Upvote 0
Xin chào giaiphap,
Cảm ơn bạn đã thông tin, hic tôi cũng không biết nữa có lẽ việc đặt dấu tên file để phân biệt tập tin cùng chủng loại mặt hàng. Nhưng vì có quá nhiều mặt hàng lên mới chia làm nhiều tập tin như vậy.
Còn lý do nào nữa tôi không biết được. Rất xin lỗi bạn.
Còn chuyện đổi tên tập tin thì là một chuyện rất đơn giản nhưng không thể đổi được nữa bạn ạ, vì hệ thống có rất nhiều tập tin khác cũng liên kết đến các tập tin con này.
Nếu thay đổi thì sẽ rất rắc rối. :((
Bạn sửa code của mình lại thế này (nhưng không khuyến cáo bạn đặt tên file có chứa unicode.
Mã:
Sub GPE()
Dim fso As Object, ObjFile As Object
Dim path As String, I As Long, Arr(), dArr(), k As Long
Dim sFile As String, sSheet As String, sAddr As String, wb As Workbook
ReDim Arr(1 To 70, 1 To 2)
ReDim dArr(1 To 2, 1 To 1)
Application.DisplayAlerts = True
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
sAddr = "E102:AF102"
path = ThisWorkbook.path
Set fso = CreateObject("Scripting.FileSystemObject")
   With fso.GetFolder(path)
      For Each ObjFile In .Files
         If fso.GetExtensionName(ObjFile) = "xlsx" And Left(ObjFile.Name, 2) <> "~$" And ObjFile.Name <> ThisWorkbook.Name Then
            sFile = ThisWorkbook.path & "\" & ObjFile.Name
            Set wb = Workbooks.Open(sFile)
            Arr = wb.Sheets("Tonghop").Range("C5:D74").Value
            For I = 1 To 70
                If Arr(I, 2) <> 0 Then
                    sSheet = Arr(I, 1)
                    k = Sheet1.Range("C65000").End(xlUp).Row + 1
                    Sheet1.Range("C" & k) = Left(ObjFile.Name, Len(ObjFile.Name) - 5)
                    Sheet1.Range("D" & k) = sSheet
                    dArr = wb.Sheets(sSheet).Range("E3:E4").Value
                    Sheet1.Range("E" & k).Resize(, 2) = Application.Transpose(dArr)
                    Sheet1.Range("G" & k).Resize(, 28) = wb.Sheets(sSheet).Range(sAddr).Value
                End If
            Next I
            wb.Close
            Set wb = Nothing
         End If
      Next
   End With
Application.DisplayAlerts = False
Application.DisplayAlerts = True
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub
 
Upvote 0
Xin cảm ơn các bạn: befaint, huuthang_bd, giaiphap đã hỗ trợ & và giúp đỡ.

Tôi đã chạy thử code trong tập tin ở bài #12 của bạn huuthang_bd kết quả còn một chút vấn đề nữa nhờ bạn xem giúp huuthang_bd , cụ thể là code không lấy dữ liệu từ ô E4 của các tập tin con để đưa vào cột F trong tập tin Tonghop. Mà code lấy dữ liệu từ ô E3 ...

Code của bài #13 của bạn giaiphap tuy tốc độ có phần chậm hơn code ở bài #12 một chút nhưng kết quả rất OK, xin cảm ơn bạn đã cố gắng tìm cách hỗ trợ cho tôi. :)

---------
Ngoài ra còn một vấn đề nữa là trong thư mục có rất nhiều tập tin có những tập tin không không có ý định muốn cập nhật dữ liệu vào cùng nên rất mong 2 bạn huuthang_bd giaiphap sửa lại code làm sao để liệt kê các tập tin con cần lấy dữ liệu.
Code ở #2 rất OK có thể mở hộp chọn lên chọn tùy ý các tập tin muốn lấy (Application.GetOpenFilename)
, nhưng trong trường hợp này do đường dẫn cũng khá dài mỗi lần cập nhật phải tìm kiếm đường dẫn nên cũng hơi bất tiện.

Nhờ các bạn bạn xem giúp ạ.
 
Upvote 0
Xin cảm ơn các bạn: befaint, huuthang_bd, giaiphap đã hỗ trợ & và giúp đỡ.

Tôi đã chạy thử code trong tập tin ở bài #12 của bạn huuthang_bd kết quả còn một chút vấn đề nữa nhờ bạn xem giúp huuthang_bd , cụ thể là code không lấy dữ liệu từ ô E4 của các tập tin con để đưa vào cột F trong tập tin Tonghop. Mà code lấy dữ liệu từ ô E3 ...

Code của bài #13 của bạn giaiphap tuy tốc độ có phần chậm hơn code ở bài #12 một chút nhưng kết quả rất OK, xin cảm ơn bạn đã cố gắng tìm cách hỗ trợ cho tôi. :)

---------
Ngoài ra còn một vấn đề nữa là trong thư mục có rất nhiều tập tin có những tập tin không không có ý định muốn cập nhật dữ liệu vào cùng nên rất mong 2 bạn huuthang_bd giaiphap sửa lại code làm sao để liệt kê các tập tin con cần lấy dữ liệu.
Code ở #2 rất OK có thể mở hộp chọn lên chọn tùy ý các tập tin muốn lấy (Application.GetOpenFilename)
, nhưng trong trường hợp này do đường dẫn cũng khá dài mỗi lần cập nhật phải tìm kiếm đường dẫn nên cũng hơi bất tiện.

Nhờ các bạn bạn xem giúp ạ.
Tôi chỉ sửa lại code trong file bạn đưa lên chứ không phải code của tôi nhé. Thấy ngứa mắt nên sửa chứ nếu tôi viết tôi sẽ viết khác.
Vấn đề đã được giải quyết nên tôi sẽ không tham gia topic này nữa.
 
Upvote 0
Ngoài ra còn một vấn đề nữa là trong thư mục có rất nhiều tập tin có những tập tin không không có ý định muốn cập nhật dữ liệu vào cùng nên rất mong 2 bạn huuthang_bd giaiphap sửa lại code làm sao để liệt kê các tập tin con cần lấy dữ liệu.
Ý bạn muốn giúp gì nửa mới được chứ. Liệt kê danh sách file lên form để bạn chọn hay sao? hay là cho chọn thư mục? hay chọn từng tệp tin?...
 
Upvote 0
Ý bạn muốn giúp gì nửa mới được chứ. Liệt kê danh sách file lên form để bạn chọn hay sao? hay là cho chọn thư mục? hay chọn từng tệp tin?...

Xin chào giaiphap,
Cảm ơn bạn đã giúp đỡ ạ,

Rất xin lỗi vì tôi chưa giải thích rõ,đúng rồi bạn ạ:

1.Trường hợp Liệt kê danh sách file lên form để chọn:
Với cách này rất hay nếu không mất nhiều thời gian mong bạn giúp đỡ về vấn đề liệt kê toàn bộ các tập tin xls,xlsx,xlsb,xlsm trong cùng thư mục chứa tập tin Tonghop này lên form xong đó chọn các tập tin cần lấy dữ liệu ạ.

2.Hoặc trường hợp viết thẳng vào code tập tin muốn lấy, ví dụ đính kèm gửi lên các tập tin nguồn là A.xlsx
B.xlsx
C.xlsx
..
E.xls
F.xlsb
Với cách này khi có tập tin mới cũng hơi bất tiện cho người dùng sửa lại code.

3.Hiện Oanh Thơ có 1 ý tưởng là trong tập tin Tonghop mở thêm 1 sheet mới có tên là filelink.
Trong sheet filelink này ta sẽ:
Nhập lượt tên các tập tin bắt đầu từ ô E5:
E5=A.xlsx
E6=B.xlsx
E7=C.xlsx
E8=E.xls
E9=F.xlsb
...
En=...

3 trường hợp trên mong các bạn góp ý và giúp đỡ ạ.
 
Upvote 0
Xin chào giaiphap,
Cảm ơn bạn đã giúp đỡ ạ,

Rất xin lỗi vì tôi chưa giải thích rõ,đúng rồi bạn ạ:

1.Trường hợp Liệt kê danh sách file lên form để chọn:
Với cách này rất hay nếu không mất nhiều thời gian mong bạn giúp đỡ về vấn đề liệt kê toàn bộ các tập tin xls,xlsx,xlsb,xlsm trong cùng thư mục chứa tập tin Tonghop này lên form xong đó chọn các tập tin cần lấy dữ liệu ạ.

2.Hoặc trường hợp viết thẳng vào code tập tin muốn lấy, ví dụ đính kèm gửi lên các tập tin nguồn là A.xlsx
B.xlsx
C.xlsx
..
E.xls
F.xlsb
Với cách này khi có tập tin mới cũng hơi bất tiện cho người dùng sửa lại code.

3.Hiện Oanh Thơ có 1 ý tưởng là trong tập tin Tonghop mở thêm 1 sheet mới có tên là filelink.
Trong sheet filelink này ta sẽ:
Nhập lượt tên các tập tin bắt đầu từ ô E5:
E5=A.xlsx
E6=B.xlsx
E7=C.xlsx
E8=E.xls
E9=F.xlsb
...
En=...

3 trường hợp trên mong các bạn góp ý và giúp đỡ ạ.
Mình thực hiện theo trường hợp 1 của bạn, bạn có thể sửa lại thành trường hợp 3.
 

File đính kèm

Upvote 0
Web KT

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

Back
Top Bottom