【问题标题】:Unable to query named range on sheet with spaces in name in Excel无法在 Excel 中使用名称中的空格查询工作表上的命名范围
【发布时间】:2023-03-11 07:36:01
【问题描述】:

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

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

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

【问题讨论】:

  • 使用 Excel 2013 我通过引入常规范围(不是命名范围)并使用冒号(“:”)解决了这个问题。例如。 [Report 1$A15] 不起作用,但 [Report 1$A15:A15] 起作用。

标签: sql excel named-ranges vba


【解决方案1】:

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

SELECT * FROM [Report 1$A4:P]

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

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

【讨论】:

  • 谢谢。我遇到了与 OP 相同的问题,我可以确认在您选择范围有效的情况下删除周围的引号。
【解决方案2】:

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

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

或者你可以在下面使用

strQuery = "Select * from [With" & Chr(32) & "Spaces$Ingredients]"

【讨论】:

  • 这是我尝试的第一件事……请参阅我原始帖子中的查询列表。不幸的是,Chr(32) 并没有什么不同。
  • @user2229491 它在我这边工作。您使用的是哪个版本的 Excel?
  • microsoft access 数据库引擎找不到对象''With Blanks$'Ingredients'。确保对象存在并且正确拼写其名称和路径名。
  • @user2229491 错误信息本身是不言自明的。你能在 2010 版本中转换文件并尝试一下。你也可以上传文件并给我们链接。
  • 我在工作的计算机上创建了另一个示例(使用 Excel 2007)。仍然有这个问题(奇怪的是,NoSpaces 也有同样的问题)。创建易于运行的每个示例,只需下载并编辑文件位置。请报告任何反馈。 db.tt/3lEYm2g1
【解决方案3】:

带有空格后跟命名范围的工作表名称可以写成['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(您可以在其上查询)。

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

【讨论】:

  • 我认为这是正确的。但是,当我使用该 SQL 时,它仍然会引发相同的错误。与 $ 之前的 ' 相同。我开始认为这实际上是驱动程序中的一个错误。如果我将工作表重命名为“WithSpaces”并使用“Select * from ['WithSpaces$'Ingredients]”它可以正常工作。重命名为“With Spaces”并使用“Select * from ['With Spaces$'Ingredients]”会引发错误。
  • @user2229491:如果没有帮助,请检查修改后的答案并添加您的 cmets。谢谢。
  • 使用上面的代码(或通过adox.catalog.tables)它给出了你期望的名称'With Spaces$'Ingredients。但是在查询中使用它仍然会引发错误。此外,我确信这不是范围界定或错误输入等问题,因为我可以删除空格(在实际工作表名称和我的代码中)并且它工作正常。放回去会报错。
  • @user2229491:转到“名称管理器”并检查成分命名范围是否在工作表范围内
  • 它的范围是工作表。正如我所提到的,我可以从 adox.catalog 对象和模式中获取命名范围,所以它肯定存在。
【解决方案4】:

聚会又迟到了……

我无法在此处获得任何适用于整个工作表的响应,因此我为整个工作表创建了一个命名范围(选择所有单元格并为它们命名 - 我将它们称为 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

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

【讨论】:

    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多