【问题标题】:VBA - SQL Import From Excel Sheet To Access DB - EXECUTION ERROR 3343VBA - 从 Excel 工作表导入 SQL 以访问数据库 - 执行错误 3343
【发布时间】:2021-01-31 00:43:26
【问题描述】:

我想构建一个SQL 请求,以便将我的所有工作表内容存储到访问数据库中,为此我构建了以下请求:

 sSQL = "INSERT INTO Archive_FP21 (Date_Histo,Caisse,Libelle,Reference_Contrat,Date_de_Nego,Date_Valeur,Echeance_Finale,Libelle_Index,Taux_Actuel,Capital_Origine,Capital_Restant_Du,Marge,Taux_du_cap,Taux_du_Floor,Derniere_Echance_INT,Derniere_Echeance_AMO,Interet,Prochaine_Echeance) " & _
    "SELECT * FROM [Feuil1$A:R] IN """ & WbPath & """"

但我面临以下问题:

3343 无法识别的数据库格式

[我觉得我的问题出在FROM [Feuil1$A:R] IN """ & WbPath & """"]

下面是我的完整代码子:

Sub archiver()
    
    Dim ws As DAO.Workspace
    Dim db As DAO.Database
    Dim sDb As String
    Dim sSQL As String
    Dim qdf As QueryDef
    Dim WbPath As String

    
WbPath = "C:\******\Extraction FP21 Mise en Forme Auto\16102020 - Copie.xlsx"

sDb = "C:\******\BaseFp21.accdb"
Set ws = DBEngine.Workspaces(0)
Set db = ws.OpenDatabase(sDb)

sSQL = "INSERT INTO Archive_FP21 (Date_Histo,Caisse,Libelle,Reference_Contrat,Date_de_Nego,Date_Valeur,Echeance_Finale,Libelle_Index,Taux_Actuel,Capital_Origine,Capital_Restant_Du,Marge,Taux_du_cap,Taux_du_Floor,Derniere_Echance_INT,Derniere_Echeance_AMO,Interet,Prochaine_Echeance) " & _
"SELECT * FROM [Feuil1$A:R] IN """ & WbPath & """"


db.Execute sSQL

End Sub

注意此 SQL 请求的目标是将工作表“Feui1.Range(A:R)”中的所有数据添加到我的访问表中。 我不能逐行填写,因为我有 37K 行要填写 Access。

我错过了什么?您将如何使用 VBA 从 Access DB 中的 excel 中填充 37K 行?

【问题讨论】:

  • 您在哪里放置和运行您的 VBA 代码?在要收集的 Excel 文件中或将成为存档的 Access 中,还是在另一个文件中?
  • @Tech-On-the_Beach 在将存档的 excel 文件之外的其他文件中。并且访问数据库应该存储需要归档的文件的内容。但是我的 VBA 模块在另一个工作簿中,而不是在存储数据的工作簿中。希望我足够清楚
  • @Tech-On-the_Beach 我添加了问题的屏幕截图,希望对您有所帮助......我被卡住了

标签: sql excel vba ms-access ms-access-2016


【解决方案1】:

使用 Access 连接从 Excel 工作簿内联查询不使用 IN 运算符,而是使用带有设置参数(如标题和工作簿类型)的括号标识符。使用时,IN 可以在您查询外部 Access 数据库但作为 Excel 工作簿时工作,数据库格式无法识别。

sSQL = "INSERT INTO Archive_FP21 (Date_Histo, Caisse, Libelle, Reference_Contrat," _
        & "                       Date_de_Nego, Date_Valeur, Echeance_Finale, " _
        & "                       Libelle_Index, Taux_Actuel, Capital_Origine, " _
        & "                       Capital_Restant_Du, Marge, Taux_du_cap, Taux_du_Floor, " _ 
        & "                       Derniere_Echance_INT, Derniere_Echeance_AMO, Interet, " _
        & "                       Prochaine_Echeance) " _
        & " SELECT * FROM [Excel 12.0 Xml;HDR=Yes;Database=" & WbPath & "].[Feuil1$A:R]"

db.Execute sSQL

此外,请务必避免使用SELECT * FROM 并明确选择命名列,尤其是在列到列映射的插入选择追加查询中。 SELECT Col1, Col2, Col3, ... FROM 更具可读性和可维护性,以防 Excel 列顺序应调整或某些列不再存在。

【讨论】:

  • 谢谢您的回答,excel文件的列名是否应该与DB字段匹配?如果没有你会怎么做?
  • 不,一般在insert-select SQL查询中,插入表的名称不必与选择源的名称匹配,但相应的列应按数据类型对齐。
猜你喜欢
  • 2017-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-08
  • 2010-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多