Параметри на низ за връзка за източници на данни в Excel
В предишната статия обсъдих как можем да третираме Excel и текстови файлове, сякаш са база данни, използвайки DAO, и как можем да ги отваряме без свързване. Тъй като те не използват ODBC драйвери, техният низ за връзка ще бъде форматиран съвсем различно от това, което може да сте свикнали да виждате за ODBC низ за връзка. Има недостиг на документация относно параметрите на низа за свързване на Excel. Това е най-доброто усилие за покриване на някои от пропуските и обсъждане на последиците от параметрите.
Параметри на низа за свързване в Excel
Въпреки че имаме 3 различни „типа“ източници на данни:
Excel 8.0
:97-2003 xls файловеExcel 12.0
:xlsb файловеExcel 12.0 Xml
:xlsx файлове
Всички те използват едни и същи параметри.
Ето списъка с параметри:
HDR
параметър:Заглавен ред
YES
:Първият ред е заглавието и трябва да стане имената на колоните за „таблицата“/“наборът от записи“
NO
:Първият ред не се третира по различен начин и е просто данни. Всички имена на колони ще бъдат наречени „FN“, където „N“ е число, започващо с 1
IMEX
параметър:Import/Export Behavior
Това урежда как трябва да се дефинират типовете данни в колоните въз основа на съдържанието:
1
:Ако колоната съдържа различни типове данни, третирайте я като низ. В противен случай съпоставете колоната с най-добрия тип данни.
2
:Винаги съпоставяйте колоната с определен тип данни въз основа на извадката. Това може да причини грешка при четенето, когато четем ред, който съдържа данни, които не съответстват на очаквания тип данни.
ACCDB
параметър:Показва, че Access използва файлов формат ACCDB?
По подразбиране това винаги е зададено ACCDB=YES във файлов формат accdb. Въпреки това, пропускането или задаването му на НЕ изглежда не прави нищо. Това е малко мистерия. Ако някой може да сподели какъв ефект има този параметър, публикувайте в коментар и аз ще актуализирам блога.
БАЗА ДАННИ:Път до работната книга на Excel
Параметърът трябва да съдържа напълно квалифициран път, включително името на работната книга.
Минимален работен низ за връзка
Имайте предвид, че DATABASE е единственият задължителен параметър в допълнение към ключовата дума източник на типа данни. Следователно минималният работещ низ за връзка може да бъде:
Excel 8.0;DATABASE=C:\Links\Products.xls
Указване на лист или диапазон в низ за връзка
В предишната проба видяхте, че лист представлява „DAO.TableDef
“. Работните листове обаче не са единственото нещо, което може да бъде „Tabledef
“. Ако електронната таблица на Excel съдържа именуван диапазон, наименуваният диапазон ще бъде отчетен като „Tabledef
” също. Освен това можем да „запитваме“ произволен блок в листа, използвайки адрес на клетка. Например:
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
Важно е да се отбележи, че адресите на клетките не могат да надвишават използвания диапазон на листа. Например Products.xlsx
всъщност има съдържание само в A1:B3, което означава, че ако отворите набор от записи с помощта на Sheet1$A1:D5, все още получавате само 2 за броя на полетата и 3 за броя на записите. Допълнителните празни колони/редове просто се игнорират. От друга страна, ако сте изцапали клетка някъде извън A1:B3
, UsedRange
на листа сега ще бъде толкова по-голям и заявката ще включва празни колони и редове.
Следователно това са валидни имена, които да се използват в заявка към „база данни“ на Excel:
Sheet1$
– Целият използван диапазон на работен лист.Sheet1$A1:B4
– Само 2 колони и 3 реда (без заглавието), при условие че съдържанието е попълнено. В противен случай колоните или редовете може да са по-малко от заявеното.ProductsRange
– наименуваният диапазон с това име.
Намирам, че е много по-приятно да използвате наименувани диапазони, където е практично, тъй като това гарантира, че няма да кодирате твърдо адресите в кода си, особено ако диапазонът се премества поради вмъкване на нови колони или редове от потребител, но без промяна на съдържанието на посочения диапазон . Това обаче не винаги е практично, особено ако получавате електронни таблици от трета страна и следователно нямате контрол върху тяхното съдържание или формати. В този случай писането на SQL заявка също може да работи.
Запитване на източник на данни в Excel
Да предположим, че не можем да контролираме формата и не искаме да разчитаме на абсолютен адрес, въпреки че сме уверени, че определени колони и редове всъщност ще присъстват. В тази ситуация най-доброто нещо, което можете да направите, е да попитате. Ето пример, който избира само един ред:
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
Надяваме се, че можете да видите, че това е много по-лесно, отколкото да преглеждате всеки ред, за да намерите кой от тях има „Банани“ и след това да четете колоната надясно, за да получите броя. В този случай заявките изпреварват автоматизирането на Excel.
Заключение
Видяхте, че DAO ни улеснява да работим с източник на данни в Excel и да се преструваме, че това е релационен източник на данни и да използваме любимия ни език за заявки и познати DAO обекти, вместо да пишем куп VBA код, автоматизиращ Excel, за да намерим данни, които искаме. Параметрите на низа за връзка са доста ясни и стига да имате пътя, вие сте добри за свързване или отваряне на електронна таблица в Excel.
В следващата статия ще разгледаме параметрите за свързване на текстови файлове.