Excel/Vba/ADODB:如何仅使用其名称连接到表(ListObject)来执行查询?

问题描述 投票:0回答:1

我试图找到解决我的问题的方法,也查看了这里报告的过去的问题,但我没有找到解决方案。

问题:在 VBA 中,如果我只知道表的名称(而不知道其地址范围),如何在 ADODB 查询中指定 Excel 表的名称?

我必须查询给定命名表(“Table_1A”)的一些数据,这些数据存储在保存在我的电脑的资源数据目录/文件夹中的另一个关闭工作簿的给定工作表(名为“1A”)中。

ADODB 似乎无法获取到指定表的连接(表对 ADODB 来说似乎是不可见的)。

注意:经典的“手工制作”表(ListObject),第一列包含一组材料,其他列包含材料与温度的物理属性(温度值标识列名称)。没有创建数据透视表或其他表来查询数据库。

仅当我指定工作表名称加上表的地址范围时,才可以连接到表。如果我只指定表的名称...它不存在!

问题在于,要查询的表的地址范围,可能会随着时间的推移而改变(表存储和更新的sheet名称,不会随时间改变)。

提前感谢您的帮助。

excel vba adodb
1个回答
0
投票

我几个小时前写了一个关于这个问题的答案,但我猜,在 GSerg 注意到我因睡眠不足而犯下的错误后,我不得不删除它。感谢 GSerg 的警告...

现在,我准备了另一个替代方案;

  • 名为“Employee.xlsx”的已关闭工作簿在工作表“Sheet1”上有一个名为“Table1”的“ListObject”。 (请注意,“Table1”不是定义的名称。

  • 名为“Book1.xlsm”的工作簿包含以下宏:将关闭的工作簿(“Employee.xlsx”)转换为 zip 文件,将 zip 文件的内容提取到临时文件夹(名为“zipFolder”),并从相关的 XML 文件是“.....\xlables\Table1.xml”

  • 使用此范围地址,关闭工作簿中的数据将通过 ADO 转储到从单元格 A2 开始的活动工作表中

这种方法可能不太简洁,但如果有人想要使用“ListObject”的名称而不是定义的名称,这可能是一种替代方法。

两个工作簿应位于同一文件夹中...

所以,代码是;

Option Explicit
'
Sub Test()
    Dim ListObjectName As String, objShell As Object, zipFile As Variant, myFile As String, zipFolder As Variant
    Dim xDoc As Object, myNode As Object, DataRange As String, adoCN As Object, RS As Object, strSQL As String
    
    ListObjectName = "Table1"
    
    zipFolder = ThisWorkbook.Path & Application.PathSeparator & "zipFolder"
    
    If Dir(zipFolder, vbDirectory) = "" Then
        MkDir ThisWorkbook.Path & "\zipFolder"
    End If
    
    myFile = ThisWorkbook.Path & "\Employee.xlsx"

    zipFile = ThisWorkbook.Path & "\zipFolder\Employee.zip"
    
    Name myFile As zipFile
    
    Set objShell = CreateObject("Shell.Application")
    objShell.Namespace(zipFolder).CopyHere objShell.Namespace(zipFile).items
    
    Name zipFile As myFile
    
    Set xDoc = CreateObject("MSXML2.DOMDocument")
    xDoc.async = False
    xDoc.validateOnParse = False
    
    xDoc.Load zipFolder & "\xl\tables\" & ListObjectName & ".xml"
    
    Set myNode = xDoc.SelectSingleNode("//table")
    DataRange = myNode.Attributes.getNamedItem("ref").Text
    
    Range("A2:C" & Rows.Count) = Empty
    
    Set adoCN = CreateObject("ADODB.Connection")
    Set RS = CreateObject("ADODB.Recordset")
    
    adoCN.Provider = "Microsoft.ACE.OLEDB.12.0"
    adoCN.Properties("Data Source") = myFile
    adoCN.Properties("Extended Properties") = "Excel 12.0 Macro; HDR=Yes; IMEX=1"
    adoCN.Open
        
    strSQL = "Select * From [Sheet1$" & DataRange & "]"
    
    RS.Open strSQL, adoCN
    
    Range("A2").CopyFromRecordset RS
    
    CreateObject("Scripting.FileSystemObject").DeleteFolder zipFolder
        
    RS.Close
    adoCN.Close
    
    Set RS = Nothing
    Set adoCN = Nothing
    Set adoCN = Nothing
    Set xDoc = Nothing
    Set objShell = Nothing
End Sub
© www.soinside.com 2019 - 2024. All rights reserved.