使用 ADODB 将数据从一个 excel 文件插入到另一个文件
insert data from one excel file to another one using ADODB
我正在尝试使用 adodb
将数据从一个 excel 文件插入到另一个文件,但遇到了插入方法问题。它给了我如下错误信息:
Syntax error in INSERT INTO statement
我尝试了不同的日期格式,带引号和不带引号,我也尝试了不同的记录集方法,但这个 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 获取名称并将其加载到母版页;具有非常相似的功能,我检索任务、加载和日期,唯一的区别是屏幕上的格式
我使用下一个参数建立连接: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
谢谢
您可以实现此 运行 您对记录集的查询,然后将其复制到您的目标范围。代码如下:
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
此致
* 编辑 *
来自 post 来自 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
我认为查询中的 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...
所以我发现出于某种原因,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
我正在尝试使用 adodb
将数据从一个 excel 文件插入到另一个文件,但遇到了插入方法问题。它给了我如下错误信息:
Syntax error in INSERT INTO statement
我尝试了不同的日期格式,带引号和不带引号,我也尝试了不同的记录集方法,但这个 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 获取名称并将其加载到母版页;具有非常相似的功能,我检索任务、加载和日期,唯一的区别是屏幕上的格式
我使用下一个参数建立连接: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
谢谢
您可以实现此 运行 您对记录集的查询,然后将其复制到您的目标范围。代码如下:
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
此致
* 编辑 *
来自 post 来自 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
我认为查询中的 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...
所以我发现出于某种原因,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