Parametry připojovacího řetězce pro zdroje dat aplikace Excel
V předchozím článku jsem se zabýval tím, jak můžeme zacházet s Excelem a textovými soubory, jako by to byly databáze pomocí DAO, a jak je můžeme otevřít bez propojení. Protože nepoužívají ovladače ODBC, jejich připojovací řetězec bude formátován zcela odlišně od toho, co jste možná zvyklí vidět u připojovacího řetězce ODBC. Existuje nedostatek dokumentace o parametrech připojovacího řetězce aplikace Excel. Toto je nejlepší snaha pokrýt některé mezery a diskutovat o důsledcích parametrů.
Parametry připojovacího řetězce aplikace Excel
I když máme 3 různé „typy“ zdrojů dat:
Excel 8.0
:97-2003 soubory xlsExcel 12.0
:soubory xlsbExcel 12.0 Xml
:soubory xlsx
Všechny používají stejné parametry.
Zde je seznam parametrů:
HDR
parametr:řádek záhlaví
YES
:První řádek je záhlaví a měl by se stát názvy sloupců pro „table“/“recordset“
NO
:S prvním řádkem se nezachází jinak a je to pouze údaj. Všechny názvy sloupců budou pojmenovány „FN“, kde „N“ je číslo začínající 1
IMEX
parametr:Import/Export Behavior
To určuje, jak by měly být definovány datové typy sloupců na základě obsahu:
1
:Pokud sloupec obsahuje různé datové typy, zacházejte s ním jako s řetězcem. V opačném případě přiřaďte sloupec nejlepšímu datovému typu.
2
:Vždy přiřaďte sloupec k určitému datovému typu na základě vzorku. To může způsobit chybu při čtení, když čteme řádek obsahující data, která neodpovídají očekávanému datovému typu.
ACCDB
parametr:Označuje, že Access používá formát souboru ACCDB?
Ve výchozím nastavení je toto vždy nastaveno na ACCDB=YES ve formátu souboru accdb. Zdá se však, že jeho vynechání nebo nastavení na NE nic neudělá. Je to trochu záhada. Pokud se někdo může podělit o vliv tohoto parametru, napište do komentáře a já aktualizuji blog.
DATABÁZE:Cesta k excelovému sešitu
Parametr by měl obsahovat plně kvalifikovanou cestu včetně názvu sešitu.
Minimálně funkční připojovací řetězec
Všimněte si, že DATABASE je jediným povinným parametrem kromě klíčového slova zdroj dat. Minimální pracovní připojovací řetězec proto může být:
Excel 8.0;DATABASE=C:\Links\Products.xls
Určení listu nebo rozsahu v řetězci připojení
V předchozí ukázce jste viděli, že list představuje „DAO.TableDef
“. Listy však nejsou jedinou věcí, která může být „Tabledef
“. Pokud tabulka Excel obsahuje pojmenovaný rozsah, bude pojmenovaný rozsah hlášen jako „Tabledef
" také. Navíc můžeme „dotazovat“ libovolný blok v listu pomocí adresy buňky. Například:
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
Je důležité si uvědomit, že adresy buněk nemohou překročit použitý rozsah listu. Například Products.xlsx
ve skutečnosti má obsah pouze v A1:B3, to znamená, že pokud otevřete sadu záznamů pomocí List1$A1:D5, stále získáte pouze 2 pro počet polí a 3 pro počet záznamů. Nadbytečné prázdné sloupce/řádky jsou jednoduše ignorovány. Na druhou stranu, pokud jste zašpinili buňku někde mimo A1:B3
, UsedRange
listu bude nyní větší a dotazování by pak zahrnovalo prázdné sloupce a řádky.
Jedná se tedy o platná jména pro použití v dotazu v „databázi“ Excelu:
Sheet1$
– Celý použitý rozsah listu.Sheet1$A1:B4
– Pouze 2 sloupce a 3 řádky (bez záhlaví), za předpokladu, že je obsah vyplněn. V opačném případě může být počet sloupců nebo řádků menší, než je požadováno.ProductsRange
– pojmenovaný rozsah s tímto názvem.
Považuji za mnohem hezčí používat pojmenované rozsahy tam, kde je to praktické, protože to zajišťuje, že adresy ve svém kódu nekódujete napevno, zejména pokud se rozsah přesouvá kvůli tomu, že uživatel vkládá nové sloupce nebo řádky, ale nemění obsah pojmenovaného rozsahu. . Není to však vždy praktické, zvláště pokud přijímáte tabulky od třetí strany a nemáte tedy žádnou kontrolu nad jejich obsahem nebo formáty. V tomto případě může fungovat i psaní SQL dotazu.
Dotaz na zdroj dat aplikace Excel
Předpokládejme, že nemůžeme ovládat formát a nechceme se spoléhat na absolutní adresu, i když jsme si jisti, že určité sloupce a řádky budou ve skutečnosti přítomny. V takové situaci je nejlepší se zeptat. Zde je příklad výběru pouze jednoho řádku:
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
Doufejme, že vidíte, že je to mnohem snazší, než opakovat jednotlivé řádky, abyste zjistili, který z nich má „Banány“, a poté číst sloupec doprava, abyste získali počet. V tomto případě dotazování překonává automatizaci Excelu.
Závěr
Viděli jste, že DAO nám velmi usnadňuje práci se zdrojem dat Excel a předstírat, jako by to byl relační zdroj dat, a používat náš oblíbený dotazovací jazyk a známé objekty DAO místo psaní hromady kódu VBA automatizující Excel k nalezení data, která chceme. Parametry připojovacího řetězce jsou poměrně jednoduché, a pokud máte cestu, můžete propojit nebo otevřít excelovou tabulku.
V příštím článku se podíváme na parametry připojení textového souboru.