ADO-kết nối để lấy dữ liệu từ file excel đang đóng

nhanduc2018

Yêu THVBA
mình có khoảng 100 folder,trong đó có khoảng 600 file excel,mình đã dùng vba tổng hợp nhưng hơi lâu,
SQL tốc độ nhanh hơn nhiều không?
Cám ơn.
 

Euler

Administrator
Thành viên BQT
mình có khoảng 100 folder,trong đó có khoảng 600 file excel,mình đã dùng vba tổng hợp nhưng hơi lâu,
SQL tốc độ nhanh hơn nhiều không?
Cám ơn.
Chưa cần biết xử lý sau đó là gì, chỉ nói riêng dòng lệnh Open (mở file) mà thao tác với 600 file, đó là thời gian rất lớn. Chạy code kiểu này có khi lên tới hàng giờ. Trong trường hợp này có thể nói ADO sẽ cho xử lý nhanh hơn.
 

giaiphapvba

Administrator
Thành viên BQT
Trong topic này đã có đọc, update, hôm nay tôi bổ sung thêm một mẫu là INSERT. Trong đó bài viết ở #1 vẫn là nền tảng lý thuyết với comment từng dòng lệnh rất đầy đủ.
Bài toán: Tôi có 2 file để chung thư mục.
Bạn cần đăng nhập để thấy đính kèm

Tôi mong muốn di chuyển những người có điểm lớn hơn 9 từ file 1 (FileCode.xlsm, đây cũng là file tôi viết macro) tới file Database.xlsx.
Kết quả mong muốn:
Bạn cần đăng nhập để thấy đính kèm


Tôi sẽ cho HDR của file Database.xlsxNo, tức là coi dòng 1 của nó cũng là data. Khi đó tiêu đề cột của file Database không còn là MNV, NAME, DIEM mà sẽ là F1, F2, F3.
Đối với file FileCode.xlsm tôi để HDR là Yes, tức là coi dòng 1 là dòng tiêu đề. Tên trường thông tin là MNV, NAME, DIEM.
Như vậy SQL sẽ là:
Mã:
SQl = INSERT INTO [Sheet1$] (F1,F2,F3) SELECT MNV,NAME,DIEM FROM [Excel 12.0 Xml;HDR=YES;Database=D:\NhanSu\FileCode.xlsm;].[Sheet1$] WHERE DIEM>9
Trong đó tôi sẽ thay:
Mã:
D:\NhanSu\FileCode.xlsm = ThisWorkbook.FullName
Do đó chương trình lúc này sẽ là :
Mã:
Sub InsertADO()
    Dim cn As ADODB.Connection, rs As ADODB.Recordset
    Dim s As String
    s = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source= " & ThisWorkbook.Path & "\Database.xlsx" & _
        ";Extended Properties=""Excel 12.0 XML;HDR=No;"""
    Set cn = New ADODB.Connection
    cn.Open s 'Ket noi toi file đích (Database.xlsx)
    s = "INSERT INTO [Sheet1$] (F1,F2,F3) SELECT MNV,NAME,DIEM FROM [Excel 12.0 Xml;HDR=YES;Database=" & ThisWorkbook.FullName & ";].[Sheet1$] WHERE DIEM>9"
    Set rs = New ADODB.Recordset
    rs.Open s, cn
    Set rs = Nothing
    cn.Close
    Set cn = Nothing
End Sub
Tổng hợp thành lý thuyết từ:

 

phuonghong1997

Yêu THVBA như điếu đổ
Đoạn code này:
Mã:
Sub OpenDataBase()
    ' Kết quả lấy được cho hiển thị trên file excel hiện hành
    oWs.Cells(2, 1).CopyFromRecordset Rs
 
    Rs.Close
 
    cn.Close 'Không nên close nếu còn muốn chạy lại nhiều lần nữa

End Sub
Nếu muốn ghi rs ra mảng thì viết :
Mã:
arr = rs.getrows
Chỉ nên close rs, không nên close cn, vẫn giữ kết nối, sau đó chỉ cần thay lệnh SQL và chạy lại, tốc độ sẽ nhanh hơn.
cn nên khai báo public hoặc static.
 

Phạm Trang

Yêu THVBA
Mọi người ơi mình kết nối được SQL server rồi nhưng chỉ lấy được dữ liệu từ SQL qua VBA thôi chứ k lấy dữ liệu đc ngược lại thì làm sao ạ
 
Top