【20171110】- VBA如何判断工作簿是否打开?
最近群里(QQ群号: 615356012 )小伙伴咨询的问题比较多,由于刚刚休假回来,很多工作需要处理,所以可能很多问题没来得及解答。不过我会通过公众号发文的方式间接的回答各位小伙伴的问题,希望各位小伙伴不要等的不耐烦哦。
这不就有小伙伴咨询如何 判断工作簿是否处于打开状态 ,以免重复打开工作簿。其实很多应用程序都会有打开检测,当打开超过一个实例后,再次打开就会提示已经打开或激活现有实例。
最常见的就是类似 电脑版微信 ,当再次运行微信后,原有打开的微信客户端会激活置顶显示到桌面。
那如何能让Excel也能达到检测未打开的工作簿,然后打开,已经打开的工作簿激活呢?这里主要的功能就在于如何检测工作簿是否打开,最常见的方法就是使用For…Next循环,去判断每一个已经打开工作簿名称是否等于给定的工作簿名称,如果能找到,说明给定的工作簿处于打开状态,否则,处于未打卡状态。这里为了方便使用,特编写 自定义函数 如下:
Function IsWbOpen1(strName As String) As Boolean
'如果目标工作簿已打开则返回TRUE,否则返回FALSE
Dim i As Long
For i = Workbooks.Count To 1 Step -1
If Workbooks(i).Name = strName Then
Exit For
End If
If i = 0 Then
IsWbOpen1 = False
IsWbOpen1 = True
End If
End Function
那有没有 不用遍历 所有打开的工作簿就能知道工作簿是否打开呢?就好比在一群人中找到姓名为张三的小伙伴,是通过在 一群人中一个一个去问 ,还是 通过广播直接找张三 呢。谁快谁慢,相必大家了然于胸,那VBA代码该如何去写呢?详细代码如下所示:
Function IsWbOpen2(strName As String) As Boolean
On Error Resume Next
Dim wk As Object
'如果工作簿没打开,直接赋值会报错,故使用On Error Resume Next
Set wk = Workbooks(strName)
If Err.Number = 0 Then
IsWbOpen2 = True
IsWbOpen2 = False
End If
End Function
为了更加直观的对上面2个函数的理解,我编写了两个宏 sutTest1 和 sutTest2 ,代码如下图所示:
Sub sutTest1()
If IsWbOpen1("SUT事务所.xls") Then
Workbooks("SUT事务所.xls").Activate
Workbooks.Open (ThisWorkbook.Path & "\SUT事务所.xls")
End If
End Sub
Sub sutTest2()