Раствор 1
Используя ваш код, я смог без проблем загрузить данные из листа Excel.
Однако, пожалуйста, проверьте ваш SQL-запрос, он должен выглядеть примерно так:
rsExcel.Open "SELECT * FROM [Sheet 1$]", cnnExcel
Правила для части FROM
следующие:
- Запрос для всей таблицы:
SELECT * FROM [SheetName$]
, обратите внимание на $
- Запрос из диапазона:
SELECT * FROM [SheetName$A1:C5]
- Запрос из именованного диапазона:
SELECT * FROM NameRange
- Запрос из таблицы, содержащей не алфавитно-цифровые символы:
SELECT * FROM ['This;is.My SheetName$']
Код работающий на моей машине:
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
Раствор 2
Возможно, вам больше повезет с непосредственным управлением книгой Excel.
Предположим, у вас есть таблица MyTable
в вашей базе данных Access, куда вы хотите импортировать в поля myA
, myB
и myC
(которые имеют нужный вам тип данных!) Содержимое вашего Excel Sheet 1
имеет соответствующие столбцы.
Упрощенный код VBA будет выглядеть так:
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