Lösung 1
Mit Ihrem Code konnte ich problemlos Daten aus einer Excel-Tabelle laden.
Überprüfen Sie jedoch bitte Ihre SQL-Abfrage, sie sollte etwa so lauten:
rsExcel.Open "SELECT * FROM [Sheet 1$]", cnnExcel
Die Regeln für die FROM
Teil wie folgt:
- Abfrage von für ein ganzes Arbeitsblatt:
SELECT * FROM [SheetName$]
beachten Sie die $
- Abfrage aus einem Bereich:
SELECT * FROM [SheetName$A1:C5]
- Abfrage aus einem benannten Bereich:
SELECT * FROM NameRange
- Abfrage von einem Arbeitsblatt, das nicht alphanumerische Zeichen enthält:
SELECT * FROM ['This;is.My SheetName$']
Der Code funktioniert auf meinem Rechner:
Dim cnnExcel As Object
Dim rsExcel As Object
Set cnnExcel = CreateObject("ADODB.Connection")
Set rsExcel = CreateObject("ADODB.RecordSet")
With cnnExcel
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Data Source=D:\Query1.xls;Extended Properties=Excel 8.0"
.CursorLocation = 3
.Open
End With
rsExcel.Open "SELECT * FROM [Sheet 1$]", cnnExcel
Debug.Print rsExcel.RecordCount ' Prints the number of rows containing data '
Do
Debug.Print "Col1: " & rsExcel.Fields(0) & " - Col2: " & rsExcel.Fields(1)
rsExcel.MoveNext
Loop While Not rsExcel.EOF
rsExcel.Close
Lösung 2
Möglicherweise haben Sie mehr Erfolg, wenn Sie die Excel-Arbeitsmappe direkt bearbeiten.
Nehmen wir an, Sie haben eine Tabelle MyTable
in Ihrer Access-Datenbank, in die Sie die Felder importieren möchten myA
, myB
y myC
(die den richtigen Datentyp haben, den Sie erwarten!) den Inhalt Ihrer Excel Sheet 1
die entsprechende Spalten hat.
Der vereinfachte VBA-Code würde wie folgt aussehen:
Sub ImportData(fname As String)
Dim xlo As Object
Dim xlWb As Object
Dim xlWs As Object
Dim colA, colB, ColC As Variant
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim thereIsData As Boolean
Dim row As Integer
' Open Excel sheet, try to re-use Excel if it is open '
On Error Resume Next
Set xlo = GetObject("Excel.Application")
If xlo Is Nothing Then Set xlo = CreateObject("Excel.Application")
On Error Goto 0
Set xlWb = xla.Workbooks.Open(fname)
Set xlWs = xlWb.Worksheets(1) ' Sheet 1'
' Open table where the results will be stored '
Set db = CurrentDb()
Set rs = db.OpenRecordset("MyTable", dbOpenDynaset)
Do
colA = xlWs.Cells(row, 1).Value
colB = xlWs.Cells(row, 2).Value
colC = xlWs.Cells(row, 3).Value
' We will stop at the first empty row '
thereIsData = Not (IsBlank(colA) And IsBlank(colB) And IsBlank(colC))
If thereIsData Then
' Add the Excel data to the table '
rs.AddNew
rs!myA = colA
rs!myA = colB
rs!myA = colC
rs.Update
End If
row = row + 1
Loop While thereIsData
rs.Close
' Cleanup '
Set rs = Nothing
Set db = Nothing
Set xlWs = Nothing
Set xlWb = Nothing
xla.DisplayAlerts = False
xla.Quit
Set xls = Nothing
End Sub
'-----------------------------------------------------------------------------
' True if the argument is Nothing, Null, Empty, Missing or an empty string .
'-----------------------------------------------------------------------------
Public Function IsBlank(arg As Variant) As Boolean
Select Case VarType(arg)
Case vbEmpty
IsBlank = True
Case vbNull
IsBlank = True
Case vbString
IsBlank = (arg = vbNullString)
Case vbObject
IsBlank = (arg Is Nothing)
Case Else
IsBlank = IsMissing(arg)
End Select
End Function