从Access表导入数据到Excel,FROM子句中的语法错误

我正在运行此代码来将数据从Access导入到Excel并获取运行时错误:

"syntax error in FROM clause." 

在Access中的表格有四列: DateTimeTankComments ,我想根据电子表格中的date导入TimeTank 。 我想要订购TankTime这些列。

错误是在行中:

 .Open "Select [Time], [Tank] FROM [UnitOneRouting] WHERE [Date] = " & RpDate & " ORDER BY Tank, Time", cn, adOpenStatic, adLockOptimistic, adCmdTable 

代码片段:

 Sub ADOImportFromAccessTable() Dim DBFullName As String Dim TableName As String Dim TargetRange As Range Dim RpDate As Range DBFullName = "U:\Night Sup\Production Report 2003 New Ver 5-28-10_KA.mdb" TableName = "UnitOneRouting" Worksheets("TankHours").Activate Set TargetRange = Range("C5") Set RpDate = Range("B2").Cells Dim cn As ADODB.Connection, rs As ADODB.Recordset, intColIndex As Integer Set TargetRange = TargetRange.Cells(1, 1) ' open the database Set cn = New ADODB.Connection cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & _ "U:\Night Sup\Production Report 2003 New Ver 5-28-10_KA.mdb" & ";" Set rs = New ADODB.Recordset With rs ' open the recordset ' filter rows based on date .Open "Select [Time], [Tank] FROM [UnitOneRouting] WHERE [Date] = " & RpDate & " ORDER BY Tank, Time", cn, adOpenStatic, adLockOptimistic, adCmdTable rs.Open , TargetRange TargetRange.CopyFromRecordset rs End With rs.Close Set rs = Nothing cn.Close Set cn = Nothing End Sub 

从Access将接受的SELECT语句开始。 使用一个stringvariables来保存该语句。 然后,您可以Debug.Printvariables并检查立即窗口中的语句文本。 对于疑难解答,您也可以从那里复制语句文本,并将其粘贴到新的Access查询的SQL视图中。

这里是一个代码示例,我对RpDate的值进行了硬编码,只是为了保持简单。

 Dim RpDate Dim strSelect As String RpDate = #9/26/2014# strSelect = "SELECT u.Time, u.Tank" & vbCrLf & _ "FROM UnitOneRouting AS u" & vbCrLf & _ "WHERE u.Date = " & Format(RpDate, "\#yyyy-md\#") & vbCrLf & _ "ORDER BY u.Tank, u.Time;" Debug.Print strSelect 

这是由该代码生成的SELECT语句…

 SELECT u.Time, u.Tank FROM UnitOneRouting AS u WHERE u.Date = #2014-9-26# ORDER BY u.Tank, u.Time; 

一旦你有一个有效的访问SQL SELECT语句,你将需要修复logging集。 .Open电话给它可接受的选项值。 adCmdTable导致错误,因为您的logging集的数据源是SELECT语句,而不是表。

 ' next line throws error -2147217900, "Syntax error in FROM clause." .Open strSelect, cn, adOpenStatic, adLockOptimistic, adCmdTable 'either of the next 2 lines works ... '.Open strSelect, cn, adOpenStatic, adLockOptimistic .Open strSelect, cn, adOpenStatic, adLockOptimistic, adCmdText 

所以我认为你正在处理的错误信息是误导的情况。 “FROM子句中的语法错误”表明问题出在SELECT语句中。 但是,一旦您有一个有效的SELECT ,由于adCmdTable ,您仍然会得到相同的错误文本。 不要将adCmdTable用于SELECT

你有你的SQL请求的例子吗?

我认为在date格式中存在一个问题…你应该试着用你的date( RpDate )来包装这个char # ,就像这样:

 .Open "Select [Time], [Tank] FROM [UnitOneRouting] WHERE [Date] = #" & RpDate & "# ORDER BY Tank, Time", cn, adOpenStatic, adLockOptimistic, adCmdTable 

正如我的评论所提到的,我对你的代码有点困惑。 你正试图根据dateselectlogging,但是当你变暗RbDatevariables时,你将它设置为一个范围? 这不仅是一个Access表的有效属性,即使它是你不能比较一个date范围。 如果你在Excel中,你可以

昏暗的RbDate作为date

RbDate = ActiveWorksheet.Range(“B2”)。值

但是,因为你不在excel这不适用。 我会build议使用date参数,如果它会不断变化,否则只需要按照以下方式硬编码date到您的代码

昏暗的RbDate作为date

RbDate =#2017/11/23#

然后,您可以将此用作SQL查询string中的值,因为当前RbDate可能为空或者根本不可与[Date]进行比较。 你可以试试这个方法,通过“Stepping”运行你的代码,按F8,每次你执行一行代码,在你过去之后(至less有一行代码)

设置RpDate =范围(“B2”)

将光标hover在“RpDate”上,它会告诉你存储在variables中的内容