Bài này có ai viết ADO không nhỉ?
Trả lời theo VBA thông thường:
Nếu một cột tiếp nối thì được (dùng Union).
Nhưng nhiều cột kế tiếp thì không nên. Không phải là không được, nhưng pivot như vậy là đi phản lại luật CSDL LH của SQL. Trong khi SQL là cách truy vấn căn bản của ADO.
Trả lời theo lý thuyết lập trình:
Nếu bạn quen viết code theo module. Cấu trúc (structured) hay hướng đối tượng (object oriented) gì cũng vậy; giải thuật sẽ chia ra làm 3 phần:
1. phần 1 gồm code lấy files
2. phần 2 là 1 hàm lấy dữ liệu từ file và đổ vào mảng
3. phần 3 là 1 hàm/sub đổ dữ liệu từ mảng vào file chủ.
Ở phần 2, bạn muốn lấy dữ liệu bằng cách nào là chuyện của bạn, ADO hay kiểu gì cũng được. Miễn là nó trả về 1 mảng. Code module chính chỉ việc gọi nó ra để lấy mảng dữ liệu. Một ngày nào đó, bạn cảm thấy có kiểu khác hay hơn thì chỉ sửa hàm 2 thôi, hầu như khong cần đá dộng đến phần khác.
Cái hay, cái đẹp của kỹ thuật chia code ra từng hàm nhỏ là vậy. Ở diễn đàn này, các bạn quen viết code 1 sub duy nhất cho nên nhiều người tuy code đã nhiều năm vẫn không nắm nổi kỹ thuật này.
' code láy file collection ở đây
For each meFile In FileCollection
CopDuLieu LayDuLieu(meFile.Name)
Next meFile
Function LayDuLieu(byVal fName As String) As Variant
' code mở file thì mở file và đọc range: LayDuLieu = .Range(...).Value
' code ADO thì lấy recordset và: LayDuLieu = rs.GetRows()
End Function
Sub CopDuLieu(meArray As Variant)
' code tìm ô để cóp vào ở đây
.Range("ô để cóp").Resize(Ubound(meArray,1), UBound(meArray,2)).Value = meArray
Endn Sub