Tham số chuỗi kết nối cho nguồn dữ liệu Excel
Trong bài viết trước, tôi đã thảo luận về cách chúng ta có thể coi các tệp Excel và tệp văn bản như thể chúng là một cơ sở dữ liệu bằng cách sử dụng DAO và cách chúng ta có thể mở chúng mà không cần liên kết. Bởi vì họ không sử dụng trình điều khiển ODBC, chuỗi kết nối của họ sẽ được định dạng hoàn toàn khác với những gì bạn có thể quen nhìn thấy đối với chuỗi kết nối ODBC. Có rất ít tài liệu về các tham số chuỗi kết nối Excel. Đây là nỗ lực tốt nhất để che lấp một số lỗ hổng và thảo luận về sự phân nhánh của các tham số.
Tham số chuỗi kết nối Excel
Mặc dù chúng tôi có 3 “loại” nguồn dữ liệu khác nhau:
-
Excel 8.0
:97-2003 tệp xls -
Excel 12.0
:tệp xlsb -
Excel 12.0 Xml
:tệp xlsx
Tất cả chúng đều sử dụng các thông số giống nhau.
Đây là danh sách các tham số:
HDR
tham số:Hàng tiêu đề
YES
:Hàng đầu tiên là tiêu đề và phải trở thành tên cột cho “bảng” / ”tập bản ghi”
NO
:Hàng đầu tiên không được xử lý khác và chỉ là một dữ liệu. Tất cả các tên cột sẽ được đặt tên là “FN” trong đó “N” là một số bắt đầu bằng 1
IMEX
tham số:Hành vi Nhập / Xuất
Điều này chi phối cách xác định các kiểu dữ liệu cột, dựa trên nội dung:
1
:Nếu cột chứa các kiểu dữ liệu khác nhau, hãy coi nó như một chuỗi. Nếu không, hãy đối sánh cột với kiểu dữ liệu tốt nhất.
2
:Luôn khớp cột với một kiểu dữ liệu nhất định dựa trên mẫu. Điều đó có thể gây ra lỗi đọc khi chúng tôi đọc một hàng chứa dữ liệu không khớp với kiểu dữ liệu mong đợi.
ACCDB
tham số:Cho biết Access đang sử dụng định dạng tệp ACCDB?
Theo mặc định, điều này luôn được đặt ACCDB =YES ở định dạng tệp accdb. Tuy nhiên, việc bỏ qua hoặc đặt thành KHÔNG dường như không làm được gì. Đó là một chút bí ẩn. Nếu ai đó có thể chia sẻ tác dụng của thông số này, hãy đăng nhận xét và tôi sẽ cập nhật blog.
DATABASE:Đường dẫn đến sổ làm việc Excel
Tham số phải chứa một đường dẫn đủ điều kiện, bao gồm cả tên của sổ làm việc.
Chuỗi kết nối hoạt động tối thiểu
Lưu ý rằng DATABASE là tham số bắt buộc duy nhất ngoài từ khóa nguồn kiểu dữ liệu. Do đó, một chuỗi kết nối hoạt động tối thiểu có thể là:
Excel 8.0;DATABASE=C:\Links\Products.xls
Chỉ định trang tính hoặc dải ô trong chuỗi kết nối
Trong mẫu trước, bạn thấy rằng một trang tính đại diện cho “DAO.TableDef
“. Tuy nhiên, trang tính không phải là thứ duy nhất có thể là “Tabledef
“. Nếu bảng tính Excel chứa một dải ô đã đặt tên, thì dải ô được đặt tên sẽ được báo cáo là “Tabledef
" cũng. Ngoài ra, chúng ta có thể "truy vấn" một khối tùy ý trong trang tính bằng cách sử dụng địa chỉ ô. Ví dụ:
Dim db As DAO.Database Dim rs As DAO.Recordset Set db = DBEngine.OpenDatabase(vbNullString, False, False, "Excel 12.0 Xml;HDR=YES;IMEX=2;ACCDB=YES;DATABASE=C:\Links\Products.xlsx") Set rs = db.OpenRecordsset("Sheet$1A1:A3") Debug.Print rs.Name, rs.Fields.Count
Điều quan trọng cần lưu ý là địa chỉ ô không được vượt quá phạm vi được sử dụng của trang tính. Ví dụ:Products.xlsx
chỉ thực sự có nội dung trong A1:B3, điều đó có nghĩa là nếu bạn mở một tập bản ghi bằng Sheet1 $ A1:D5, bạn vẫn chỉ nhận được 2 cho số trường và 3 cho số bản ghi. Các cột / hàng trống thừa chỉ bị bỏ qua. Mặt khác, nếu bạn làm bẩn một ô ở đâu đó bên ngoài A1:B3
, UsedRange
của trang tính bây giờ sẽ lớn hơn và truy vấn sau đó sẽ bao gồm các cột và hàng trống.
Do đó, đó là những tên hợp lệ để sử dụng trong truy vấn trên “cơ sở dữ liệu” Excel:
-
Sheet1$
- Toàn bộ phạm vi sử dụng của một trang tính. -
Sheet1$A1:B4
- Chỉ 2 cột và 3 hàng (không tính tiêu đề), với điều kiện phải điền đầy đủ nội dung. Nếu không, các cột hoặc hàng có thể ít hơn yêu cầu. -
ProductsRange
- phạm vi được đặt tên với tên đó.
Tôi thấy sẽ tốt hơn nhiều khi sử dụng các phạm vi được đặt tên nếu thực tế vì điều này đảm bảo rằng bạn không phải mã hóa cứng các địa chỉ trong mã của mình, đặc biệt nếu phạm vi bị di chuyển xung quanh do người dùng chèn các cột hoặc hàng mới nhưng không thay đổi nội dung của phạm vi được đặt tên . Tuy nhiên, nó không phải lúc nào cũng thực tế, đặc biệt nếu bạn đang nhận bảng tính từ bên thứ ba và do đó không kiểm soát được nội dung hoặc định dạng của nó. Trong trường hợp này, viết một truy vấn SQL cũng có thể hoạt động.
Truy vấn nguồn dữ liệu Excel
Giả sử chúng tôi không thể kiểm soát định dạng và chúng tôi không muốn dựa vào địa chỉ tuyệt đối mặc dù chúng tôi tin rằng trên thực tế sẽ có một số cột và hàng nhất định. Trong tình huống đó, điều tốt nhất nên làm là truy vấn. Dưới đây là một ví dụ chỉ chọn một hàng:
Dim db As DAO.Database Set db = DBEngine.OpenDatabase(vbNullString, False, False, "Excel 12.0 Xml;HDR=YES;IMEX=2;ACCDB=YES;DATABASE=C:\Links\Products.xlsx") Dim rs As DAO.Recordset Set rs = db.OpenRecordset("SELECT d.[Count] FROM [Sheet1$] AS d WHERE d.[Products] = 'Bananas';") Debug.Print rs.Fields(0).Value
Hy vọng rằng bạn có thể thấy điều này dễ dàng hơn nhiều so với việc lặp lại từng hàng để tìm hàng nào có “Chuối” và sau đó đọc cột sang phải để tính số lượng. Trong trường hợp này, truy vấn đánh bại việc tự động hóa Excel.
Kết luận
Bạn đã thấy rằng DAO giúp chúng tôi rất dễ dàng làm việc với nguồn dữ liệu Excel và giả vờ như thể đó là một nguồn dữ liệu quan hệ và sử dụng ngôn ngữ truy vấn yêu thích của chúng tôi và các đối tượng DAO quen thuộc thay vì viết một loạt mã VBA để Excel tự động tìm kiếm dữ liệu chúng tôi muốn. Các tham số chuỗi kết nối khá đơn giản và miễn là bạn có đường dẫn, bạn có thể liên kết hoặc mở bảng tính Excel.
Trong phần tiếp theo, chúng ta sẽ xem xét các thông số kết nối tệp văn bản.