1. 程式人生 > 其它 >Excel 2010 VBA 入門 074 工作表事件之Workbook_SheetChange

Excel 2010 VBA 入門 074 工作表事件之Workbook_SheetChange

目錄

示例

實現程式碼

插入模組

插入工作薄事件

工作簿的Workbook_SheetChange事件

工作簿的Workbook_Activate事件

事件的組合


示例

當需要保護某個工作表不被修改時,一般可以將其保護。在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兩個事件的組合以取得所需的效果。當用戶**了某個工作表時,即備份該工作表,當該工作表更改且屬於保護列表時以備份工作表取代該工作表,從而達到了“保護”的目的。該備份和保護的兩個步驟並不能在一個事件中完成,因而採取了兩個事件分別完成,使兩個事件有機組合。