EXCEL SQL SELECT将无法识别ThisWorkBook中的字段名称

我是一个自学的Excel VBA和SQL用户。 在添加复杂性之前,我正在testing一些简单的查询。 我必须在这里失去一些非常明显的东西…

我正在使用ADO连接在ActiveWorkbook(ThisWorkBook)中的表上运行SQL SELECT语句。 Excel表名为“tbl_QDB”,位于工作表“MyQDB”上。 该表从单元格A1开始,因此表HeaderRowRange上方没有空白或已填充的单元格。

我已经build立了一个ADO连接到ThisWorkBook,这工作正常。 代码如下:

Sub ConnectionOpen2() '### UNDER DEVELOPMENT Dim sconnect As String Const adUseClient = 3 Const adUseServer = 2 Const adLockOptimistic = 3 Const adOpenKeyset = 1 Const adOpenDynamic = 2 'used to connect to this workbook for SQL runs On Error GoTo err_OpenConnection2 Set cn2 = CreateObject("ADODB.Connection") Set rec2 = CreateObject("ADODB.Recordset") rec2.CursorLocation = adUseClient rec2.CursorType = adOpenStatic rec2.LockType = adLockOptimistic datasource = ThisWorkbook.FullName sconnect = "Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=" & datasource & ";" & _ "Extended Properties=""Excel 12.0;HDR=YES;ReadOnly=False;Imex=0"";" cn2.Open sconnect 'etc, etc... End Sub 

我可以运行这个最简单的基本SELECT查询:

 SQLSTR="SELECT * FROM [MYQDB$]" rec2.open SQLSTR, cn2 

这工作并产生10个logging,即rec2.recordcount = 10。

但是,如果我尝试这个,它错误:

 SQLSTR="SELECT QID_1 FROM [MYQDB$]" 

在这里输入图像说明

QID_1是工作表“MyQDB”中表格中的有效字段。 它不会改变错误,如果我把QID_1放在()或[]中,或者“我甚至可以用一个组成字段replace字段名称,例如DonaldDuck,我得到相同的错误。

为什么SELECT语句在使用“*”的情况下工作,但是如果我使用表中的任何字段名称,则不行? 这似乎很基本,我觉得我一定是错过了一个简单而重要的点。

如果有人能指出这个错误,我真的很感激!

SQL应该工作 – 如果该字段存在。 执行Select *并转储字段列表:

 For i = 0 To rec2.Fields.Count - 1 Debug.Print rec2.Fields(i).Name Next i 

谢谢大家的意见。 那个build议@FunThomas让人大开眼界! 结果是F1,F2,F3等,所以字段名称(或列名,如果你喜欢)没有被识别。

这就解释了为什么在经过几天的试图与另外一个封闭的外部工作簿一起join这个表格后,这个表格不起作用。 SQL错误消息可能相当钝,并不是说它不能识别字段名称。

我现在已经解决了这个问题。 以下是我可以告诉/警告其他人:

  1. 我开始在表头上方的行。 在上面的两个单元格中,我logging了最后一次连接时间和状态到另一个工作簿表。 我意识到这些额外的行,数据填充在标题上方的任何单元格中,导致了SQL的问题。 尽pipe在Excel表格中有我的数据,Excel的SQL“引擎”会查看工作表,即数据存储的[MYQDB $](尽pipe我知道您可以指定工作表和范围,但不能使用实际表名称作为范围)。

  2. 在表格headerrowrange之上有空白行是可以的。 所以,我删除了包含表格headerrowrange之上的数据的单元格。 相反,我放置了一个文本框,并使用一个公式来查看另一个表单,最后一次连接时间和状态现在被存储在文本框中。

  3. 现在我可以看到,即使这个不占用单元格的文本框也会导致Excel SQL出现问题。

  4. 在发布我的问题之前,我做了一个工作簿的副本,并删除了文本框和表格headerrowrange之上的行。 我仍然有错误。 我仍然有F1,F2,F3等字段名称(每@ FunThomas的build议)。

  5. 只有删除这些行和文本框,然后重新调整表(实际上,与以前相同的范围)之后,Excel SQL才能识别正确的字段名称。 然后,我甚至可以(只是为了好奇)在表headerrowrange之上插入一个空行,并且SQL仍然工作。

  6. 在我看来,Excel保留在内存中的旧表定义,只有通过删除表headerrowrange上面的所有数据,然后调整表刷新。 以后也许我应该不那么懒惰,在sql:maybe中调用sheetname和range(表地址),可能会忽略headerrowrange之上的单元格中的数据?

@PanagiotisKanavos:我最初试图比较两个表(实际的Excel表,不只是范围,因此他们有字段名称),一个在ThisWorkBook和另一个在一个封闭的Excel工作簿。 SQL是这样做的最好方法。 在这些表之间没有得到一个左连接来工作(这个问题现在可能已经揭示了为什么这不起作用!)我决定把外部工作簿中的数据带入ThisWorkBook并在那里比较。 然后,我要找出差异,存储在一个logging集(因此SQL),然后插入到外部工作簿。

谢谢你们的帮助!