Parameter String Koneksi untuk Sumber Data Excel
Pada artikel sebelumnya, saya membahas bagaimana kita dapat memperlakukan file Excel dan teks seolah-olah mereka adalah database menggunakan DAO, dan bagaimana kita dapat membukanya tanpa menautkan. Karena mereka tidak menggunakan driver ODBC, string koneksi mereka akan diformat sangat berbeda dari apa yang mungkin biasa Anda lihat untuk string koneksi ODBC. Ada kelangkaan dokumentasi tentang parameter string koneksi Excel. Ini adalah upaya terbaik untuk menutupi beberapa kesenjangan dan mendiskusikan konsekuensi parameter.
Parameter string koneksi Excel
Meskipun kami memiliki 3 "jenis" sumber data yang berbeda:
Excel 8.0
:97-2003 file xlsExcel 12.0
:file xlsbExcel 12.0 Xml
:file xlsx
Semuanya menggunakan parameter yang sama.
Berikut adalah daftar parameternya:
HDR
parameter:Baris header
YES
:Baris pertama adalah header dan harus menjadi nama kolom untuk “tabel”/”recordset”
NO
:Baris pertama tidak diperlakukan berbeda dan hanya data. Semua nama kolom akan diberi nama “FN” di mana “N” adalah angka yang dimulai dengan 1
IMEX
parameter:Perilaku Impor/Ekspor
Ini mengatur bagaimana tipe data kolom harus didefinisikan, berdasarkan konten:
1
:Jika kolom berisi tipe data yang berbeda, perlakukan sebagai string. Jika tidak, cocokkan kolom dengan tipe data terbaik.
2
:Selalu cocokkan kolom dengan tipe data tertentu berdasarkan sampel. Hal tersebut dapat menyebabkan kesalahan pembacaan saat kita membaca baris yang berisi data yang tidak sesuai dengan tipe data yang diharapkan.
ACCDB
parameter:Menunjukkan bahwa Access menggunakan format file ACCDB?
Secara default, ini selalu disetel ACCDB=YES dalam format file accdb. Namun, menghilangkannya atau menyetelnya ke NO tampaknya tidak menghasilkan apa-apa. Ini sedikit misteri. Jika ada yang bisa membagikan apa efek parameter ini, posting di komentar dan saya akan memperbarui blog.
DATABASE:Jalur ke buku kerja Excel
Parameter harus berisi jalur yang sepenuhnya memenuhi syarat, termasuk nama buku kerja.
String koneksi kerja minimum
Perhatikan bahwa DATABASE adalah satu-satunya parameter wajib selain kata kunci sumber tipe data. Oleh karena itu, string koneksi kerja minimum dapat menjadi:
Excel 8.0;DATABASE=C:\Links\Products.xls
Menentukan lembar atau rentang dalam string koneksi
Pada contoh sebelumnya, Anda melihat bahwa sebuah sheet mewakili “DAO.TableDef
“. Namun, lembar kerja bukan satu-satunya hal yang dapat menjadi “Tabledef
“. Jika spreadsheet Excel berisi rentang bernama, rentang bernama akan dilaporkan sebagai “Tabledef
" demikian juga. Selain itu, kami dapat "meminta" blok arbitrer di lembar menggunakan alamat sel. Misalnya:
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
Penting untuk dicatat bahwa alamat sel tidak boleh melebihi rentang yang digunakan lembar. Misalnya, Products.xlsx
hanya benar-benar memiliki konten di A1:B3, itu berarti jika Anda membuka recordset menggunakan Sheet1$A1:D5, Anda masih mendapatkan hanya 2 untuk jumlah bidang dan 3 untuk jumlah catatan. Kolom/baris ekstra kosong diabaikan begitu saja. Di sisi lain, jika Anda mengotori sel di suatu tempat di luar A1:B3
, UsedRange
dari sheet sekarang akan menjadi lebih besar dan kueri akan menyertakan kolom dan baris kosong.
Oleh karena itu, itu adalah nama yang valid untuk digunakan dalam kueri pada "basis data" Excel:
Sheet1$
– Seluruh rentang lembar kerja yang digunakan.Sheet1$A1:B4
– Hanya 2 kolom dan 3 baris (tidak termasuk header), asalkan isinya terisi. Jika tidak, kolom atau baris mungkin kurang dari yang diminta.ProductsRange
– rentang bernama dengan nama itu.
Saya merasa jauh lebih baik untuk menggunakan rentang bernama di mana praktis karena ini memastikan bahwa Anda tidak mengkodekan alamat dalam kode Anda terutama jika rentang dipindahkan karena pengguna memasukkan kolom atau baris baru tetapi tidak mengubah konten dari rentang bernama . Namun itu tidak selalu praktis, terutama jika Anda menerima spreadsheet dari pihak ketiga dan karena itu tidak memiliki kendali atas konten atau formatnya. Dalam hal ini, menulis kueri SQL juga dapat berfungsi.
Meminta sumber data Excel
Misalkan kita tidak dapat mengontrol format dan tidak ingin bergantung pada alamat absolut meskipun kita yakin bahwa kolom dan baris tertentu akan benar-benar ada. Dalam situasi itu, hal terbaik yang harus dilakukan adalah bertanya. Berikut ini contoh yang memilih hanya satu baris:
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
Semoga Anda dapat melihat ini jauh lebih mudah daripada mengulangi setiap baris untuk menemukan mana yang memiliki "Pisang" dan kemudian membaca kolom ke kanan untuk mendapatkan hitungannya. Dalam hal ini, kueri mengalahkan otomatisasi Excel.
Kesimpulan
Anda telah melihat bahwa DAO membuatnya sangat mudah bagi kami untuk bekerja dengan sumber data Excel dan berpura-pura seolah-olah itu adalah sumber data relasional dan menggunakan bahasa kueri favorit kami dan objek DAO yang familier alih-alih menulis sekumpulan kode VBA yang mengotomatiskan Excel untuk menemukan data yang kita inginkan. Parameter string koneksi cukup mudah dan selama Anda memiliki jalurnya, Anda dapat menautkan atau membuka spreadsheet Excel.
Pada artikel berikutnya kita akan melihat parameter koneksi file teks.