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
Hallo,
Welches Ergebnis wünscht Du denn?
Was ist "sheet1" und "sheet2" ?
schau mal in due VBA-Hilfe zu Transferspreadsheet.
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
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
Hallo Franz,
sheet1 ist der Name eines Tabellenblattes. Danke für die rasche Hilfe, werde es gleich ausprobieren!
Grüße 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
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.
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
Hallo,
bzgl. "!": Lies mal meinen Code genau... ::)
bzgl. "erste Zeile" : lass das "True" beim entspr. Import weg.
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
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.
.
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
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.
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
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