如何用vba不打开excel工作簿提取工作表的名称?

 

在用vba处理多个excel文件时,经常会遇到需要遍历不同的excel文件。

 

如果是需要对每个excel文件都执行某些动作,那可以用Workbooks.Open方法逐个打开excel文件,然后编写要执行的动作代码,最后保存后关闭。

 

但是如果只是要过滤每个Excel文件内的工作表名称,满足指定条件的工作表名称才需要打开处理时,如果还是逐个打开来判断,效率就低了,如果再遇到每个excel文件都比较庞大,逐个打开那就更加悲剧了,加载数据都需要消耗较长的时间。

 

比如现在手上有100多个Excel工作簿,需要用vba判断是否有工作表名称含”统计”两个字的工作簿,然后打开对其执行一系列操作,应该如何操作才比较高效呢?

 

今天介绍一种用ado技术实现的方法,可以在不打开excel工作簿的情况下就可以获取到其内部的excel工作表名称,代码如下:

 

Sub exceloffice()
    Dim sFN As String
    '获取要读取工作表名称的excel工作簿
    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
        '创建连接字符串,不同的excel版本使用不同的连接字符串
        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
        If UBound(VBA.Filter(arrName, "统计")) >= 0 Then
            MsgBox "存在名称为【统计】的excel工作表"
        Else
            MsgBox "不存在名称为【统计】的excel工作表"
        End If
    End If
End Sub

 

限于篇幅,上述代码仅举例了如何对任意一个选中的excel工作簿,不打开提取其内部的excel工作表名称,然后将工作表名称保存在数组arrName

 

如果是多个excel工作簿,只需要添加循环遍历的代码即可。

 

这里再额外介绍下ado技术,

 

ado是一种专门用于访问不同数据源内数据的技术,通过ado我们可以在同一个软件内访问各种不同的外部数据源。

 

但是实现的前提需要提供访问数据源的钥匙,通过钥匙搭建与外部数据源之间连接的桥梁,这个钥匙就是连接字符串。

 

不同的外部数据源有不同的连接字符串,比如针对Excel 2003版本的外部数据源,可以使用如下的连接字符串

 

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyExcel.xls;Extended Properties=“Excel 8.0;HDR=Yes“;

 

对于Excel 2007(含 2007) 以上的外部数据源,可以使用如下的连接字符串:

 

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\myFolder\myExcel2007file.xlsx;Extended Properties=Excel 12.0;HDR=YES”;

 

对于各种不同的外部数据源对应的连接字符串可以在这个网站都找到 各种不同的数据源对应的连接字符串

 

       

仅有1条评论 发表评论

  1. 干冰 /

    如果是多个excel工作簿,只需要添加循环遍历的代码即可。
    请问老师:这个循环遍历的代码要怎么写呢?谢谢!

发表评论