vb判断excel是否打开 关闭_隔墙取物!100个Excel不打开也能取到工作表名称

cde6ca6d69e8aaff818b7e7ed81dd5dd.png

在用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 = VBA.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 IfEnd 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:myFoldermyExcel2007file.xlsx;Extended Properties=Excel 12.0;HDR=YES";

对于各种不同的外部数据源对应的连接字符串可以在

https://www.connectionstrings.com/

这个网站都找到各种不同的数据源对应的连接字符串。

ba65c8d3b5c0a91fc950c32b7bd0d1fa.png
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值