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