【问题标题】:Export data to Access from Excel VBA将数据从 Excel VBA 导出到 Access
【发布时间】:2018-09-13 05:10:59
【问题描述】:

我是一个全新的访问和努力了解如何将访问表/列/行格式与 VBA 中的 Excel 导出相关联。

我创建了一个名为 Data 的访问表和三列 Food、Drinks、Color

我想从我的 excel 电子表格中将这些单元格范围导出到 Access:

Foodrng = Workbooks(xlFile).Sheets("ToBeExported").Range("D6")
Drinksrng = Workbooks(xlFile).Sheets("ToBeExported").Range("E6")
Colorrng= Workbooks(xlFile).Sheets("ToBeExported").Range("B12:B21")

网上的一切都说我应该使用它,因为我的版本:

strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;"

我想使用INSERT TO 格式来写入我的数据库,因为我将扩展数据库列相当多,我觉得这是跟踪哪个方向的最简单方法。

strSql = "INSERT INTO Data (Food, Drinks, Color) VALUES (Foodrng, Drinksrng,Colorrng)"

执行时总是遇到语法错误:

Set rs = cn.Execute(strSql)

使用上述方法导出到Access数据库的正确方法是什么?任何/所有信息都会非常有用,因为我是 Access 的新手

我的完整代码:

    Foodrng = Workbooks(xlFile).Sheets("ToBeExported").Range("D6")
    Drinksrng = Workbooks(xlFile).Sheets("ToBeExported").Range("E6")
    Colorrng= Workbooks(xlFile).Sheets("ToBeExported").Range("B12:B21")

    Set cn = CreateObject("ADODB.Connection")
    strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
        "Data Source= C:\Users\User1\MyDBase.accdb"
    cn.Open strConnection

   strSql = "INSERT INTO Data (Food, Drinks, Color) VALUES (Foodrng, Drinksrng,Colorrng)"

    Set rs = cn.Execute(strSql)
    'MsgBox rs.Fields(0) & " rows in MyTable"
    rs.Close
    Set rs = Nothing
    cn.Close
    Set cn = Nothing

【问题讨论】:

  • 我对 SQL 不太擅长,但也许您需要传递变量的引用而不是文字字符串? strSql = "INSERT INTO Data (Food, Drinks, Color) VALUES (" & Foodrng & ", " & Drinksrng & ", " & Colorrng & ")"(如果不行,你也可以试试Foodrng.Address

标签: excel vba ms-access export


【解决方案1】:

使用查询插入时,需要使用参数传递值。我强烈建议使用记录集而不是插入查询。

普通的插入查询一次只能插入一行。您需要调整代码以一次插入一行。您可以使用记录集,也可以对每一行执行查询。

Foodrng = Workbooks(xlFile).Sheets("ToBeExported").Range("D6") 'Adjust ranges to select single cells
Drinksrng = Workbooks(xlFile).Sheets("ToBeExported").Range("E6")
Colorrng= Workbooks(xlFile).Sheets("ToBeExported").Range("B12:B21")

Set cn = CreateObject("ADODB.Connection")
strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
    "Data Source= C:\Users\User1\MyDBase.accdb"
cn.Open strConnection

strSql = "INSERT INTO [Data] ([Food], [Drinks], [Color]) VALUES (?, ?, ?)"
Dim cmd As ADODB.Command
Set cmd = New ADODB.Command
With cmd
    Set .ActiveConnection = cn
    .CommandText = strSql
    .Parameters.Append .CreateParameter(, adVarWChar, adParamInput, , foodRng) 'adVarWChar for text 
    .Parameters.Append .CreateParameter(, adInteger, adParamInput, , Drinksrng) 'adInteger for whole numbers (long or integer)
    .Parameters.Append .CreateParameter(, adInteger, adParamInput, , Colorrng)
    .Execute
End With
cn.Close

【讨论】:

  • @Parfait 不,这不起作用,这就是代码注释调整范围以选择单个单元格的原因。正确的方法是使用记录集并遍历单元格。甚至更好:从 Access 导入而不是从 Excel 导出。这样,您可以更轻松地进行自定义。
  • @Parfait 我想这是真的。添加了说明。
  • 编译错误:未定义用户定义类型。这发生在第一个和第二个 cmd 变量上
  • 如果要使用 ADO,请设置对 ADO(Microsoft ActiveX 数据对象)的引用。用后期绑定做这一切是非常困难的。
  • 我将有多个具有不同版本访问权限的用户(因此不同的库版本)。不会使用早期绑定导致不必要的问题?
【解决方案2】:

也许还有另外一两个方法,也许值得考虑。

首先是将您的 Excel 电子表格设置为 Access 中的链接表 - 也许可以使用 VBA 完成。这将为您节省复制数据的要求。您还可以设置目标工作表并直接从 ADODB 使用 insert..select 将数据从 Access 插入 Excel。

第二,如果您的要求允许,则完全避免使用 Access。 Excel在一定程度上可以作为数据库使用,支持SQL查询。 https://selectcompare.com/blogs/news/write-select-statements-for-excel-spreadsheets

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    • 1970-01-01
    相关资源
    最近更新 更多