【问题标题】:Insert Data from Excel into Access将 Excel 中的数据插入 Access
【发布时间】:2010-11-19 14:36:36
【问题描述】:

我已经编写了一些代码来将数据从 excel 表插入到 access 数据库中 - 我的代码如下:

    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 找不到对象“数据表”的路径。数据表只是我的工作簿中数据所在工作表的名称。非常感谢任何帮助.

【问题讨论】:

    标签: excel vba ms-access ado


    【解决方案1】:

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

    【讨论】:

    • 它会,如果你添加文件的全名。
    【解决方案2】:

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

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

    【讨论】:

    • 循环很慢,ADO 很快。您不需要打开的工作簿,但您可以针对当前工作簿运行 ADO,前提是您已保存。
    【解决方案3】:

    据我所知,缺少的只是数据源的路径和数据表上的字符串:

    Data Source=sample.xls;
    

    应该阅读,例如:

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

    还有:

    SELECT * FROM [datasheet$]
    

    【讨论】:

      【解决方案4】:
      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=YES) 接下来的 6 行应该包含一个虚拟数据来定义与访问表列定义等效的列。

      【讨论】:

        【解决方案5】:

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

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

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

        希望有帮助

        祝你好运

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

        ' ....
        ' .... "...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 行中...

        假设您有一个包含多于 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
        

        【讨论】:

        • 看我的编辑...注意接收插入的数据类型;当然,您的插入必须满足所有表约束(即非空值、引用等)并采用数据库想要查看的格式(日期!!)
        • 感谢您的帮助 - 如果我想选择一个范围,这将如何工作?例如 A:E?
        • ahhh .... 所以我认为你现在得到了引文和标点符号... 很好... 其余的请参阅我的 EDIT 2 ... 希望对您有所帮助 :-)跨度>
        • 这根本不是真的。使用 ADO 从 Excel 工作表更新到 Access 是完全可能的。请重新考虑您的答案。
        猜你喜欢
        • 2013-01-02
        • 2012-07-26
        • 1970-01-01
        • 2010-12-04
        • 1970-01-01
        • 1970-01-01
        • 2013-07-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多