Sql 无法在Excel中查询名称中带有空格的工作表上的命名区域

Sql 无法在Excel中查询名称中带有空格的工作表上的命名区域,sql,excel,named-ranges,vba,Sql,Excel,Named Ranges,Vba,我有一个包含多个工作表的工作簿,每个工作表都有一组相同的命名范围(即它们的范围是工作表,而不是工作簿) 我想根据任何图纸上的命名范围进行查询。有些图纸的名称没有空格,而有些图纸的名称有空格 我可以很容易地为那些没有空间的人做这件事,但是我不知道用空间做这件事的语法(还有一个小时的谷歌搜索) 命名范围为“配料”,其中一张命名为“无空间”,另一张命名为“带空间” 下面是适用于“NoSpaces”工作表的代码: 对于“带空格”工作表,我尝试了以下所有方法: 每次,我都会收到“Microsoft Acc

我有一个包含多个工作表的工作簿,每个工作表都有一组相同的命名范围(即它们的范围是工作表,而不是工作簿)

我想根据任何图纸上的命名范围进行查询。有些图纸的名称没有空格,而有些图纸的名称有空格

我可以很容易地为那些没有空间的人做这件事,但是我不知道用空间做这件事的语法(还有一个小时的谷歌搜索)

命名范围为“配料”,其中一张命名为“无空间”,另一张命名为“带空间”

下面是适用于“NoSpaces”工作表的代码:

对于“带空格”工作表,我尝试了以下所有方法:

每次,我都会收到“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提供的模式代码时,它将表_名称列为两个命名范围的“成分”(即使每个范围都限定在不同的表中)。
使用此驱动程序,即使[NoSpaces$Components]也无法工作

sConnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFileLoc & ";Extended Properties=""Excel 8.0;HDR=No;IMEX=1;"""
当运行@shahkalpesh提供的模式代码时,它将表_名称列为“NoSpaces$contracents”和“With Spaces'$contracents”。使用此驱动程序,[NoSpaces$Components]工作正常(使用ACE驱动程序时没有)。
但是,使用schema报告的确切名称,['With Spaces'$contracents]不起作用

sConnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFileLoc & ";Extended Properties=""Excel 8.0;HDR=No;IMEX=1;"""
Excel 2013

sConnString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFileLoc & ";Extended Properties=""Excel 12.0 Macro;HDR=No;IMEX=1;"""
当运行@shahkalpesh提供的模式代码时,它会将表_的名称列为“NoSpaces$components”和“With Spaces$'components”。使用此驱动程序,[NoSpaces$contracents]可以正常工作,但['With Spaces'$contracents]不起作用

sConnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFileLoc & ";Extended Properties=""Excel 8.0;HDR=No;IMEX=1;"""

最后,请参阅Excel 2007中创建的一个示例工作表,该工作表在(至少)两台不同的机器上都有此问题。

工作表的名称(后跟空格和命名范围)可以写成['My sheet$'MyData]

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

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
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\u NAME
。以图纸名称为前缀的命名范围列表将显示在
表\u名称
上(您可以在其上查询)


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

下面的查询将起作用。只需确保命名范围成分存在于带有空格的工作表。同时保存工作簿

strQuery=“选择*自[带空格$Components]”

或者,您可以使用下面的

strQuery=“使用“&Chr(32)”和“Spaces$components”从[中选择*”


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

SELECT * FROM [Report 1$A4:P]
我从GetOleDbSchemaTable()方法获取工作表名称并删除撇号。带撇号的sheetname不适用于我的范围

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

tableName=Regex.Match(tableName,@“(?又一次迟到了

我无法在这里得到任何响应来处理整个工作表,因此我为整个工作表创建了一个命名范围(选择所有单元格并给它们命名-我称它们为POList),并引用了以下内容:

UPDATE [POList] SET..... etc
因此,没有单引号,没有反勾号,没有$符号,甚至没有工作表名称

话虽如此,所讨论的工作簿只有一页(名称中有空格)

这使用Excel2002(!)和以下连接代码工作

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

显然,这不适合每个人的情况,这是一个有点笨拙的解决方法,但可能有人会发现它很有用…

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

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

如果有人在sql查询中使用此查询,请为我完成此工作

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

工作表名称是“name name”,只是将名称放在单引号之间,我认为这是正确的。但是,当我使用该SQL时,它仍然抛出相同的错误。与$之前的“相同。我开始认为这实际上是驱动程序中的一个错误。如果我将工作表重命名为“with spaces”,并使用“Select*from”['WithSpaces$'Components]”效果很好。重命名为“With Spaces”并使用“Select*from['With Spaces$'Components]”会抛出错误。@user2229491:检查修改后的答案并添加注释,如果没有帮助的话。谢谢。使用上面的代码(或通过adox.catalog.tables)它提供了您期望的名称“With Spaces$”成分。但是在查询中使用它仍然会抛出错误。此外,我确信这不是范围或键入错误等问题,因为我可以删除空格(在实际工作表名称和代码中)并且工作正常。将其放回并抛出错误。@user2229491:Goto“名称管理器”“并检查成分命名范围是否限定在工作表的范围内。如我所述,我可以从adox.catalog对象和架构中获取命名范围,因此它肯定在那里。这是我尝试的第一件事……请参阅我原始帖子中的查询列表。Chr(32)很遗憾,这没有什么区别。@user2229491在我这边工作。您使用的是哪个版本的excel?microsoft access数据库引擎找不到“带空格$”成分的对象。请确保该对象存在,并且正确拼写其名称和路径名。@user2229491错误消息本身是自解释的。C在2010版本中对文件进行u转换