添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
首发于 SUT事务所
【20171110】- VBA如何判断工作簿是否打开?

【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()