雖然我前面講過,在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 入門(十)用戶窗體開發