Điều kiện: Hãy khai báo thư viện:
Microsoft ActiveX Data Objects 2.X Library
Hoặc:
Microsoft ActiveX Data Objects 6.1 Library
Nói là không cần mở file có lẽ là không đúng, nó vẫn cần mở file nhưng không phải là Workbooks.Open như chúng ta đã biết, nó kết nối với excel (hoặc csv) và lấy thông tin rất nhanh chóng, tốc độ hơn hẳn so với phương thức
Bài viết này tôi sẽ đưa ra một ví dụ về một chương trình mẫu, lấy dữ liệu từ một file csv đang đóng.
Chú ý rằng nếu file csv đang mở thì sẽ không lấy được dữ liệu, lập tức sẽ ra thông báo lỗi như sau:
Ta hãy xem xét chương trình dưới đây sẽ thực hiện việc lấy dữ liệu từ một file csv cho vào file excel hiện hành chứa macro.
Thuyết minh thêm về chương trình trên:
Thuộc tính này tùy thuộc vào phiên bản Office mà có sự khác nhau. Cụ thể với các phiên bản excel từ trước 2007 trở về trước thì là:
Các thuộc tính khác:
Khi có nhiều thuộc tính thì chúng được phân cách bởi dấu chấm phẩy ;
"text" biểu thị rằng đây là một file text
"FMT=Delimited" : Phân biệt định dạng file. CSV được chỉ định là Delimited.
"HDR=Yes": Coi dòng đầu tiên như dòng tiêu đề Header. Nếu để là No, sẽ coi dòng đầu tiên như là data.
Thử thay đổi thông số và so sánh:
Chả hiểu sao khi để No, dòng tiêu đề kỳ quặc F1, F2,... hiện ra. Để Yes thì dữ liệu được bảo toàn.
"Extended Properties" Bằng cách thiết định giá trị thuộc tính này mà thiết định kết nối được thành lập. Hãy cẩn thận với giá trị này.
Mình thử bỏ dòng code này đi, là hết kết nối lấy dữ liệu luôn. Báo lỗi luôn này.
Đọc bản ghi:
Nếu như chỉ đọc dữ liệu thì có lẽ chỉ cần hai tham số sau là đủ SourceとActiveConnection.
Lấy thông tin tên cột (trường dữ liệu) Field.
Không còn dòng dữ liệu nào tiếp theo. Ý nói đã kết thúc dữ liệu.
Giá trị lấy được.
Di chuyển con trỏ sang dòng tiếp theo.
Provider là gì?
Microfost.ACE.OLEDB.12.0 hay Microsoft.Jet.OLEDB.4.0 là các qui tắc để kết nối cơ sở dữ liệu.
OLE DB(Object Linking and Embedding DataBase)Provider là API cung cấp tính năng truy cập vào cơ sở dữ liệu như
Bài viết được dịch từ:
Các bài viết tham khảo khác:
Microsoft ActiveX Data Objects 2.X Library
Hoặc:
Microsoft ActiveX Data Objects 6.1 Library
Nói là không cần mở file có lẽ là không đúng, nó vẫn cần mở file nhưng không phải là Workbooks.Open như chúng ta đã biết, nó kết nối với excel (hoặc csv) và lấy thông tin rất nhanh chóng, tốc độ hơn hẳn so với phương thức
Bạn cần đăng nhập để thấy link
.Bài viết này tôi sẽ đưa ra một ví dụ về một chương trình mẫu, lấy dữ liệu từ một file csv đang đóng.
Chú ý rằng nếu file csv đang mở thì sẽ không lấy được dữ liệu, lập tức sẽ ra thông báo lỗi như sau:
Bạn cần đăng nhập để thấy hình ảnh
Ta hãy xem xét chương trình dưới đây sẽ thực hiện việc lấy dữ liệu từ một file csv cho vào file excel hiện hành chứa macro.
Mã:
Sub OpenDataBase()
On Error GoTo PROC_ERR
Dim cn As New ADODB.Connection
Dim Rs As New ADODB.Recordset
Dim sEXTENDED As String
Dim sSrcDir As String ' Kết nối tới folder
Dim sSql As String ' SQL
Dim oWs As Worksheet
Dim lCnt As Long ' Số cột dữ liệu
sSrcDir = "C:\Users\jpnfriend.net\Desktop\VBA\New folder (4)\Hoi_GPE\"
' Thiết định Provider
cn.Provider = "Microsoft.ACE.OLEDB.12.0" ' Giống như access, từ Office 2007 thì đây là thông số Provider được dùng
' Đường dẫn thư mục chứa file mà ta muốn đọc
cn.Properties("Data Source") = sSrcDir
' Thiết định các thuộc tính khác
sEXTENDED = "text"
sEXTENDED = sEXTENDED & ";FMT=Delimited"
sEXTENDED = sEXTENDED & ";HDR=Yes"
cn.Properties("Extended Properties").Value = sEXTENDED
' Bắt đầu kết nối
cn.Open
sSql = "SELECT * FROM [database.csv]"
' Thực thi SQL
Rs.Open sSql, cn
If Rs.EOF Then
' Nếu kết quả không có gì thì kết thúc chương trình
GoTo PROC_EXIT
End If
Set oWs = ThisWorkbook.Sheets("Sheet1")
' Hiển thị tên trường (tên cột) dữ liệu lấy được
For lCnt = 1 To Rs.Fields.Count
oWs.Cells(1, lCnt).Value = "'" & Rs.Fields(lCnt - 1).Name
Next
' 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
PROC_EXIT:
On Error Resume Next
' Xóa sạch các biến để làm sạch bộ nhớ
Set Rs = Nothing
Set cn = Nothing
Exit Sub
PROC_ERR:
MsgBox "Ket noi ADO(CSV/TEXT) co loi xay ra:" & Err.Description & "(" & Err.Number & ")" & vbCrLf & sSrcDir, vbCritical
GoTo PROC_EXIT
End Sub
Bạn cần đăng nhập để thấy hình ảnh
Thuyết minh thêm về chương trình trên:
Mã:
cn.Provider = "Microsoft.ACE.OLEDB.12.0"
Mã:
"Microsoft.Jet.OLEDB.4.0"
Mã:
sEXTENDED = "text"
sEXTENDED = sEXTENDED & ";FMT=Delimited"
sEXTENDED = sEXTENDED & ";HDR=Yes"
cn.Properties("Extended Properties").Value = sEXTENDED
"text" biểu thị rằng đây là một file text
"FMT=Delimited" : Phân biệt định dạng file. CSV được chỉ định là Delimited.
"HDR=Yes": Coi dòng đầu tiên như dòng tiêu đề Header. Nếu để là No, sẽ coi dòng đầu tiên như là data.
Thử thay đổi thông số và so sánh:
Bạn cần đăng nhập để thấy hình ảnh
Chả hiểu sao khi để No, dòng tiêu đề kỳ quặc F1, F2,... hiện ra. Để Yes thì dữ liệu được bảo toàn.
"Extended Properties" Bằng cách thiết định giá trị thuộc tính này mà thiết định kết nối được thành lập. Hãy cẩn thận với giá trị này.
Mình thử bỏ dòng code này đi, là hết kết nối lấy dữ liệu luôn. Báo lỗi luôn này.
Bạn cần đăng nhập để thấy hình ảnh
Đọc bản ghi:
Mã:
recordset.Open Source, ActiveConnection, CursorType, LockType, Options
- Source: Thực thi
Bạn cần đăng nhập để thấy link
- ActiceConnection: Chỉ định kết nối
- (CursotType): Mở RecordSet và chỉ định con trỏ. Có thể chỉ định giá trị cho
Bạn cần đăng nhập để thấy link
- (LockType): Khi mở RecordSet thì chỉ định khóa (cấm người khác truy cập nếu file để trong mạng Lan). Có thể chỉ định giá trị cho
Bạn cần đăng nhập để thấy link
- (Options): Các thiết định khác
Nếu như chỉ đọc dữ liệu thì có lẽ chỉ cần hai tham số sau là đủ SourceとActiveConnection.
Mã:
For lCnt = 1 To Rs.Fields.Count
oWs.Cells(1, lCnt).Value = "'" & Rs.Fields(lCnt - 1).Name
Next
Mã:
RecordSet.EOF
Mã:
'Rs(j - 1).Value
RecordSet(index).Value
Mã:
RecordSet.MoveNext
Provider là gì?
Microfost.ACE.OLEDB.12.0 hay Microsoft.Jet.OLEDB.4.0 là các qui tắc để kết nối cơ sở dữ liệu.
OLE DB(Object Linking and Embedding DataBase)Provider là API cung cấp tính năng truy cập vào cơ sở dữ liệu như
Bạn cần đăng nhập để thấy link
,
Bạn cần đăng nhập để thấy link
<
Bạn cần đăng nhập để thấy link
>Bài viết được dịch từ:
Bạn cần đăng nhập để thấy link
Các bài viết tham khảo khác:
Bạn cần đăng nhập để thấy link
Sửa lần cuối: