从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部分的工作。 到目前为止,技巧包括打开工作簿或复制,在我看来,这一点似乎还不够优雅。 不得已而为之