我有一个包含多个工作表的工作簿,每个工作表都有相同的命名范围集(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台不同的计算机上存在此问题。
答案 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$']);
工作表名称是“名称名称”,只需将名称放在单引号之间