我正在尝试将数据从几个excel中提取到Access数据库中。所有代码都是用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
开启记录集:
sheetname = "CZ00904001" & "$"
namedrange = "Version"
adors.Open "SELECT * FROM [" & sheetname & namedrange & "]", adocnn, adOpenStatic, adLockReadOnly, adCmdText
所以SELECT * FROM [CZ00904001$Version]
抛出错误运行时-2147217865“..数据库引擎无法找到对象'CZ00904001 $ Version'....”
打开工作簿时会发生此错误
如果它关闭,它会检索正确的数据
与工作簿范围相同
如果我使用像A1:B4
这样的单元格信息,即使使用打开的工作簿,它也会检索正确的信息,所以
sheetname = "CZ00904001" & "$"
namedrange = "A1:B4"
adors.Open "SELECT * FROM [" & sheetname & namedrange & "]", adocnn, adOpenStatic, adLockReadOnly, adCmdText
所以语句SELECT * FROM [CZ00904001$A1:B4]
检索数据
我正在试图找出如何编写它,以便无论工作簿是使用命名范围打开还是关闭,它都可以检索数据。 或者给我一个如何在不实际打开工作簿的情况下获取命名范围地址的提示
我也注意到了
Set adors = adocnn.openschema(20)
Do Until adors.EOF
Debug.Print adors.Fields("Table_name")
adors.MoveNext
Loop
根据工作簿是打开还是关闭返回不同数量的记录。
感谢您的帮助
EDIT1:
所以我做了一些测试。我只在excel和源工作簿中创建了代码
事实证明问题是在工作表的命名范围内。我有两张经过测试的源工作簿。一张名为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的开头造成了这个错误
感谢您提供有关如何更改SQL部分以使其工作的任何建议。到目前为止,提示涉及打开工作簿或复制,这在我看来不够优雅。最后的方法