Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Importieren von zwei Excell-Tabellenblättern in eine Access-Tabelle

Begonnen von thorbrandt, Juni 14, 2010, 11:31:46

⏪ vorheriges - nächstes ⏩

thorbrandt

Hallo,

ich möchte eine Excelldatei in eine Access Tabelle importieren. Die Datei besteht aus zwei Tabellenblättern. Beide Blätter sollen eingelesen werden.
Ich habe es so versucht doch ich bekomme nicht das gewünschte Ergebniss:

DoCmd.TransferSpreadsheet acImport, , "ImportDestination", strFilename, True, sheet1
DoCmd.TransferSpreadsheet acImport, , "ImportDestination", strFilename, True, sheet2

Liegt es vielleicht daran dass ich zwei Zeilen Code verwende? kann ich die zwei Zeilen zu einer zusammenfügen durch zb. "sheet1"&"sheet2" ?

Danke schonmal im voraus
Thorbrandt

DF6GL

Hallo,



Welches Ergebnis wünscht Du denn?


Was ist "sheet1" und "sheet2" ?


schau mal in due VBA-Hilfe zu Transferspreadsheet.

thorbrandt

Hallo Franz,

Danke für die rasche Antwort!

sheet1 und sheet2 sind die Tabellenblätter der Excell-Datei. Es sollen aus der EINEN Excell-Tabelle beide Tabellenblätter importiert werden und in die Tabelle ImportDestination geschrieben werden.
Aus der Hilfe werde ich nicht so ganz schlau, da steht:
Geben Sie dieses Argument nicht an, wenn Sie die gesamte Kalkulationstabelle importieren möchten.

Mein erster Versuch war die Zeile:

DoCmd.TransferSpreadsheet acImport, , "ImportDestination", strFilename, True

So wurde jedoch immer nur das erste Tabellenblatt der Excell-Tabelle eingelesen.
Das selbe Ergebniss erhalte ich nun auch wenn ich das mit den beiden Zeilen:

DoCmd.TransferSpreadsheet acImport, , "ImportDestination", strFilename, True, sheet1
DoCmd.TransferSpreadsheet acImport, , "ImportDestination", strFilename, True, sheet2

versuche.

Nun dachte ich man kann das einlesen aus zwei Tabellenblättern der gleichen Datei in eine Zeile schreiben.

Gruss Thorbrandt

DF6GL

Hallo,

naja, immer noch unklar, was sheet1 ist: eine VBA-Variable, oder der Name eines Tabellenblattes ...


Dim strFilename As String, strSheetName1 as String, strSheetName2 as String

strFilename = "c:\Test.xls"
strSheetName1 = "Tabellenblattname1!"
strSheetName2 = "Tabellenblattname2!"
DoCmd.TransferSpreadsheet acImport, , "ImportDestination", strFilename, True, strSheetName1
DoCmd.TransferSpreadsheet acImport, , "ImportDestination", strFilename, True, strSheetName2


thorbrandt

Hallo Franz,

sheet1 ist der Name eines Tabellenblattes. Danke für die rasche Hilfe, werde es gleich ausprobieren!

Grüße Thorbrandt

thorbrandt

Hallo Franz und die anderen Access-Profis,

nochmal zu meinem Problem. Ich importiere mit dem Befehel "DoCmd.TransferSpreadsheet"  aus einem excelfile eine tabelle nach Access.
Das funktioniert wunderbar für die Tabelle auf dem ersten Tabellenblatt. Nun möchte ich nicht nur das erste Tabellenblatt importieren sondern auch das zb. vierte und fünfte.

sheet1 war bei meiner tabelle das erste tabellenblatt und sheet2 das zweite tabellenblatt.

Kann ich mit Transferspreadsheet auch das zweite Tabellenblatt importieren?
Am liebsten alle importierten Tabellenblätter gleich in eine Tabelle.

Hoffe es kann mit noch jemand helfen oder einen Tipp geben.

Gruß Thorbrandt

DF6GL

Hallo,

bin im Moment überfragt, ob Transferspreadsheet bei jedem Aufruf eine vorhanden Tabelle erst löscht und dann neu erstellt und importiert oder auch die Datensätze anfügt.  Importiere doch alle Sheets nacheinander in jeweils eine eigene Tabelle und füg die dann zu einer mit Hilfe von Anfügeabfragen zusammen.


Alternative Methode wäre die Verlinkung der Excel-Datei (als externe Tabelle(n) ) und Anhängen der einzelnen Blätter  mit o. g. Anfügeabfragen in einer Access-Tabelle.



thorbrandt

Hallo Franz,

ich habs zum laufen bekommen!
was fehlte war ein "!" nach dem ARBEITSBLATTNAMEN.

ich hab nun folgende (einfache) Zeilen welche mir meine Tabelle "ImportDestination" füllen:

DoCmd.TransferSpreadsheet acImport, , "ImportDestination", strFilename, True, "Sheet1!"
    DoCmd.TransferSpreadsheet acImport, , "ImportDestination", strFilename, True, "Sheet2!"

Was mir noch nicht so toll gefällt ist dass die erste Zeile des zweiten Tabellenblattes auch wieder in meiner Tabelle als Zeile vorkommt.

Das einfachste wird sein wohl sein nach den Datensätzen zu suchen und diese zu löschen...

Nochmals besten Dank für die Hilfe

Thorbrandt

DF6GL

Hallo,

bzgl. "!":  Lies mal meinen Code genau...  ::)

bzgl. "erste Zeile" : lass das "True" beim entspr. Import weg.

thorbrandt

Entschuldige Franz,

bin blutigster anfänger was access und vba angeht!

dein geposteter code hätte mich per copy and paste schneller zum ergebnis gebracht.

zu deinem tipp. ich hab bei der zweiten Zeile nun das True weggelassen. Allerdings kommt dann ein Fehler dass es das Feld 'F1' in der Zieltabelle nicht gibt.

Mit dieser Fehlermeldung kann ich leider nicht viel anfangen.

Gruß Thorbrandt

DF6GL

Hallo,

mhmm, stimmen denn die Strukturen beider Sheets überein? D. h. gleiche Spaltennamen und Anzahl?

Vielleicht ist auch das erste "True" falsch, das die Werte der ersten Zeile ja als Tabellenfeld-Namen definiert/interpretiert.
.


thorbrandt

Hallo Franz,

die Sheets sind immer gleich von der Struktur.
nun kommt aber ein anderes problem dazu.
die daten der sheets werden aus einem system ausgelesen. deshalb auch mehrere sheets weil die menge der daten schnell ueber 70000 datensätze erreicht. das auslesen des systems geht leider nur nach excel.
das heisst aber es ist durchaus möglich dass es 20 sheets in einer excelltabelle gibt.
es wäre also geschickter wenn man in access einfach sagen könnte:

IMPORTIERE ALLE SHEETS DER EXCELDATEI

also ohne genaue aussage Sheet1 und Sheet5 sondern einfach ALLE Sheets der Exceldatei.

hast du da vielleicht nen lösungsansatz für mich?

grüße thorbrandt

DF6GL

Hallo,

klar habe ich einen, nur der heißt:

Excel per Automation mit der xls-Datei öffnen, die Tabellenblätter nacheinander aktivieren und die "Datensätze" per Recordset (oder per zusammengebautem Insert-SQL-String) in die Access-Tabellen verfrachten.


(statt Recordset ginge natürlich auch die "dynamisierte" Transferspreadsheet-Methode. Jedenfalls müssen zuerst alle vorhandenen Tabellenblätter(namen) ausgelesen werden.

thorbrandt

Hallo Franz,

ich habe nun einen code erstellt der mir das gewünschte ergebnis bringt:

Dim AppExcel As New Excel.Application
    Dim ExcelWrkBook As Object
    Dim Sheetcount As Integer
    Dim sheetname As String
    Dim ExcelWorksheet As Object
    Dim i As Integer
    i = 1
     
     
   Set ExcelWrkBook = AppExcel.Workbooks.Open(pfad)
   Sheetcount = ExcelWrkBook.Worksheets.Count
   
   For Each ExcelWorksheet In ExcelWrkBook.Worksheets
       
       i = 1 + 1
           
       If ExcelWorksheet.Cells(1, 1).Value <> "" Then
           sheetname = ExcelWorksheet.Name
       
           DoCmd.TransferSpreadsheet acImport, , "ImportData", "Pfad", True, sheetname & "!" 'strSheetName1
       
       End If
   
       sheetname = ""
   
   
   Next

   ExcelWrkBook.Close
   AppExcel.Application.Quit

   Set AppExcel = Nothing


Es gibt nur noch das Problem das Excel sich nicht wieder schliesst -es läuft immer ein prozess im hintergrund weiter.
kommt wohl davon dass ich es mit meinem code zweimal öffne...

hast du nen tipp?

Gruss Thorbrandt

DF6GL

Hallo,

versuch:


Dim AppExcel As New Excel.Application
    Dim ExcelWrkBook As Object
    Dim Sheetcount As Integer
    Dim sheetname As String
    Dim ExcelWorksheet As Object
    Dim i As Integer
    Dim xlssheets As Sheets
    i = 1
     
   Set ExcelWrkBook = AppExcel.Workbooks.Open("c:\test.xls")
   Sheetcount = ExcelWrkBook.Worksheets.Count
   AppExcel.Visible = True
   
   Set xlssheets = ExcelWrkBook.Worksheets
   For Each ExcelWorksheet In xlssheets
       i = 1 + 1

       If ExcelWorksheet.Cells(1, 1).Value <> "" Then
           sheetname = ExcelWorksheet.Name

          ' DoCmd.TransferSpreadsheet acImport, , "ImportData", "Pfad", True, sheetname & "!" 'strSheetName1

       End If

       sheetname = ""


   Next

   ExcelWrkBook.Close
   Set xlssheets = Nothing
   Set ExcelWorksheet = Nothing
   Set ExcelWrkBook = Nothing
   
   AppExcel.Quit

   Set AppExcel = Nothing