【问题标题】:insert data from one excel file to another one using ADODB使用 ADODB 将数据从一个 Excel 文件插入另一个文件
【发布时间】:2017-08-02 03:31:28
【问题描述】:

我正在尝试使用 adodb 将数据从一个 excel 文件插入到另一个文件中,并遇到了插入方法的问题。它给了我如下错误消息:

INSERT INTO 语句中的语法错误

我尝试了不同的日期格式,带引号和不带引号,我还尝试了不同的记录集方法,但这个 sql 语句仍然存在同样的问题。 有人可以帮我找出问题所在吗?

Public Sub InsertIntoTable() 

Set objConnection = CreateObject("ADODB.Connection")


objConnection.Open _
    "Provider = Microsoft.Jet.OLEDB.4.0; " & _
        "Data Source=C:\Users\User1\Documents\Excel files\tracker.xls; Extended Properties=""Excel 8.0;HDR=Yes"""


mySQL = "INSERT INTO ResourceTasks (Name, Task, Date, Load) VALUES ('Name11', 'task2'," & CDate("24 / 5 / 2017") & ", 0.50)"

Debug.Print mySQL

objConnection.Execute mySQL

End Sub

我使用此代码从 ResourceTasks 获取 Name 并将其加载到母版页中;使用非常相似的功能,我可以检索任务、加载和日期,唯一的区别是屏幕上的格式

我与下一个参数建立了联系:adOpenStatic、adLockReadOnly

Public Sub SearchNames()

Dim oResources As ADODB.Recordset
Dim oDal As New clsDAL

Worksheets("Master").Activate

Set oResources = oDal.GetReadonlyRS("SELECT DISTINCT [Name] FROM [ResourceTasks$]") 'where Date >= **Drop date from selection here**  and Date < **Drop date from selection here**  'where Active like TRUE ")

oResources.MoveFirst

'get all record from record set one by one to 2nd table

Do Until oResources.EOF
    RowNumber = 30 + oResources.AbsolutePosition
    Range("A" & RowNumber).Value = oResources.Fields("Name").Value 
    oResources.MoveNext
Loop

'! get all record from record set one by one to 2nd table

'Close connection and file

oResources.Close

Set oResources = Nothing

oDal.closeFile

Set oDal = Nothing

'! close connection and file

End Sub

谢谢

【问题讨论】:

  • 作为建议,您应该使用Option Explicit 强制自己声明所有变量。

标签: excel vba adodb


【解决方案1】:

我认为您在查询中的 Date 字段存在语法问题。

& CDate("24 / 5 / 2017") &...

日期应该用# 括起来,或者,特定于Excel,可以作为数字传递。

第一个选项:

... VALUES ('Name11', 'task2', #24/5/2017#, 0.50)"
'                              ^^^^^^^^^^^

第二个选项:

... VALUES ('Name11', 'task2'," & CDbl(DateSerial(2017, 5, 24)) & ", 0.50)"
'                                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

另外,如果ResourceTasks 是一个工作表,它应该在查询中引用为[ResourceTasks$]

INSERT INTO [ResourceTasks$] VALUES...

【讨论】:

  • 3个选项都是以前尝过的,结果没有区别;我可以在驱动程序、dll 或其他任何与 MS 相关的问题上遇到问题吗?
  • @VladimirZaguzin ResourceTasks 是什么工作表?那么应该用作[ResourceTasks$]
  • 是的,ResourceTasks 是我用作数据库的工作簿中的工作表;有那么一刻,我就像“我怎么会错过它”,但即使使用这种 [ResourceTasks$] 格式,我仍然会看到相同的错误消息
【解决方案2】:

您可以通过对记录集运行查询然后将其复制到目标范围来实现此目的。代码如下:

Public Sub InsertIntoTable()

    Dim objConnection As Object
    Set objConnection = CreateObject("ADODB.Connection")

    objConnection.Open _
        "Provider = Microsoft.Jet.OLEDB.4.0; " & _
        "Data Source=C:\Users\User1\Documents\Excel files\tracker.xls; Extended Properties=""Excel 8.0;HDR=Yes"""

    Dim mySQL As String
    mySQL = "INSERT INTO ResourceTasks (Name, Task, Date, Load) VALUES ('Name11', 'task2'," & CDate("24 / 5 / 2017") & ", 0.50)"

    Debug.Print mySQL

    Dim rs As Object
    Set rs = CreateObject("ADODB.Recordset")

    rs.Open mySQL, objConnection

    ThisWorkbook.Sheets("1").Cells(1, 1).CopyFromRecordset Data:=rs

End Sub

问候

* 编辑 * 来自 OC 的帖子更新。请注意,我不熟悉命令clsDAL,所以我只编辑了复制记录集到范围。如果您将所有行都拉入记录集中并且只想将其输出到工作表中,您可以使用以下内容:

Public Sub SearchNames()

    Dim oResources As ADODB.Recordset
    Dim oDal As New clsDAL

    Set oResources = oDal.GetReadonlyRS("SELECT DISTINCT [Name] FROM [ResourceTasks$]") 'where Date >= **Drop date from selection here**  and Date < **Drop date from selection here**  'where Active like TRUE ")

    ThisWorkbook.Sheets("Master").Range("A31").CopyFromRecordset Data:=oResources
    oResources.Close
    Set oResources = Nothing

    oDal.closeFile
    Set oDal = Nothing

    '! close connection and file

End Sub

【讨论】:

  • 我尝试了类似的方法来制作它;它仍然抱怨这个插入语句
  • 哦,抱歉,我没有查看查询。让我检查一下并回复你。
  • 您说您正在从一个 Excel 工作表插入另一个工作表,但我只看到您将硬编码的一行值写入目标工作簿,这让我有点困惑。您从源工作簿中提取的内容在哪里?如果您要通过选择查询整个工作表,则可以将其放入记录集中,然后写入目标工作簿。
  • 是的,我知道这看起来很混乱。我有 2 个 excel 文件;第一个是“Tracker”——这是我的“db”,有 3 个选项卡(名称、任务和 ResourceTasks);我根据来自 ResourceTasks 的日期条件数据进行选择并将其加载到“主”excel 文件中,之后,如果需要,用户应该能够修改此选定的数据,并将其附加回 ResourceTasks 选项卡;并且选择该计划的一部分工作正常;现在我正在尝试使这个插入部分工作
  • 您能否在从资源任务中选择或提取数据的位置显示代码?那不是已经选择了吗?为什么不将该选择放入记录集中,然后写入目标?
【解决方案3】:

所以我发现由于某种原因,AddNew 比 Insert 更容易 它看起来像这样;希望它会帮助某人

Public Function InsertNewRecord() As Boolean

Dim oTasks As ADODB.Recordset
Dim oDal As New clsDAL

Set oTasks = oDal.GetUpdateableRS("SELECT * FROM [ResourceTasks$] WHERE Task=''")

With oTasks
    .AddNew
        .Fields("Name").Value = Sheets("Master").ComboBox24.Value 
        .Fields("Task").Value = Sheets("Master").ComboBox25.Value 
        .Fields("Date").Value = Sheets("Master").ComboBox23.Value
        .Fields("Load").Value = Sheets("Master").TextBox24.Value 
    .Update
    .Close
End With

Set oTasks = oDal.GetUpdateableRS("SELECT Task FROM [Tasks$] WHERE Task=''")

With oTasks
    .AddNew
        .Fields("Task").Value = sTask
    .Update
    .Close
End With

Set oDal = Nothing
Set oTasks = Nothing

End Function

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    • 2014-07-03
    • 2020-08-18
    • 1970-01-01
    • 2014-01-19
    相关资源
    最近更新 更多