从excel中检索ADODB数据,打开工作簿时无法识别工作表范围的NamedRange

我试图把数据从几个excel中的数据库。 所有的代码都是用Access编写的。 每个Excel都有一张到大约10张数据存在的表单。 他们被组织在一张桌子上。 每个有数据的区域都是带有工作表范围的NamedRange,所以所有工作表的NamedRanges是相同的(名字相同,范围通常相同,但名字很重要),它的正确范围是不同的。

我使用ADODB连接。 我有的问题是,当打开工作簿(例如由其他用户),它不会识别工作表范围NamedRange

连接:

adocnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & FilePath & FileName & ";Mode=Read;Extended Properties=""Excel 12.0 Xml;HDR=no; IMEX=3;"";" adocnn.cursorlocation = adUseClient 'tested for both server/client 

开放logging:

 sheetname = "CZ00904001" & "$" namedrange = "Version" adors.Open "SELECT * FROM [" & sheetname & namedrange & "]", adocnn, adOpenStatic, adLockReadOnly, adCmdText 

所以SELECT * FROM [CZ00904001$Version]抛出错误运行时-2147217865“..数据库引擎找不到对象'CZ00904001 $版本'….”当打开工作簿时发生此错误

如果closures,它将检索正确的数据

与工作簿范围相同

如果我使用像A1:B4这样的单元格信息,即使打开工作簿,它也会检索到正确的信息

 sheetname = "CZ00904001" & "$" namedrange = "A1:B4" adors.Open "SELECT * FROM [" & sheetname & namedrange & "]", adocnn, adOpenStatic, adLockReadOnly, adCmdText 

所以语句SELECT * FROM [CZ00904001$A1:B4]检索数据

我想弄清楚如何编写它,以便它可以检索数据,无论工作簿是否打开或使用命名范围closures。 或者给我一个提示如何获得该命名的范围地址,而不打开工作簿

我也注意到了

 Set adors = adocnn.openschema(20) Do Until adors.EOF Debug.Print adors.Fields("Table_name") adors.MoveNext Loop 

根据工作簿是打开还是closures返回不同数量的logging。

感谢您的帮助

EDIT1:

所以我做了一些testing。 我只在excel和源工作簿中创build代码

原来问题出在纸张命名的地方。 我有两张testing源工作簿。 一张名为CZ00904002,另一张名为CZ90904002

 adors.Open "SELECT * FROM[CZ00904002$test];",adocnn,adOpenStatic,adLockReadOnly, adCmdText 

当工作簿被打开时抛出提到的错误,但是

 adors.Open "SELECT * FROM [CZ90904002$test];", adocnn, adOpenStatic, adLockReadOnly, adCmdText 

返回我正在寻找的东西。

我尝试了几种不同的报价组合,但到目前为止没有运气。

CZ01904002作品CZ10904002作品

这似乎是CZ00的开始,使这个错误

感谢您的任何build议如何更改该SQL部分的工作。 到目前为止,技巧包括打开工作簿或复制,在我看来,这一点似乎还不够优雅。 不得已而为之