【问题标题】:Append data to Access Table with ADO using Excel VBA使用 Excel VBA 将数据附加到 ADO 访问表
【发布时间】:2019-01-15 23:11:36
【问题描述】:

我正在尝试使用 Excel VBA 将 Excel 数据附加到 Access 表中。

我的 Excel 工作表中有数据(活动工作表)。我想将 A4-BL4 行的内容附加到 Access 中名为 Table1 的表中。

我正在尝试使用 ADO 和记录集来执行此操作。

我的代码给了我一个错误

参数类型错误、超出可接受范围或相互冲突

上线:

 rs.Open qry, cn, adOpenKeyset

我是使用 Access 的新手。

从 Excel 而不是 Access 触发这一点至关重要

Sub EXPORT()

    Application.ScreenUpdating = False

    Dim cn As ADODB.Connection
    Dim rs As New ADODB.Recordset

    Set cn = New ADODB.Connection

    strcon = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
    "Data Source=C:\Users\yilmadu001\Desktop\Database.accdb;"
 
    cn.Open (strcon)

    qry = "SELECT * FROM Table1"
    rs.Open qry, cn, adOpenKeyset

    rs.AddNew
    rs.Fields("Date") = Range("A4").Value
    rs.Fields("Order Number") = Range("B4").Value
    rs.Fields("Product Code") = Range("C4").Value
    rs.Fields("E-Number") = Range("D4").Value
    rs.Fields("size") = Range("E4").Value
    rs.Fields("type") = Range("F4").Value
    rs.Fields("type2") = Range("G4").Value

    rs.Fields("Voltage") = Range("H4").Value
    rs.Fields("Compound") = Range("I4").Value
    rs.Fields("Number") = Range("J4").Value
    rs.Fields("Tag Number") = Range("K4").Value
    rs.Fields("Quantity") = Range("L4").Value
    rs.Fields("zero") = Range("M4").Value
    rs.Fields("net") = Range("N4").Value

    rs.Fields("Actual net") = Range("O4").Value
    rs.Fields("min") = Range("P4").Value
    rs.Fields("Actual min") = Range("Q4").Value
    rs.Fields("max1") = Range("R4").Value
    rs.Fields("max2") = Range("S4").Value
    rs.Fields("Top") = Range("T4").Value
    rs.Fields("2") = Range("U4").Value

    rs.Fields("side") = Range("V4").Value
    rs.Fields("5") = Range("W4").Value
    rs.Fields("Bottom") = Range("X4").Value
    rs.Fields("8") = Range("Y4").Value
    rs.Fields("side2") = Range("Z4").Value
    rs.Fields("10") = Range("AA4").Value
    rs.Fields("set1") = Range("AB4").Value

    rs.Fields("set2") = Range("AC4").Value
    rs.Fields("set3") = Range("AD4").Value
    rs.Fields("Usage1") = Range("AE4").Value
    rs.Fields("Usage2") = Range("AF4").Value
    rs.Fields("Main (%)") = Range("AG4").Value
    rs.Fields("A (%)") = Range("AH4").Value
    rs.Fields("ratio (%)") = Range("AI4").Value

    rs.Fields("set3") = Range("AJ4").Value
    rs.Fields("set4") = Range("AK4").Value
    rs.Fields("Core ") = Range("AL4").Value
    rs.Fields("Tip1") = Range("AM4").Value
    rs.Fields("Tip2") = Range("AN4").Value
    rs.Fields("Tip3") = Range("AO4").Value
    rs.Fields("set5") = Range("AP4").Value

    rs.Fields("speed") = Range("AQ4").Value
    rs.Fields("speed2") = Range("AR4").Value
    rs.Fields("speed3") = Range("AS4").Value
    rs.Fields("speed4") = Range("AT4").Value
    rs.Fields("speed5") = Range("AU4").Value
    rs.Fields("speed6") = Range("AV4").Value
    rs.Fields("speed7") = Range("AW4").Value

    rs.Fields("setting") = Range("AX4").Value
    rs.Fields("Selected") = Range("AY4").Value
    rs.Fields("S/U1") = Range("AZ4").Value
    rs.Fields("S/U2") = Range("BA4").Value
    rs.Fields("S/U3") = Range("BB4").Value

    rs.Fields("ON/OFF") = Range("BC4").Value
    rs.Fields("YES/NO") = Range("BD4").Value
    rs.Fields("NOTES") = Range("BE4").Value
    rs.Fields("Size1") = Range("BF4").Value
    rs.Fields("Size2") = Range("BG4").Value
    rs.Fields("Size3") = Range("BH4").Value
    rs.Fields("Temp1") = Range("BI4").Value

    rs.Fields("Temp2") = Range("BJ4").Value
    rs.Fields("Temp3") = Range("BK4").Value
    rs.Fields("Temp4") = Range("BL4").Value

    rs.Update

    rs.Close
    db.Close

    Application.ScreenUpdating = True

End Sub

【问题讨论】:

  • @HansUp 现在我在“rs.AddNew”行收到一个新错误,它说当前记录集不支持更新。这可能是提供者或所选锁类型的限制。
  • @HansUp 不幸的是,这些都不起作用,仍然错误“当前记录集不支持更新。这可能是提供者的限制,或所选锁类型的限制”
  • rs.Open "Table1", cn, adOpenKeyset, adLockPessimistic
  • @HansUp 似乎已修复它,但现在它给了我一个错误“无效的 SQL 语句应为“删除”、“插入”、“过程”、“选择”或“更新” " 在同一行,我想我错过了另一个论点
  • 见伊博的回答。对不起,我不使用 ADO;使用 DAO 会更容易。

标签: excel vba ms-access


【解决方案1】:

您需要指定您的记录集是可更新的:

rs.Open qry, cn, adOpenKeyset, adLockOptimistic

由于您的查询只是获取您可以使用adCmdTable 选项的所有记录,但您只需传递表的名称:

rs.Open "Table1", cn, adOpenKeyset, adLockOptimistic, adCmdTable

【讨论】:

  • rs.Open qry, cn, adOpenKeyset,adLockOptimistic, adCmdTable 行中的语法错误 FROM 子句
  • 不使用 adCmdTable 试试
  • 您的 ACCESS 数据库中有 Table1 吗?尝试关闭所有内容,因为如果您处于设计模式等,您的连接/查询将失败
  • 如果你使用adCmdTable,你只需要传递表名,而不是SQL查询,这就是导致这个错误的原因
  • 还对范围使用显式引用,例如使用rs("field1").value=WS.range("A1"),其中WS 是工作表对象(set WS=Thisworkbook.Worksheets("Sheet1"))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-09
  • 1970-01-01
  • 2012-07-11
  • 2010-09-26
  • 1970-01-01
相关资源
最近更新 更多