第五章 事件篇 5.6 Worksheet_Change事件 這是一個工作表事件,,當代碼所在的工作表的內(nèi)容被修改時,,觸發(fā)該事件。 我們先來看一下這個事件的語句結構: Private Sub Worksheet_Change(ByVal Target As Range) End Sub 這個事件有一個變量Target,它是一個單元格變量,,它代表被修改的單元格。我們對一個單元格所做的修改內(nèi)容,,就會賦值給這個變量,。下面我們通過一個案例來學習這個事件的應用。 我們想錄入一個如下圖所示的學生選修專業(yè)統(tǒng)計表,,學生可選修的專業(yè)有概論,、數(shù)理統(tǒng)計、VBA語言和PASCAL語言,,如果我們在選修專業(yè)單元格里直接錄入這些內(nèi)容,,由于學生人數(shù)眾多,錄入工作量會非常大,。我們用數(shù)字1來代表概論,,2代表數(shù)理統(tǒng)計,3代表VBA語言,,4代表PASCAL語言,,在選修專業(yè)單元格里直接錄入學生選修專業(yè)所對應的數(shù)字,單元格會自動錄入選修專業(yè),,這樣就可以大大減輕我們的工作量了,。
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column <> 3 Or Target.Count > 1 Then Exit Sub Application.EnableEvents = False If Target = 1 Then Target = '概論' ElseIf Target = 2 Then Target = '數(shù)理統(tǒng)計' ElseIf Target = 3 Then Target = 'VBA語言' ElseIf Target = 4 Then Target = 'PASCAL語言' Else MsgBox '請輸入1-4之間的數(shù)字' Target = '' End If Application.EnableEvents = True End Sub 我們先看一下小程序開頭的這條語句: If Target.Column <> 3 Or Target.Count > 1 Then Exit Sub 它的意思是,如果我們修改的單元格不在第3列,,或者同時修改兩個以上單元格,,那么就會退出程序,這樣就可以對表格的哪塊區(qū)域修改能讓該事件正確響應做了一個限定,。 接下來的程序里,,如果一個單元格輸入1,VBA會自動給該單元格賦值“概論”,,輸入2則賦值“數(shù)理統(tǒng)計”,,3賦值“VBA語言”,4賦值“PASCAL語言”,。 那么,,我們?yōu)槭裁催€要對EnableEvents屬性進行更改呢? 如果沒有 Else MsgBox '請輸入1-4之間的數(shù)字' Target = '' 這條語句,,我們是不需要對EnableEvents屬性進行更改的,。有了這條語句,假如我們輸入了5,,VBA會彈出對話框并對單元格賦值為空,,而對單元格賦空值則又觸發(fā)了該事件響應,它判斷輸入的不是1-4之間的數(shù)字,又會彈出對話框并對單元格賦值為空,。這樣就會一直彈出對話框,,陷入了一個死循環(huán)。所以在該事件正確響應后,,我們先把EnableEvents屬性設置為False,,確保該段代碼執(zhí)行完畢前不再觸發(fā)Worksheet_Change事件,待程序把數(shù)據(jù)處理完畢后,,程序結束前,,把EnableEvents屬性再設置為True,等待下一次輸入能夠再次觸發(fā)Worksheet_Change事件,。 程序執(zhí)行的效果是這樣的: |
|