虽然我前面讲过,在VBA中操作工作薄并不是件明智的事,但有些时候,还是避免不了要这么做。绝大多数情况下,我们要做的是获取到某个工作薄对象,并以此来获得其中的工作表对象,然后再对工作表中的数据进行处理。而后面这一部分(操作工作表)在前面已经讲过了,所以本章只讲如何在VBA中打开、关闭工作薄,以及介绍两个常用的工作薄对象。在VBA中打开工作薄有两种方法:显式打开及隐式打开。
1. 显式打开
显式打开即跟我们手动双击打开一个Excel文件一样,可以看到工作薄的内容,可以在里面进行各种操作。代码及示例如下:
Sub workbook_operate()
\' 定义工作薄对象
Dim wbk As Workbook
Dim fname As String
fname = "E:/temp/test.xlsx"
\' 根据工作薄文件路径打开工作薄
Set wbk = Application.Workbooks.Open(Filename:=fname)
MsgBox fname & "已打开"
\' 关闭工作薄
wbk.Close
End Sub
结果如下:
然后就可以根据这个workbook
对象(示例中的wbk变量)来获取到其中的工作表:
Set parameter_sht = wbk.Worksheets("Parameter")
或者取得这个工作薄的一些属性:
wbk.Name
最后可以使用Close
方法来关闭这个工作薄:
wbk.Close
2. 隐式打开
使用隐式打开的时候,这个工作薄在前端是看不到的,只有在VBE环境中(的工程窗口)可以看到它。示例代码及结果如下:
Sub workbook_operate()
\' 定义工作薄对象
Dim wbk As Workbook
Dim fname As String
fname = "E:/temp/test.xlsx"
\' 根据工作薄文件路径获取工作薄对象
Set wbk = GetObject(fname)
Debug.Print wbk.Name
End Sub
与显式打开不同的是,这是使用了GetObject
方法。结果如下:
可以在VBE的工程窗口(上图左侧)中看到有一个新的工项目被加载了。但此时是并不能看到有一个Excel文件被打开的,这个已经被VBA隐式打开的文件,只能使用VBA进行操作,在使用上与显式打开后得到的workbook对象没什么区别,如获取其中的工作表对象、获取它的名字、关闭它等,都是一样的。这里就不举例了。
3. 创建工作薄
通常流程是:创建工作薄、给默认的工作表(Sheet1)改名、写数据、保存工作薄。代码如下:
Dim tmp_wbk as Workbook
Dim tmp_sht as Worksheet
Set tmp_wbk = Application.Workbooks.Add \' 创建工作薄
Set tmp_sht = tmp_wbk.Worksheets("Sheet1")
tmp_sht.Name = "abcde" \' 给工作表改名
tmp_wbk.Close SaveChanges:=True, Filename:="abcde1.xlsx" \' 保存文件
4. 关闭
无论是显式打开还是隐式打开,如果在新打开的工作薄中有更改,在使用workbook.Close方法时,会有个弹窗提示是否要保存更改,就跟我们平时使用时一样:
又或者被打开的工作薄里面有些公式,在打开这个工作薄时公式结果变了(其实也等于是有更新了),在关闭时都会出现这个提示。如果可以确定是否需要更改,可以在保存时加入相应的参数SaveChanges
:
wbk.Close SaveChanges:=False
SaveChanges
等于False
时即为不保存,等于True
时即为保存
5. ThisWorkbook与ActiveWorkbook
ThisWorkbook
对象是VBA顶级对象Application
下的一个特殊对象,代表当前(VBA代码所在的)工作薄对象。
ActiveWorkbook
对象也是VBA顶级对象Application
下的一个特殊对象,代表当前激活的工作薄对象。
就跟我们在使用QQ聊天时一样,我们不可能同时单独地发信息给两个不同的QQ好友,只能有一个聊天窗口是被激活的。Excel也一样,当前被激活的工作薄就是ActiveWorkbook对象(同样类似地,也有ActiveWorksheet对象)。
有些情况下,ThisWorkbook
等同于ActiveWorkbook
,但有些情况下并不是的。如以下代码:
Sub workbook_operate()
\' 定义工作薄对象
Dim wbk As Workbook
Dim fname As String
fname = "E:/temp/ActiveMe.xlsx"
\' 根据工作薄文件路径获取工作薄对象
Set wbk = Workbooks.Open(fname)
Debug.Print ThisWorkbook.Name
Debug.Print ActiveWorkbook.Name
End Sub
运行结果:
因为新打开的工作薄会被处于激活状态(就跟手工打开另一个Excel文件一样),所以这时新打开的ActiveMe.xlsx才是ActiveWorkbook,而当前代码所在的工作薄(test.xlsm)则是ThisWorkbook。而如果只有一个工作薄被打开或者是当前代码所在工作薄处于激活状态时,则ThisWorkbook和ActiveWorkbook是同一个对象。
本系列教程其它文章
Excel VBA 入门(零)
Excel VBA 入门(一)数据类型
Excel VBA 入门(二)数组和字典
Excel VBA 入门(三) 流程控制1-条件选择
Excel VBA 入门(四)流程控制2-循环控制
Excel VBA 入门(五)Excel对象操作
Excel VBA 入门(六)过程和函数
Excel VBA 入门(七)注释、宏按钮及错误处理
Excel VBA 入门(八)单元格边框
Excel VBA 入门(九)操作工作薄
Excel VBA 入门(十)用户窗体开发