Excel 2010 VBA 入門 074 工作表事件之Workbook_SheetChange
目錄
示例
當需要保護某個工作表不被修改時,一般可以將其保護。在VBA中,是否可以設定一個工作表名稱的列表(如圖所示),當工作表屬於該列表中時則不允許改變。該如何實現?
實現程式碼
編寫一個備份工作表的程式,將當前活動工作表備份,然後在工作簿的Workbook_SheetChange事件中查詢其Sh引數所表示的工作表是否屬於保護工作表的列表,若屬於該列表,則刪除當前工作表,並使用備份工作表重新命名之前的工作表。
插入模組
Option Explicit Sub BackupSht() Dim shtOld As Worksheet Dim shtNew As Worksheet '禁止螢幕重新整理 Application.EnableEvents = False Application.DisplayAlerts = False '記錄當前活動工作表 Set shtOld = ActiveSheet '若當前活動工作表不是保護工作表時 If Not shtOld Is Sheet1 Then On Error Resume Next '顯示備份工作表並刪除 ThisWorkbook.Worksheets("tmp").Visible = xlSheetVisible ThisWorkbook.Worksheets("tmp").Delete '備份當前工作表 shtOld.Copy before:=ThisWorkbook.Worksheets(1) '備份工作表更名後並隱藏 Set shtNew = ThisWorkbook.Worksheets(1) shtNew.Name = "tmp" 'shtNew.Visible = xlSheetVisible shtNew.Visible = xlSheetHidden '再次**之前的活動工作表 shtOld.Activate End If Application.EnableEvents = True Application.DisplayAlerts = True End Sub
插入工作薄事件
Private Sub Workbook_SheetActivate(ByVal Sh As Object) Application.EnableEvents = False '備份當前工作 Call BackupSht Application.EnableEvents = True End Sub Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Dim shtName As String Application.EnableEvents = False Application.DisplayAlerts = False Application.EnableEvents = False '獲取當前工作表名稱 shtName = Sh.Name '若不是保護工作表所在的工作表 If Not Sh Is Sheet1 Then '若該工作表名稱在指定列表中找到,則恢復 If Not Sheet1.Columns(1).Find(what:=shtName, lookat:=xlWhole) Is Nothing Then '顯示工作表 ThisWorkbook.Worksheets("tmp").Visible = xlSheetVisible '將備份工作表移至當前工作表之彰 ThisWorkbook.Worksheets("tmp").Move Sh '刪除當前工作 Sh.Delete '工作表更名 ThisWorkbook.Worksheets("tmp").Name = shtName '再次備份當前工作表 Call BackupSht End If End If Application.EnableEvents = True Application.DisplayAlerts = True Application.EnableEvents = True End Sub
工作簿的Workbook_SheetChange事件
工作簿中對於工作表共同的事件與工作表事件的使用方法相同,其區別僅是在工作簿事件中添加了引數,用於描述觸發事件的工作表。工作簿的Workbook_Change事件的程式形式如下:
Workboook_SheetChange(ByVal ShAsObject,ByValTargetAsRange)
其中,引數Sh表示觸發該事件的工作表。Target表示觸發該事件的單元格,即改變的單元格。
在該事件中,新增對Sh物件的判斷,若其屬於工作表保護列表,則使用Application. Undo方法取消之前的變更。此處需要首先禁用事件,否則會觸發該事件的迴圈執行。
工作簿的Workbook_Activate事件
當工作簿獲取焦點時(一般為被開啟或者由其他工作簿切換至該工作簿作為當前**的工作簿),該工作簿的Activate事件被觸發。與之對應的是Deactivate事件,該事件則在工作簿失去焦點時(一般為關閉工作簿或者由該工作簿切換至其他工作簿)觸發。
本例在該事件呼叫備份工作表的程式,由於複製工作表時會**該新的工作表,從而再次出發Activate事件。為避免此事件的迴圈執行,需首先禁用事件,待工作表備份完成後再次啟用事件。
事件的組合
在許多情形下,事件並非單獨使用,可以利用多個事件的組合以求得最終效果。本例使用了Activate和SheetChange兩個事件的組合以取得所需的效果。當用戶**了某個工作表時,即備份該工作表,當該工作表更改且屬於保護列表時以備份工作表取代該工作表,從而達到了“保護”的目的。該備份和保護的兩個步驟並不能在一個事件中完成,因而採取了兩個事件分別完成,使兩個事件有機組合。