在vba中,要获取excel工作簿中的所有工作表的名称,往往需要先打开对应的excel工作簿。
本文介绍用ADOX.Catalog对象直接连接要访问的excel工作簿,实现不打开获取所有的工作表名称。
利用ADOX.Catalog对象可以获取一个数据源的框架目录,对于excel工作簿,它的框架目录包含了工作表的名称,智能表格的名称、内置的隐藏名称等。
步骤如下:
- 使用ADO Connection对象的Open方法先与数据源建立连接,打开数据源。
- 将ADOX.Catalog对象的ActiveConnection属性设置为步骤1中建立的Connection对象。
- 然后遍历将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


发表评论