6

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

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

我可以轻松地为没有空格的人执行此操作,但是使用空格执行此操作的语法使我无法理解(以及一个小时的 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 台不同的机器上存在此问题。

4

6 回答 6

7

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

SELECT * FROM [Report 1$A4:P]

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

if (tableName.Contains(' '))
            tableName = Regex.Match(tableName, @"(?<=')(.*?)(?=\$')", RegexOptions.None).Value + "$";
于 2013-07-16T20:27:12.987 回答
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(您可以在其上查询)。

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

于 2013-03-31T16:11:09.703 回答
0

下面的查询会起作用。只需确保命名范围成分存在于工作表With Space中。同时保存工作簿。

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

或者,您可以在下面使用

strQuery = "从 [With" & Chr(32) & "Spaces$Ingredients] 中选择 *"

于 2013-03-31T16:20:21.567 回答
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

显然这不适用于每个人的情况,并且是一个有点笨拙的解决方法,但也许有人会发现它很有用......

于 2014-09-11T17:02:02.237 回答
0

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

strQuery = "Select * from ['With Spaces$']"
于 2015-06-17T19:36:04.397 回答
0

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

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

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

于 2021-03-30T12:30:12.040 回答