使用VBA将数据从Excel插入Access

时间:2010-11-19 14:36:37

标签: excel excel-vba ado vba

我已经制作了一些代码来将excel表中的数据插入到访问数据库中 - 我的代码如下:

    Sub AddData()

Dim Cn As ADODB.Connection

Set Cn = New ADODB.Connection

'lets connect to the workbook first, I tested this, it works for me
Cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=sample.xls;Extended Properties=Excel 8.0;" _
& "Persist Security Info=False"

' Append data from Sheet1 of workbook to Table1 of mydb.mdb:
Cn.Execute "INSERT INTO tblSales IN 'C:\Users\User\Documents\access.mdb' SELECT * FROM [datasheet]"

Cn.Close
Set Cn = Nothing

End Sub

我的问题是,当执行此操作时,我收到错误“Microsoft Jet Engine无法找到对象的路径”数据表“。数据表只是数据在我的工作簿中的工作表的名称。任何帮助非常感谢

5 个答案:

答案 0 :(得分:1)

如果您在工作表名称后面加上$符号会发生什么 像这样[datasheet $] ?

答案 1 :(得分:0)

我认为您无法对任何打开的工作簿执行查询。它必须针对文件运行,这意味着您必须提供表单的完整路径,包括文件名。如果您的工作簿“脏”,则需要先保存它。 我宁愿

  • 循环工作表行并逐个添加记录
  • 或使用您刚刚从Access编写的代码(如果适用)

答案 2 :(得分:0)

据我所见,所有缺失的是数据源的路径和数据表上的字符串:

Data Source=sample.xls;

应阅读,例如:

Data Source=c:\docs\sample.xls;

SELECT * FROM [datasheet$]

答案 3 :(得分:0)

xlFilepath = Application.ThisWorkbook.FullName
Sql = "INSERT INTO tblSales " & _

"SELECT * FROM [Excel 12.0 Macro;HDR=YES;DATABASE=" & xlFilepath & "].[datasheet$A1:AK10011] "

cnn.Execute Sql

数据表中的警告表前8行。假设有一个标题(HDR =是) 接下来的6行应包含一个虚拟数据,以定义与访问表列定义等效的列。

答案 4 :(得分:-1)

SELECT语句在数据库本身上运行,但您想从EXCEL发送值。所以你必须使用

cn.Execute "INSERT .... VALUES (" & excelcell_or_variable & ");"

最终在循环中处理所有行/列等。

希望有所帮助

祝你好运

编辑...... 不要忘记CHAR和interpunctations周围的引号;我用

' ....
' .... "...VALUES (" & T(Q(MyStringCell)) & T(MyNumCell) & Q(MyLastTextCell) & ");"
' ....

' surrounds a string by single quotes
Private Function Q(Arg as String) As String
    Q = "'" & Arg & "'"
Return

' appens a comma to a string
Private Function T(Arg as String) As String
    T = Arg & ","
Return

编辑2 我认为在EXCEL中你要插入数据库的值都在一行......

假设您有一个包含多于1行的source_range,则必须为该范围内的每一行触发INSERT语句。您使用.Rows属性从范围返回单行。并使用.Cells(1, 1).Cells(1,2) ....等等,将多列发送到同一行的INSERT语句中

示例:

Sub Test()
Dim MyRange As Range, MyRow As Range

    Set MyRange = Range([B4], [C8])   ' source range

    For Each MyRow In MyRange.Rows    ' get one row at the time from source range 
        Debug.Print MyRow.Cells(1, 1), MyRow.Cells(1, 2)
        ' replace the above by your INSERT statement
    Next MyRow

End Sub