如何在vba中用ADOX.Catalog获取excel文件的工作表名称?

在vba中,要获取excel工作簿中的所有工作表的名称,往往需要先打开对应的excel工作簿。

本文介绍用ADOX.Catalog对象直接连接要访问的excel工作簿,实现不打开获取所有的工作表名称。

利用ADOX.Catalog对象可以获取一个数据源的框架目录,对于excel工作簿,它的框架目录包含了工作表的名称,智能表格的名称、内置的隐藏名称等。

步骤如下:

  1. 使用ADO Connection对象的Open方法先与数据源建立连接,打开数据源。
  2. ADOX.Catalog对象的ActiveConnection属性设置为步骤1中建立的Connection对象。
  3. 然后遍历将ADOX.Catalog对象的Tables属性,既可以获取相应数据源的Table。

以下是获取一个excel工作簿文件的所有工作表名称的代码:

Sub QQ1722187970()
    Dim sFN As String
    sFN = Excel.Application.GetOpenFilename()
    If Len(sFN) Then
        Dim arrName()
        Dim objCatalog
        Set objCatalog = VBA.CreateObject("ADOX.Catalog")
        Dim sVersion As String
        sVersion = Excel.Application.Version
        Dim sConStr As String
        '创建连接字符串
        If sVersion <= 12 Then
            sConStr = "Provider='Microsoft.Jet.OLEDB.4.0';Data Source=" & sFN & ";Extended Properties='Excel 8.0;HDR=YES'"
        Else
            sConStr = "Provider='Microsoft.ACE.OLEDB.12.0';Data Source=" & sFN & ";Extended Properties='Excel 12.0;HDR=YES'"
        End If
        Dim oConStr
        Set oConStr = CreateObject("ADODB.Connection")
        '使用Connection连接数据源
        oConStr.Open sConStr
        With objCatalog
            '关联Connection对象
            Set .ActiveConnection = oConStr
            Dim oTable
            For Each oTable In .Tables
                Dim sName As String
                sName = oTable.Name
                '提取工作表名称
                If Right(sName, 1) = "$" Then
                    Debug.Print sName
                    ReDim Preserve arrName(k)
                    arrName(k) = Left(sName, Len(sName) - 1)
                    k = k + 1
                End If
            Next
        End With
        Set oConStr = Nothing
    End If
End Sub
       

发表评论