Öppna eller länka text eller Excel som datakällor i Microsoft Access
Access är ett fenomenalt verktyg för att arbeta med många datakällor. Du har kanske länge vetat att du enkelt kan importera eller exportera data i en mängd olika format. Vi hade dock ett scenario där vi behövde bearbeta data från externa datakällor. Bearbetningen körs ofta så import av data skulle blåsa upp front-end-filen snabbt. Dessutom, i denna situation, var det inte ett gångbart alternativ att skapa en andra kopia av Access-filen som en tillfällig databas för att undvika uppblåsthet. Vilka val hade vi? Det var där vi märkte en brist på information om att öppna eller länka till icke-relationella datakällor. Så låt oss göra en djupdykning i detta ämne.
Den här bloggserien syftar till att fylla ett gap i Microsofts dokumentation om att öppna eller länka till text eller Excel som datakälla i Access-applikationer. Connectionstrings.com och andra webbplatser tillhandahåller några brödsmulor. Du kan också vanligtvis upptäcka en del av beteendet genom att använda Access-guider och sedan undersöka objekten efteråt. Dock är det inte särskilt användbart att gissa. Därför kommer denna serie artiklar att diskutera hur man använder Excel- och textfiler som datakällor utan att nödvändigtvis importera eller exportera data.
Observera att serien inte skulle vara möjlig utan hjälp av Dan Haught och Jim Ferguson, som var medförfattare till Microsoft Jet Database Engine Programmer’s Guide. Även om boken är slut för länge sedan är den fortfarande en värdefull bok om du arbetar mycket med DAO.
Åtkomst och icke-relationella datakällor
Access har alltid stött att använda Indexed Sequential Access Method (ISAM) som en potentiell datakälla, vilket gör det möjligt att importera, länka eller exportera till icke-relationella datakällor som textfiler eller Excel-kalkylblad och till och med andra filformat som Exchange, dBASE eller FoxPro. DAO gör det möjligt eftersom det har ISAM-drivrutiner som kan fungera med dessa format. Men jag kommer att fokusera på textfiler och Excel-kalkylblad eftersom de är vanligare källor där vi behöver tillgång att arbeta med. Om allt du någonsin har gjort är att importera data med hjälp av fliken Externa data via Access kan det verka magiskt men i verkligheten är alla Access funktioner tillgängliga för oss som programmerare på DAO-nivå.
Så låt oss glömma att det finns trollkarlar. Låt oss glömma de glänsande ikonerna på bandet. Låt oss glömma att det finns länkade tabeller. Låt oss bara använda VBA-kod för att arbeta med datakällor, ur luften. Kan vi? Absolut. Först ska vi titta på skillnaden mellan att länka och öppna en datakälla.
Länkning kontra öppning
För att hjälpa till med terminologin måste vi göra skillnad mellan länkning kontra öppning . Länkning innebär att vi skapar en länkad tabell som nu är en Access "tabell" som vi kan använda precis som alla andra Access-tabeller. Som sådan är det ett permanent objekt som definieras i Access-applikationen. Däremot är öppning när vi kommer åt datakällan direkt genom att använda DAO:s OpenDatabase
metod. Till sin natur kommer att öppna en datakälla vanligtvis göras via VBA-kod som du kommer att se inom kort.
Ställa in proverna och koden
Eftersom serien handlar om att förstå de små detaljerna om hur Access interagerar med dessa datakällor, kommer vi först att fokusera på att öppna istället för att länka hit. Så, hur öppnar vi ett Excel-kalkylblad? Visst är det inte en databas? Låt oss sätta upp ett minimiexempel till att börja med. I en mapp, C:\Links
, skapar vi ett Excel-kalkylblad och en Access-databasfil med namnet Products.xlsx
och Sample.accdb
, respektive:
Products.xlsx är ett enkelt kalkylblad med endast ett ark med detta innehåll:
Med detta, låt oss lägga till VBA-kod i Sample.accdb
. I en standardmodul:
Public Sub OpenExcel() 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 tdf As DAO.TableDef For Each tdf In db.TableDefs Debug.Print tdf.Name Dim fld As DAO.Field For Each fld In tdf.Fields Debug.Print fld.Name, Next Debug.Print Dim rs As DAO.Recordset Set rs = tdf.OpenRecordset Do Until rs.EOF For Each fld In rs.Fields Debug.Print fld.Value, Next Debug.Print rs.MoveNext Loop Next End Sub
Om vi kör koden bör vi få följande utdata i vårt omedelbara fönster:
Products Count Apples 3 Bananas 5 Figs 8
Så även om Excel inte är en "databas" (och om du använder Excel som en databas, skam på dig 😉), kan vi fortfarande låtsas att det är en "databas" och iterera genom dess "tabeller" och "poster" använda välbekanta DAO-objekt. All magi kommer från denna anslutningssträng:
Excel 12.0 Xml;HDR=YES;IMEX=2;ACCDB=YES;DATABASE=C:\Links\Products.xlsx
Men det behöver inte vara magiskt. Serien kommer att dissekera delarna av anslutningssträngarna för drivrutiner för Excel och textfiler. Så låt oss börja med att jämföra med ODBC-anslutningssträng som du kanske är mer bekant med.
Datakälltyper
Om du har länkat till ODBC-datakällor har du förmodligen märkt att ODBC-anslutningssträngar vanligtvis ser ut ungefär så här:
ODBC;DRIVER=...;SERVER=...;DATABASE=...;
Undrade varför det alltid började med ODBC
? Den första delen är vad DAO använder för att identifiera typen av källa. Men eftersom Excel inte är en ODBC-databas måste vi använda Excel 12.0 Xml
för att indikera att DAO behöver använda en viss Excel-drivrutin. Resten av syntaxen för anslutningssträngen påverkas sedan av vilken drivrutin vi använder i den första delen av anslutningssträngen.
Här är en ofullständig lista över möjliga datakällor som MS Access kommer att känna igen:
Excel 8.0
:97-2003 xls-filerExcel 12.0
:xlsb-filerExcel 12.0 Xml
:xlsx-filerText
:Alla textfiler
Det finns fler datakällor, inklusive SharePoint, Exchange eller FoxPro, men jag tänker inte täcka dem. Trots det visar det att Access kan arbeta med dessa källor precis som en databas och det kan göra det möjligt för oss att använda DAO för att läsa innehållet. Observera att när vi använder icke-relationella datakällor kanske inte alla operationer stöds fullt ut. Du kanske till exempel inte får redigera en befintlig rad även om du kan infoga en rad.
En utmaning med att öppna eller länka till en datakälla innebär dock att du inte bara kan importera data till och sedan redigera schemat efter dina behov. Därför kan du upptäcka att standardschemat du får när du länkar inte kommer att vara det du vill ha. Av den anledningen kommer en djupgående förståelse av anslutningssträngen att vara viktig. Därför kommer du att lära dig mer om detaljerna i anslutningssträngarna för både Excel- och textfiler i kommande artiklar.
Slutsatser
Du såg att som ett alternativ till att importera extern data kan vi välja att länka eller till och med öppna en extern datakälla med DAO. Möjligheten att länka eller öppna en extern datakälla är mycket underutnyttjad. Möjligheten att länka eller öppna bör dock inte uteslutas eftersom detta kan öppna upp för nya scenarier som att undvika uppblåsthet som en effekt av import, särskilt i en låst miljö. I nästa artikel kommer jag att diskutera de olika parametrarna som används av Excel-drivrutinen för att konstruera en giltig anslutningssträng. I följande artiklar kommer jag att titta på textfilens drivrutin och anslutningsparametrarna. I den sista artikeln lägger vi ihop allt.