Parametry ciągu połączenia dla źródeł danych Excel
W poprzednim artykule omówiłem, w jaki sposób możemy traktować Excel i pliki tekstowe tak, jakby były bazą danych przy użyciu DAO i jak możemy je otwierać bez łączenia. Ponieważ nie używają sterowników ODBC, ich parametry połączenia będą sformatowane zupełnie inaczej niż te, do których można przywyknąć w przypadku parametrów połączenia ODBC. Brakuje dokumentacji dotyczącej parametrów parametrów połączenia programu Excel. Jest to najlepszy sposób na pokrycie niektórych luk i omówienie konsekwencji parametrów.
Parametry ciągu połączenia programu Excel
Mimo że mamy 3 różne „typy” źródeł danych:
Excel 8.0
:97-2003 pliki xlsExcel 12.0
:pliki xlsbExcel 12.0 Xml
:pliki xlsx
Wszystkie używają tych samych parametrów.
Oto lista parametrów:
HDR
parametr:Wiersz nagłówka
YES
:Pierwszy wiersz jest nagłówkiem i powinien stać się nazwami kolumn dla „tabeli”/”zestawu rekordów”
NO
:Pierwszy wiersz nie jest traktowany inaczej i zawiera tylko dane. Wszystkie nazwy kolumn będą miały nazwę „FN”, gdzie „N” jest liczbą zaczynającą się od 1
IMEX
parametr:Zachowanie importu/eksportu
To reguluje sposób definiowania typów danych kolumn na podstawie zawartości:
1
:Jeśli kolumna zawiera różne typy danych, potraktuj ją jako ciąg. W przeciwnym razie dopasuj kolumnę do najlepszego typu danych.
2
:Zawsze dopasowuj kolumnę do określonego typu danych na podstawie próbki. Może to spowodować błąd w odczycie, gdy odczytamy wiersz zawierający dane, które nie pasują do oczekiwanego typu danych.
ACCDB
parametr:wskazuje, że program Access używa formatu pliku ACCDB?
Domyślnie jest to zawsze ustawione ACCDB=YES w formacie pliku accdb. Jednak pominięcie go lub ustawienie go na NIE wydaje się nic nie robić. To trochę tajemnica. Jeśli ktoś może podzielić się wpływem tego parametru, opublikuj w komentarzu, a ja zaktualizuję bloga.
BAZA DANYCH:Ścieżka do skoroszytu Excel
Parametr powinien zawierać w pełni kwalifikowaną ścieżkę, w tym nazwę skoroszytu.
Minimalny ciąg roboczy połączenia
Należy zauważyć, że DATABASE jest jedynym obowiązkowym parametrem oprócz słowa kluczowego źródła typu danych. Dlatego minimalny działający ciąg połączenia może wynosić:
Excel 8.0;DATABASE=C:\Links\Products.xls
Określanie arkusza lub zakresu w ciągu połączenia
W poprzednim przykładzie zauważyłeś, że arkusz reprezentuje „DAO.TableDef
“. Jednak arkusze nie są jedyną rzeczą, która może być „Tabledef
“. Jeśli arkusz kalkulacyjny Excel zawiera nazwany zakres, nazwany zakres zostanie zgłoszony jako „Tabledef
" także. Dodatkowo możemy „zapytać” o dowolny blok w arkuszu za pomocą adresu komórki. Na przykład:
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
Należy pamiętać, że adresy komórek nie mogą przekraczać zakresu używanego arkusza. Na przykład Products.xlsx
w rzeczywistości ma zawartość tylko w A1:B3, co oznacza, że jeśli otworzysz zestaw rekordów za pomocą Arkusza1$A1:D5, nadal otrzymasz tylko 2 dla liczby pól i 3 dla liczby rekordów. Dodatkowe puste kolumny/wiersze są po prostu ignorowane. Z drugiej strony, jeśli zabrudziłeś komórkę gdzieś poza A1:B3
, UsedRange
arkusza będzie teraz tak samo większy, a zapytania będą wtedy zawierać puste kolumny i wiersze.
Dlatego są to prawidłowe nazwy do użycia w zapytaniu w „bazie danych” Excela:
Sheet1$
– Cały używany zakres arkusza roboczego.Sheet1$A1:B4
– Tylko 2 kolumny i 3 wiersze (nie licząc nagłówka), pod warunkiem, że zawartość jest wypełniona. W przeciwnym razie kolumny lub wiersze mogą być mniejsze niż żądane.ProductsRange
– nazwany zakres o tej nazwie.
Uważam, że o wiele przyjemniej jest używać nazwanych zakresów tam, gdzie jest to praktyczne, ponieważ zapewnia to, że nie kodujesz na stałe adresów w kodzie, zwłaszcza jeśli zakres jest przesuwany z powodu wstawienia przez użytkownika nowych kolumn lub wierszy, ale nie zmieniania zawartości nazwanego zakresu . Jednak nie zawsze jest to praktyczne, zwłaszcza jeśli otrzymujesz arkusze kalkulacyjne od strony trzeciej i dlatego nie masz kontroli nad ich zawartością ani formatami. W takim przypadku można również napisać zapytanie SQL.
Odpytywanie źródła danych Excel
Załóżmy, że nie możemy kontrolować formatu i nie chcemy polegać na adresie bezwzględnym, nawet jeśli jesteśmy pewni, że pewne kolumny i wiersze rzeczywiście będą obecne. W takiej sytuacji najlepiej jest wykonać zapytanie. Oto przykład, w którym zaznaczono tylko jeden wiersz:
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
Mam nadzieję, że widać, że jest to znacznie łatwiejsze niż iterowanie po każdym wierszu, aby znaleźć, który z nich zawiera „Banany”, a następnie czytanie kolumny w prawo, aby uzyskać liczbę. W takim przypadku wykonywanie zapytań bije na głowę automatyzację programu Excel.
Wniosek
Widzieliście, że DAO bardzo ułatwia nam pracę ze źródłem danych Excel i udawanie, że jest to relacyjne źródło danych, i używamy naszego ulubionego języka zapytań i znanych obiektów DAO zamiast pisać mnóstwo kodu VBA automatyzującego Excel, aby znaleźć dane, które chcemy. Parametry parametrów połączenia są dość proste i jeśli masz ścieżkę, możesz łączyć lub otwierać arkusz kalkulacyjny Excel.
W następnym artykule przyjrzymy się parametrom połączenia pliku tekstowego.