无法在Excel上使用名称中的空格查询工作表上的命名范围

时间:2013-03-31 15:30:32

标签: sql excel-vba named-ranges vba excel

我有一个包含多个工作表的工作簿,每个工作表都有相同的命名范围集(IE的范围是工作表,而不是工作簿)。

我想根据任何工作表上的命名范围进行查询。有些工作表的名称没有空格,而其他工作表的名称则带有空格。

对于那些没有空格的人来说,我可以很容易地做到这一点,但是用空格做这个的语法让我感到厌烦(和一小时的google-ing)。

命名范围是“成分”,一张名为“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台不同的计算机上存在此问题。

6 个答案:

答案 0 :(得分:6)

是否可以使用excel范围而不是命名范围?我得到以下工作:

SELECT * FROM [Report 1$A4:P]

我从GetOleDbSchemaTable()方法获取工作表名称并删除撇号。带撇号的工作表名称对我来说不适用于范围。

if (tableName.Contains(' '))
            tableName = Regex.Match(tableName, @"(?<=')(.*?)(?=\$')", RegexOptions.None).Value + "$";

答案 1 :(得分:0)

带有空格后跟命名范围的工作表名称可写为['My Sheet $'MyData]

以下是列出工作簿中包含的表的方法

1)获取工作簿中表格列表的代码

dim i as Integer

Set objRecordSet = objConn.OpenSchema(adSchemaTables)
Do While Not objRecordSet.EOF
    i = 1
    For i = 0 To objRecordSet.Fields.Count - 1
        Debug.Print objRecordSet.Fields(i).Name, objRecordSet.Fields(i).Value
    Next

    objRecordSet.MoveNext
Loop

编辑:对于您的方案,它将是

strQuery = "Select * from ['With Spaces$'Ingredients]"

EDIT2:很抱歉,我第一次粘贴了错误的代码。请使用清单1中的上述代码,并在即时窗口中查找TABLE_NAME。以工作表名称为前缀的命名范围列表将显示在TABLE_NAME上(您可以在其上查询)。

此外,请确保将命名范围限定为工作表。确保工作表名称和范围名称的大小写与查询匹配。

答案 2 :(得分:0)

以下查询可行。只需确保工作表带空格中存在指定范围成分。还保存工作簿。

  

strQuery =“从[With Spaces $ Ingredients]中选择*”

您也可以使用以下

  

strQuery =“选择*来自[With”&amp; Chr(32)&amp; “空间$成分]”

答案 3 :(得分:0)

另一个晚会入口......

我无法在这里获得任何响应,因此我为整个工作表创建了一个命名范围(选择所有单元格并给它们命名 - 我称之为POList)并提到因此:

UPDATE [POList] SET..... etc

所以没有单引号,没有反引号,没有$符号,甚至没有表单名称。

话虽如此,有问题的工作簿只有一张(名称中有空格)。

这可以使用Excel 2002(!)和以下连接代码

Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
With cn
    .Provider = "Microsoft.Jet.OLEDB.4.0"
    .ConnectionString = "Data Source=C:\Purchase Req No. List.xls; Extended Properties=Excel 8.0;"
    .Open
End With

显然,这对每个人的情况都不起作用,并且有点像kludgey的解决方法,但也许有人会觉得它很有用......

答案 4 :(得分:0)

我遇到了同样的问题,并且能够在没有命名范围的情况下解决。另外,作为我的问题的双重部分,请确保工作表名称中没有尾随空格。试试......

strQuery = "Select * from ['With Spaces$']"

答案 5 :(得分:0)

如果有人在查询 sql 中使用它,这对我有用

select * 
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
'Excel 12.0 Xml;Database=YourPath\YourFileName.xlsx;',['name name$']);

工作表名称是“名称名称”,只需将名称放在单引号之间