Forbindelsesstrengparametre for Excel-datakilder
I den forrige artikel diskuterede jeg, hvordan vi kan behandle Excel- og tekstfiler, som om de var en database ved hjælp af DAO, og hvordan vi kan åbne dem uden at linke. Fordi de ikke bruger ODBC-drivere, vil deres forbindelsesstreng blive formateret helt anderledes end hvad du måske er vant til at se for en ODBC-forbindelsesstreng. Der er mangel på dokumentation om Excel-forbindelsesstrengparametrene. Dette er den bedste indsats for at dække nogle af hullerne og diskutere konsekvenserne af parametre.
Excel-forbindelsesstrengparametre
Selvom vi har 3 forskellige datakilde "typer":
Excel 8.0
:97-2003 xls-filerExcel 12.0
:xlsb-filerExcel 12.0 Xml
:xlsx-filer
De bruger alle de samme parametre.
Her er listen over parametre:
HDR
parameter:Overskriftsrække
YES
:Den første række er overskriften og skal blive kolonnenavnene for "tabellen"/"rekordsættet"
NO
:Den første række behandles ikke anderledes og er kun en data. Alle kolonnenavne vil blive navngivet "FN", hvor "N" er et tal, der starter med 1
IMEX
parameter:Import/eksportadfærd
Dette styrer, hvordan kolonnedatatyperne skal defineres, baseret på indholdet:
1
:Hvis kolonnen indeholder forskellige datatyper, skal du behandle den som en streng. Ellers skal du matche kolonnen med den bedste datatype.
2
:Tilpas altid kolonnen til en bestemt datatype baseret på prøven. Det kan forårsage en læsningsfejl, når vi læser en række, der indeholder data, der ikke matcher den forventede datatype.
ACCDB
parameter:Indikerer, at Access bruger ACCDB-filformat?
Som standard er dette altid sat ACCDB=YES i et accdb filformat. Men at udelade det eller sætte det til NO ser ud til at gøre ingenting. Det er lidt af et mysterium. Hvis nogen kan dele, hvilken effekt denne parameter har, så skriv en kommentar, så opdaterer jeg bloggen.
DATABASE:Sti til Excel-projektmappen
Parameteren skal indeholde en fuldt kvalificeret sti, inklusive projektmappens navn.
Minimum fungerende forbindelsesstreng
Bemærk, at DATABASE er den eneste obligatoriske parameter ud over nøgleordet for datatypekilden. Derfor kan en minimum fungerende forbindelsesstreng være:
Excel 8.0;DATABASE=C:\Links\Products.xls
Specificering af ark eller område i forbindelsesstrengen
I det forrige eksempel så du, at et ark repræsenterede en "DAO.TableDef
“. Regneark er dog ikke det eneste, der kan være en "Tabledef
“. Hvis Excel-regnearket indeholder et navngivet område, vil det navngivne område blive rapporteret som en "Tabledef
" såvel. Derudover kan vi "forespørge" en vilkårlig blok i arket ved hjælp af celleadresse. For eksempel:
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
Det er vigtigt at bemærke, at celleadresserne ikke må overskride arkets brugte rækkevidde. For eksempel, Products.xlsx
har faktisk kun indhold i A1:B3, det betyder, at hvis du åbner et rekordsæt ved hjælp af Sheet1$A1:D5, får du stadig kun 2 for feltantal og 3 for postantal. De ekstra tomme kolonner/rækker ignoreres simpelthen. På den anden side, hvis du snavsede en celle et sted uden for A1:B3
, arkets UsedRange
vil nu være lige så større, og forespørgsler vil så omfatte tomme kolonner og rækker.
Derfor er disse gyldige navne til brug i en forespørgsel på en Excel "database":
Sheet1$
– Hele det brugte område af et regneark.Sheet1$A1:B4
– Kun 2 kolonner og 3 rækker (overskrift tæller ikke med), forudsat at indholdet er udfyldt. Ellers kan kolonner eller rækker være færre end anmodet.ProductsRange
– det navngivne område med det navn.
Jeg synes, det er meget pænere at bruge navngivne områder, hvor det er praktisk, da dette sikrer, at du ikke hårdkoder adresserne i din kode, især hvis området bliver flyttet rundt på grund af, at brugeren indsætter nye kolonner eller rækker, men ikke ændrer indholdet af det navngivne område. . Det er dog ikke altid praktisk, især hvis du modtager regneark fra en 3. part og derfor ikke har kontrol over indholdet eller formaterne. I dette tilfælde kan det også fungere at skrive en SQL-forespørgsel.
Forespørger på Excel-datakilde
Antag, at vi ikke kan kontrollere formatet, og vi ikke ønsker at stole på absolut adresse, selvom vi er sikre på, at visse kolonner og rækker faktisk vil være til stede. I den situation er den bedste ting at gøre at forespørge. Her er et eksempel, der kun vælger én række:
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
Forhåbentlig kan du se, at dette er meget nemmere end at gentage hver række for at finde ud af, hvilken der har "bananer" og derefter læse kolonnen til højre for at få optællingen. I dette tilfælde slår forespørgsler automatisering af Excel.
Konklusion
Du har set, at DAO gør det meget nemt for os at arbejde med Excel-datakilde og lade som om det var en relationel datakilde og bruge vores foretrukne forespørgselssprog og velkendte DAO-objekter i stedet for at skrive en masse VBA-kode, der automatiserer Excel for at finde data vi ønsker. Forbindelsesstrengparametrene er ret ligetil, og så længe du har stien, er du god til at linke eller åbne et Excel-regneark.
I den næste artikel vil vi se på tekstfilforbindelsesparametre.