Lấy dữ liệu từ các file csv bằng ADO

Liên hệ QC

MinhKhai

Giải pháp Ếc-xào
Tham gia
16/4/08
Bài viết
934
Được thích
568
Em có 1 thư mục trên ổ đĩa mạng (đã phân quyền) chứa các file định dạng csv. Em muốn dùng ADO để gom dữ liệu trong tất cả các file csv vào1 file Excel của mình (cho trước đường dẫn folder chứa file csv, cấu trúc dữ liệu file csv giống hệt nhau).
Lấy dữ liệu từ 1 file csv thì em đã áp dụng được, tuy nhiên chưa biết cách duyệt hết các file csv và nối dữ liệu của chúng với nhau.
Rất mong được các anh/chị giúp đỡ.
 

File đính kèm

  • CSV file.rar
    2.6 KB · Đọc: 13
Em có 1 thư mục trên ổ đĩa mạng (đã phân quyền) chứa các file định dạng csv. Em muốn dùng ADO để gom dữ liệu trong tất cả các file csv vào1 file Excel của mình (cho trước đường dẫn folder chứa file csv, cấu trúc dữ liệu file csv giống hệt nhau).
Lấy dữ liệu từ 1 file csv thì em đã áp dụng được, tuy nhiên chưa biết cách duyệt hết các file csv và nối dữ liệu của chúng với nhau.
Rất mong được các anh/chị giúp đỡ.
Vụ: "Lấy dữ liệu từ 1 file csv thì em đã áp dụng được" ở đâu rồi?
 
Vụ: "Lấy dữ liệu từ 1 file csv thì em đã áp dụng được" ở đâu rồi?

Em gửi bác file em lấy lẻ từng file đây bác nhé.
Em cũng thử cách dùng qua CMD (Copy *.csv FileDaGop.csv) nhưng cách này các Header cũng bị copy vào nên không lựa chọn.
 

File đính kèm

  • GPE.rar
    33.2 KB · Đọc: 13
Sao không dùng Power query? Tự động nối, thậm chí khi thêm bớt file trong folder cũng không cần chạy lại từ đầu, chỉ cần refresh
 
Sao không dùng Power query? Tự động nối, thậm chí khi thêm bớt file trong folder cũng không cần chạy lại từ đầu, chỉ cần refresh
Tại vì học cách nhờ GPE dễ hơn.
Nếu có ai đó viết cho code "bấm một phắt" thì bấm nó nhanh hơn "refresh" :p

Dân ta có tật nghĩ rằng cái gì mình cũng không thua ai nhưng khong hiểu sao không có được cái động năng "cập nhật kiến thức"
Họ không biết rằng Excel chỉ là một bảng tính, bản năng nó là sử lý dữ liệu trên bảng. "Truy cập dữ liệu" thuộc về "Query".
Cứ vậy rồi trách nhà nước dốt nát về "công nghệ 4.0"
 
không có được cái động năng "cập nhật kiến thức"
Thỉnh thoảng tôi cũng phải tự hỏi mình tìm hiểu cho biết những thứ không xài đến để làm gì, ấy thế mà thấy có cái gì hay hay, ít ai biết hoặc viết về nó, là lại cắm đầu thực hành rồi viết lại. Riết rồi đầu chứa 1 đống thứ không xài đến.
 
Thỉnh thoảng tôi cũng phải tự hỏi mình tìm hiểu cho biết những thứ không xài đến để làm gì, ấy thế mà thấy có cái gì hay hay, ít ai biết hoặc viết về nó, là lại cắm đầu thực hành rồi viết lại. Riết rồi đầu chứa 1 đống thứ không xài đến.
Vậy chứ bạn nghĩ tôi vào đây làm gì?
Những thứ "không cần đến" quả có đên 99% không giuóp gì cho bạn ngoài mặt. Nhưng đừng xem thường cái bề trong của nó.
Nó tạo cho bạn một cái tự tin là "hầu hết những cái gì hay mình đều đã có học qua. Và hầu hết những cái gì chưa gặp, lúc gặp mình sẽ có khả năng học"

Tôi nhớ có một thớt đặt ra vấn đề "học toán cao đến mức độ ấy để làm gì? hầu hết đều không có thực hành.
Tôi thì luôn tin rằng mức độ Toán ấy giúp tạo tự tin khi phải học bất cứ một cái gì khác. Và những gì tôi trình bày trên diễn đàn này đã minh xác điểu đó.
 
Lần chỉnh sửa cuối:
Em có 1 thư mục trên ổ đĩa mạng (đã phân quyền) chứa các file định dạng csv. Em muốn dùng ADO để gom dữ liệu trong tất cả các file csv vào1 file Excel của mình (cho trước đường dẫn folder chứa file csv, cấu trúc dữ liệu file csv giống hệt nhau).
Lấy dữ liệu từ 1 file csv thì em đã áp dụng được, tuy nhiên chưa biết cách duyệt hết các file csv và nối dữ liệu của chúng với nhau.
Rất mong được các anh/chị giúp đỡ.
Thử cái này được không bạn
Mã:
Option Explicit
Sub NTKTNN()
Dim Fso As Object, sPath As String, oFile As Object, I As Long
Set Fso = CreateObject("Scripting.FileSystemObject")
sPath = Fso.GetParentFolderName(ThisWorkbook.FullName) & "\CSV File\"
Sheets("Data").Rows("5:10000").ClearContents
    With CreateObject("ADODB.Connection")
        For Each oFile In Fso.GetFolder(sPath).Files
            If Left(oFile.Name, 1) <> "~" And Fso.GetExtensionName(oFile) Like "csv*" Then
                .Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sPath & ";Extended Properties=""text;HDR=Yes;FMT=Delimited"";"
                I = Sheets("Data").Cells(Rows.Count, "A").End(xlUp).Row
                Sheets("Data").Range("A" & I + 1).CopyFromRecordset .Execute("SELECT * FROM " & oFile.Name)
                .Close
            End If
        Next
    End With
End Sub
 
Thử cái này được không bạn
Mã:
Option Explicit
Sub NTKTNN()
Dim Fso As Object, sPath As String, oFile As Object, I As Long
Set Fso = CreateObject("Scripting.FileSystemObject")
sPath = Fso.GetParentFolderName(ThisWorkbook.FullName) & "\CSV File\"
Sheets("Data").Rows("5:10000").ClearContents
    With CreateObject("ADODB.Connection")
        For Each oFile In Fso.GetFolder(sPath).Files
            If Left(oFile.Name, 1) <> "~" And Fso.GetExtensionName(oFile) Like "csv*" Then
                .Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sPath & ";Extended Properties=""text;HDR=Yes;FMT=Delimited"";"
                I = Sheets("Data").Cells(Rows.Count, "A").End(xlUp).Row
                Sheets("Data").Range("A" & I + 1).CopyFromRecordset .Execute("SELECT * FROM " & oFile.Name)
                .Close
            End If
        Next
    End With
End Sub
Em chạy code nó báo Provider cannot be found. Em đã Goole mà chưa biết lỗi gì. Bác chỉ em với nhé
1621351612899.png
 
Sao không dùng Power query? Tự động nối, thậm chí khi thêm bớt file trong folder cũng không cần chạy lại từ đầu, chỉ cần refresh
Bác ơi, là do em chưa biết cách dùng, chưa biết sức mạnh của nó nhờ bác hướng dẫn cho.
Trước khi em hỏi ở đây em có Google và đã thử thực hiện bằng Query From File/Folder, tuy nhiên nó phát sinh vấn đề là em cần click chuột khá nhiều, đồng thời nó copy cả những header của file con vào dẫn đến dư thừa các header (Nếu dùng chức năng Remove Duplicate thì lại thêm thao tác). Ngoài ra 1 điều rất quan trọng là folder chứa dữ liệu được đặt trên ổ mạng mà cách này lại không hỗ trợ ổ mạng.
Các cụ ngày xưa nói "không thầy đố mày làm nên". Nếu được bác chỉ điểm, làm mẫu thì em cảm ơn lắm lắm. Em là người không nằm trong nhóm chỉ cần đọc tài liệu mà thành công chỉ cần Google mà không cần trường học.
Xin cảm ơn bác
 
Bác ơi, là do em chưa biết cách dùng, chưa biết sức mạnh của nó nhờ bác hướng dẫn cho.
Trước khi em hỏi ở đây em có Google và đã thử thực hiện bằng Query From File/Folder, tuy nhiên nó phát sinh vấn đề là em cần click chuột khá nhiều, đồng thời nó copy cả những header của file con vào dẫn đến dư thừa các header (Nếu dùng chức năng Remove Duplicate thì lại thêm thao tác). Ngoài ra 1 điều rất quan trọng là folder chứa dữ liệu được đặt trên ổ mạng mà cách này lại không hỗ trợ ổ mạng.
Các cụ ngày xưa nói "không thầy đố mày làm nên". Nếu được bác chỉ điểm, làm mẫu thì em cảm ơn lắm lắm. Em là người không nằm trong nhóm chỉ cần đọc tài liệu mà thành công chỉ cần Google mà không cần trường học.
Xin cảm ơn bác
Ổ mạng thì hình như có xài ứng dụng map network drive? Tôi chưa thử nhưng chắc là phải được vì lấy từ 1 folder trong drive đó.
Ngoài ra, thao tác power query có wizard để làm, trong đó có 1 bước review và chọn sample, bước đó cho thấy dòng đầu tiên đã được sử dụng làm header. Những file khác nếu cùng cấu trúc với file sample thì chắc chắn cũng lấy dòng đầu tiên làm header, khi combine lại (nối lại) chỉ header của file sample được giữ.
Bạn đọc tài liệu trên đầu trang GPE ở dòng chữ chạy sẽ thấy hướng dẫn chi tiết.

Ví dụ tôi có 3 file:

1621355637795.png

Bước 1 thấy 3 file:

1621354966315.png

Chọn file bất kỳ làm sample, đều thấy header như hình:

1621355065346.png

Sau khi combine (cửa sổ query editor)

1621355500622.png
Kết quả đưa xuống sheet: nối 3 file và chỉ 1 tiêu đề:

1621355396216.png
 
Lần chỉnh sửa cuối:
File của bạn cấu trúc file như nhau rồi mà! Chập bằng Power Query bình thường, bạn chọn Get data rồi vô chập Folder là được:
1621355276681.png
 
Em chạy code nó báo Provider cannot be found. Em đã Goole mà chưa biết lỗi gì. Bác chỉ em với nhé
Bạn google sao á! Mà đọc thông báo lỗi cũng thấy lỗi Provider, lại đọc câu tô vàng thấy Provider 4.0, trong khi code cũ của bạn đã chạy được là 16.0, thì sửa ngay chỗ đó thôi
.Open "Provider=Microsoft.ACE.OLEDB.16.0;Data Source=" & sPath & _
";Extended Properties=""text;HDR=Yes;FMT=Delimited"";"
 
Em chạy code nó báo Provider cannot be found. Em đã Goole mà chưa biết lỗi gì. Bác chỉ em với nhé
View attachment 258919
Mình dùng office 2010, phiên bản 32bit chạy code đó bình thường, có thể máy bạn phiên bản 64bit. Bạn thử sử dụng connection string theo như file của bạn gửi lên xem. Mình dùng code file bạn cũng bị báo lỗi tương tự bạn
 
Web KT
Back
Top Bottom