Centrum Skrypciarzy - Microsoft Office

W jaki sposób zaimportować arkusz programu Excel do bazy danych Access Database? Udostępnij na: Facebook

Skrypciarze odpowiadają na Wasze pytania

Cześć Skrypciarze!

Witamy w rubryce TechNet, w której Skrypciarze z firmy Microsoft odpowiadają na częste pytania dotyczące używania skryptów w administracji systemu. Jeśli macie jakieś pytania z tej dziedziny, zachęcamy do wysłania e-maila na adres: scripter@microsoft.com. Nie możemy zagwarantować odpowiedzi na każde otrzymane pytanie, ale staramy się jak możemy.

W jaki sposób zaimportować arkusz programu Excel do bazy danych Access Database?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! W jaki sposób zaimportować arkusz programu Excel do bazy danych Access Database?

-- IE

Cześć Skrypciarze! Odpowiedź

Cześć, IE. Czekaj! Nic nie mów! Pozwól nam zgadnąć... Tak, Twoja aura jest wyraźnie wyczuwalna... No właśnie – chcesz, byśmy napisali o importowaniu arkusza programu Excel do bazy danych Access. Zgadliśmy!

Być może nie zaimponowało to naszym czytelnikom, którzy sądzą pewnie, że każdy mógłby „przewidzieć” to pytanie, po prostu odczytując tytuł artykułu. To prawda, ale jak niby wyjaśnić, że przewidzieliśmy to we wczorajszym artykule?

Zabierajmy się więc do pracy:

Const acImport = 0

Const acSpreadsheetTypeExcel9 = 8



Set objAccess = CreateObject("Access.Application")

objAccess.OpenCurrentDatabase "C:\Scripts\Test.mdb"



objAccess.DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, _

    "Employees", "C:\Scripts\Employees.xls", True

No właśnie. Wiedzieliśmy, że pierwszą reakcją każdego, kto przeczyta ten skrypt, będzie: „eee, łatwizna”. To prawda – ten skrypt to łatwizna. Jak widać, zaczynamy od zdefiniowania stałej o nazwie acImport, której wartość ustawiamy na 0; dzięki temu skrypt wie, że będziemy importować, nie zaś eksportować dane. Następnie definiujemy drugą zmienną, zwaną acSpreadsheetTypeExcel9, której wartość ustawiamy na 8; informujemy w ten sposób skrypt, że będziemy importować arkusz Excel 2003. Do bazy Access można też importować arkusze w innych formatach:

StałaWartość
acSpreadsheetTypeExcel129
acSpreadsheetTypeExcel12Xml10
acSpreadsheetTypeExcel30
acSpreadsheetTypeExcel46
acSpreadsheetTypeExcel55
acSpreadsheetTypeExcel75
acSpreadsheetTypeExcel88
acSpreadsheetTypeExcel98
acSpreadsheetTypeLotusWJ24
acSpreadsheetTypeLotusWK12
acSpreadsheetTypeLotusWK33
acSpreadsheetTypeLotusWK47

Po zdefiniowaniu stałych, za pomocą poniższych dwóch wierszy kodu tworzymy wystąpienie obiektu Access.Application i otwieramy bazę danych C:\Scripts\Test.mdb (w tym celu wywołujemy metodę OpenCurrentDatabase):

Set objAccess = CreateObject("Access.Application")

objAccess.OpenCurrentDatabase "C:\Scripts\Test.mdb"

Teraz wystarczy wywołać metodę TransferSpreadsheet i zaimportować dane arkusza do bazy:

objAccess.DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, _

    "Employees", "C:\Scripts\Employees.xls", True

No tak, przewidywaliśmy to pytanie: oto opis parametrów przekazanych metodzie TransferSpreadsheet:

  • acImport, stała instruująca skrypt, że chcemy importować, nie zaś eksportować dane.
  • acSpreadsheetTypeExcel9, stała podająca format importowanego pliku .
  • “Employees”, nazwa tabeli w pliku Test.mdb, do której chcemy dodać dane z arkusza. Co się stanie, jeśli baza nie zawiera tabeli o nazwie Employees? Zostanie ona utworzona automatycznie.
  • “C:\Scripts\Employees.xls”, pełna ścieżka arkusza Excel, który chcemy zaimportować.
  • True, parametr HasFieldNames, instruujący skrypt, że pierwszy wiersz w arkuszu zawiera nazwy pól. Jak się można spodziewać, import ma większe szanse zadziałać, jeśli nazwy pól w bazie danych odpowiadają nazwom w arkuszu. Co jednak, jeśli tak nie jest? No cóż, w takim razie można zaimportować dane do nowej tabeli. Można także zmienić wartość parametru HasFieldNames na False, dzięki czemu skrypt po prostu dopasuje pierwszą kolumnę danych arkusza do pierwszego pola tabeli itd. Działa to bez kłopotu, ale należy się najpierw upewnić, że kolejność kolumno arkusza odpowiada kolejności pól tabeli. Jeśli np. tabela bazy danych ma pola o nazwach FirstName, LastName i Address, to arkusz powinien w pierwszej kolumnie zawierać imiona, w drugiej – nazwiska, a w trzeciej – adresy.

Dodajmy jeszcze, że ważne jest, aby typy danych również sobie odpowiadały. Jeśli w bazie danych mamy pole o nazwie EmployeeID, przyjmujące jedynie wartości numeryczne, nie należy importować do niego wartości nienumerycznych (np. identyfikatora 1234ABC).

Jeszcze jedno – istnieje także szósty, opcjonalny parametr (podawany po HasFieldNames), umożliwiający ograniczenie importu do podanego zakresu. Załóżmy np., że arkusz zawiera sześć kolumn z danymi (od A do F) i chcemy zaimportować z nich jedynie 25 pierwszych wierszy. Oznacza to zakres danych od A1 do F25 włącznie (A1:F25 po excelowemu). Do importu użyjemy poniższego polecenia:

objAccess.DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, _

    "Employees", "C:\Scripts\Employees.xls", True, "A1:F25"

Zanim ktoś zapyta – załóżmy, że chcemy zaimportować arkusz do nowoutworzonej, nie zaś istniejącej bazy danych. Czy to możliwe? Dla Skrypciarzy wszystko jest możliwe:

Const acImport = 0

Const acSpreadsheetTypeExcel9 = 8



Set objAccess = CreateObject("Access.Application")

objAccess.NewCurrentDatabase "C:\Scripts\New.mdb"



objAccess.DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, _

    "Employees", "C:\Scripts\Employees.xls", True

To prawda – jest to całkiem podobne do pierwszego skryptu. Różnica jest właściwie tylko jedna: tym razem nie używamy metody OpenCurrentDatabase do otwarcia istniejącej bazy danych. Zamiast tego, używając metody NewCurrentDatabase tworzymy nową bazę (C:\Scripts\New.mdb):

objAccess.NewCurrentDatabase "C:\Scripts\New.mdb"

I to już wszystko na dziś.

 Do początku strony Do początku strony

Centrum Skrypciarzy - Microsoft Office