我有一个包含多个工作表的工作簿,每个工作表都有相同的一组命名范围(即它们的范围仅限于工作表,而不是工作簿)。
我想根据任何工作表上的命名范围进行查询。有些工作表的名称不带空格,而其他工作表的名称则带空格。
我可以轻松地为没有空格的人执行此操作,但是使用空格执行此操作的语法使我无法理解(以及一个小时的 google-ing)。
命名范围为“Ingredients”,一张名为“NoSpaces”,另一张名为“With Spaces”
这是适用于“NoSpaces”表的代码:
sConnString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & dictNewRecipesToCheck(arrKeys(0)) & ";Extended Properties=""Excel 12.0;HDR=No;IMEX=1;"""
strQuery = "Select * from [NoSpaces$Ingredients]"
Set objConn = New ADODB.Connection
Set objRecordSet = New ADODB.Recordset
objConn.Open sConnString
objRecordSet.Open strQuery, objConn
我已经为“With Spaces”表尝试了以下所有方法:
strQuery = "Select * from [With Spaces$Ingredients]"
strQuery = "Select * from ['With Spaces'$Ingredients]"
strQuery = "Select * from ['With Spaces$'Ingredients]"
strQuery = "Select * from [With_Spaces$Ingredients]"
每次,我都会收到“Microsoft Access 数据库引擎找不到对象...”错误。
正如我所提到的,它适用于名称中没有空格的所有工作表。
任何帮助在有空格的表格上工作,将不胜感激。
谢谢!
基于以下评论的更新:
Excel 2007
sConnString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFileLoc & ";Extended Properties=""Excel 12.0 Macro;HDR=No;IMEX=1;"""
当运行@shahkalpesh 提供的模式代码时,它会将 TABLE_NAME 列为两个命名范围的“成分”(即使每个范围都限定为不同的工作表)。
使用此驱动程序,即使 [NoSpaces$Ingredients] 也不起作用。
sConnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFileLoc & ";Extended Properties=""Excel 8.0;HDR=No;IMEX=1;"""
当运行@shahkalpesh 提供的模式代码时,它将 TABLE_NAME 列为“NoSpaces$Ingredients”和“'With Spaces'$Ingredients”。使用此驱动程序,[NoSpaces$Ingredients] 工作正常(ACE 驱动程序没有)。
但是,使用架构报告的确切名称,['With Spaces'$Ingredients] 不起作用。
Excel 2013
sConnString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFileLoc & ";Extended Properties=""Excel 12.0 Macro;HDR=No;IMEX=1;"""
当运行@shahkalpesh 提供的模式代码时,它将 TABLE_NAME 列为“NoSpaces$Ingredients”和“'With Spaces$'Ingredients”。使用此驱动程序,[NoSpaces$Ingredients] 工作正常,但 ['With Spaces'$Ingredients] 不起作用。
最后,请参阅http://db.tt/3lEYm2g1以获取在 Excel 2007 中创建的示例表,该表在(至少)2 台不同的机器上存在此问题。