PDA

Vollständige Version anzeigen : TransferSpreadsheet


Forza SGD
05.05.2011, 14:53
Hallo zusammen,

Ich gerade etwas verwirrt - ich importiere Excelsheets nach Access.

Die Struktur ist in Excel wie in Access gleich. Die Exceltabellen haben lediglich weniger Spalten. Quasi Spalte 1-3. Die Acccesstabelle hat Spalte 1 - 6. Spalten 4-6 sind leer und werden erst durch die Bearbeitung der DS in Access befüllt.

Wollte ich die Excelsheets so importieren kam die Fehlermeldung, dass die Splatenanzahl von importierenden und Zieltabelle nicht übereinstimmen.

Nun gehts auf einmal ohne zu murren.

In einer Anderen Version hatte ich die Accesstabelle nach dem Import mittels Alter Table erweitert.

Ist das nun notwendig? Oder sollte das Standardmäßig möglich sein eine Tabelle mit weniger Spalten als die Zieltabelle zu importieren?

Besten Dank schonmal!

ebs17
05.05.2011, 16:00
Bei Verwendung einer Anfügeabfrage kannst Du eine beliebige Anzahl an Feldern angeben (bei Beachtung von Pflichtfeldern und Indices).

Forza SGD
05.05.2011, 16:19
Hallo ebs,

Eben, also kann ich mir das Alter table schenken - aber hast du ne Idee, warum ich diese beschriebene Fehlermeldung verursacht habe?

ebs17
05.05.2011, 17:22
Ja, wie wolltest Du denn importieren?
Probiere es mal mit TransferSpreadsheet acLink (Verknüpfen).

Persönlich bevorzuge ich aber eine Variante wie
INSERT INTO Zieltabelle (Feld1, Feld2, ...)
SELECT T.Feld1, T.Feld2, ...
FROM [excel 12.0 xml;hdr=yes;imex=1;DATABASE=X:\eine\Exeldatei.xlsx].[Tabelle1$] AS T
Da spart man sich ein Datentypenproblem, das sich bei TransferSpreadsheet gerne ergibt.
Außerdem erspart man sich das separate Verknüpfen und das spätere Entfernen der Verknüpfung.

Forza SGD
05.05.2011, 17:47
TransferSpreadsheet acImport - aber die deinige Variante sieht schön aus, zumal ich auch mittels INSERT INTO diese Tabelle dann ins Archiv verschiebe.

Aber was haben die Properties hdr=yes;imex=1 zu bedeuten?

Und zum Schluß noch ne dumme Frage - was meinst du mit seperatem verknüpfen und entfernen. Oder beziehst du dich auf das ac Link? iost wahrscheinlich schon wieder zu spät für mich!

Danke für Deine Hilfe ebs!

ebs17
05.05.2011, 18:25
"HDR=Yes;" indicates that the first row contains columnnames, not data. "HDR=No;" indicates the opposite.

"IMEX=1;" tells the driver to always read "intermixed" (numbers, dates, strings etc) data columns as text. Note that this option might affect excel sheet write access negative.

Quelle: The Connection String Reference (http://www.connectionstrings.com/)

Forza SGD
05.05.2011, 18:33
Danke Danke - ich habs mal versucht bei mir so umzusetzen doch scheint es nicht zu funktionieren - habs wahrscheinlich an der falschen Stelle eingestellt.

Ich werde morgen mal den Code einstellen, wenn ich`s bis dahin noch nicht hinbekommen haben sollte.

Vielen dank ebs!

Forza SGD
05.05.2011, 18:54
Jut, es funktioniert. Hier mal meine beiden Varianten, da sich noch die ein oder andere Frage ergeben hat:

Variante 1:
Public Sub Import()

Dim objOutlook As Outlook.Application
Dim objNameSpace As Outlook.NameSpace
Dim objMailordner As Outlook.MAPIFolder
Dim objMail As Outlook.RemoteItem
Dim objAttachment As Outlook.Attachment
Dim i As Integer
Dim Anzahl As Integer
Dim strSQL As String

On Error GoTo Err_handler

Set objOutlook = New Outlook.Application
Set objNameSpace = objOutlook.GetNamespace("MAPI")
Set objMailordner = objNameSpace.GetDefaultFolder(olFolderInbox)

For i = 1 To objMailordner.Items.Count

For Each objAttachment In objMailordner.Items(i).attachments

If objAttachment.FileName Like "*.xlsx" Then
Anzahl = Anzahl + 1
objAttachment.SaveAsFile "U:\Daten\ZTV Neuversion\Mail\" & Anzahl & "_basis_kunden.xlsx"
strSQL = "INSERT INTO tbl_basis_kunden (kdnr, anr_txt, titel) " & _
"SELECT T.kdnr, T.anr_txt, T.titel " & _
"FROM [excel 12.0 xml;hdr=yes;imex=1;DATABASE=U:\Daten\ZTV Neuversion\Mail\" & Anzahl & "_basis_kunden.xlsx].[tbl_basis_kunden$] AS T"
CurrentDb.Execute strSQL, dbFailOnError
End If

Next
Next

Call MsgBox("Der Vorgang ist abgeschlossen. Es wurden die Bestellungen von " & Anzahl & " Teilnehmern importiert!", vbInformation, "Meldung")

Exit_Sub:

Set objAttachment = Nothing
Set objMail = Nothing
Set objMailordner = Nothing
Set objNameSpace = Nothing
Set objOutlook = Nothing

Exit Sub

Err_handler:

MsgBox "Fehlernummer: " & Err.Number _
& vbCrLf & "Beschreibung: " & Err.Description
Resume Next

End Sub


Ich habe zum Testen lediglich 3 Felder genommen. Aber mich würde noch interessieren warum hinter [tbl_basis_kunden$] bei der Angabe der Quelle noch zwingend ein $ stehen muss.

Variante 2:

For Each objAttachment In objMailordner.Items(i).attachments


If objAttachment.FileName Like "*.xlsx" Then
Anzahl = Anzahl + 1
objAttachment.SaveAsFile "U:\Daten\ZTV Neuversion\Mail\" & Anzahl & "_basis_kunden.xlsx"
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, "tbl_basis_kunden", "U:\Daten\ZTV Neuversion\Mail\" & Anzahl & "_basis_kunden.xlsx", True
End If

Next

Vor dem Importieren der Tabellen, werden jene unter Mail gespeichert. Liegen in diesem Ordner bereits gleichnamige Excel files gibt er mir bei Variante 1 an, dass er die Tabellen nicht speichern kann. Bei Variante 2 werden diese überschrieben. Das verstehe ich nicht :eek:


Siehst du hier noch andere mögliche Fehlerquellen.

Nochmals Danke und nen schönen feierabend ebs.

Gruß

Andreas

ebs17
05.05.2011, 19:01
Man muss beachten, welche Excelversion die Dateien haben (nicht alles wird einfacher):
... excel 12.0 xml ... ' für Excel >= 2007
... excel 8.0 ... ' für Excel 97-2003