Excel中各種VBA寫法http://www.cnblogs.com/xioxu/archive/2007/09/19/898282.html 先貼一段網(wǎng)上找的excel的各種事件 工作簿對象事件一覽表 再貼一堆代碼 例為設(shè)置密碼窗口 (1)
If w.Name ThisWorkbook.Name Then w.Close savechanges:=True End If Next w Activate 事件 激活一個(gè)工作簿、工作表、圖表或嵌入圖表時(shí)產(chǎn)生此事件。 當(dāng)激活工作表時(shí),本示例對 A1:A10 區(qū)域進(jìn)行排序。 Private Sub Worksheet_Activate() Range("a1:a10").Sort Key1:=Range("a1"), order:=xlAscending End Sub Calculate 事件 對于 Worksheet 對象,在對工作表進(jìn)行重新計(jì)算之后產(chǎn)生此事件 每當(dāng)工作表重新計(jì)算時(shí),本示例就調(diào)整 A 列到 F 列的寬度。 Private Sub Worksheet_Calculate() Columns("A:F").AutoFit End Sub BeforeDoubleClick 事件 應(yīng)用于 Worksheet 對象的 Activate 方法。 當(dāng)雙擊某工作表時(shí)產(chǎn)生此事件,此事件先于默認(rèn)的雙擊操作。 Private Sub expression_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) expression 引用在類模塊中帶有事件聲明的 Worksheet 類型對象的變量。 Target 必需。雙擊發(fā)生時(shí)最靠近鼠標(biāo)指針的單元格。 Cancel 可選。當(dāng)事件發(fā)生時(shí)為 False。如果事件過程將該參數(shù)設(shè)為 True,則該 過程執(zhí)行完之后將不進(jìn)行默認(rèn)的雙擊操作。 BeforeRightClick 事件 應(yīng)用于 Worksheet 對象的 Activate 方法。 當(dāng)用鼠標(biāo)右鍵單擊某工作表時(shí)產(chǎn)生此事件,此事件先于默認(rèn)的右鍵單擊操作。 Private Sub expression_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) expression 引用在類模塊中帶有事件聲明的 Worksheet 類型對象的變量。 Target 必需。右鍵單擊發(fā)生時(shí)最靠近鼠標(biāo)指針的單元格。 Cancel 可選。當(dāng)事件發(fā)生時(shí)為 False。如果該事件過程將本參數(shù)設(shè)為 True,則 該過程執(zhí)行結(jié)束之后不進(jìn)行默認(rèn)的右鍵單擊操作。 Change 事件 當(dāng)用戶更改工作表中的單元格,或外部鏈接引起單元格的更改時(shí)產(chǎn)生此事件。 Private Sub Worksheet_Change(ByVal Target As Range) Target 更改的區(qū)域。可以是多個(gè)單元格。 說明 重新計(jì)算引起的單元格更改不觸發(fā)本事件??墒褂?nbsp;Calculate 事件俘獲工作表重新 計(jì)算操作。 本示例將更改的單元格的顏色設(shè)為藍(lán)色。 Private Sub Worksheet_Change(ByVal Target as Range) Target.Font.ColorIndex = 5 End Sub Deactivate 事件 圖表、工作表或工作簿從活動狀態(tài)轉(zhuǎn)為非活動狀態(tài)時(shí)產(chǎn)生此事件。 Private Sub object_Deactivate() object Chart、Workbook 或者 Worksheet。有關(guān)對 Chart 對象使用事件的詳細(xì) 信息,請參閱 Chart 對象事件的用法。 本示例當(dāng)工作簿轉(zhuǎn)為非活動狀態(tài)時(shí),對所有打開的窗口進(jìn)行排列。 Private Sub Workbook_Deactivate() Application.Windows.Arrange xlArrange End Sub FollowHyperlink 事件 當(dāng)單擊工作表上的任意超鏈接時(shí),發(fā)生此事件。對于應(yīng)用程序級或工作簿級的事件, 請參閱 SheetFollowHyperlink 事件。 Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink) Target Hyperlink 類型,必需。一個(gè)代表超鏈接目標(biāo)位置的 Hyperlink 對象。 本示例對在當(dāng)前活動工作簿中訪問過的所有鏈接保留一個(gè)列表或歷史記錄。 Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink) With UserForm1 .ListBox1.AddItem Target.Address .Show End With End Sub PivotTableUpdate 事件 發(fā)生在工作簿中的數(shù)據(jù)透視表更新之后。 Private Sub expression_PivotTableUpdate(ByVal Target As PivotTable) expression 引用在類模塊中帶有事件聲明的 Worksheet 類型對象的變量。 Target 必需。選定的數(shù)據(jù)透視表。 本示例顯示一則消息,說明數(shù)據(jù)透視表已經(jīng)更新。本示例假定您已在類模塊中聲明了 帶有事件的 Worksheet 類型的對象。 Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable) MsgBox "The PivotTable connection has been updated." End Sub SelectionChange 事件 當(dāng)工作表上的選定區(qū)域發(fā)生改變時(shí),將產(chǎn)生本事件。 Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) Target 新選定的區(qū)域。 本示例滾動工作簿窗口,直至選定區(qū)域位于窗口的左上角。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) With ActiveWindow .ScrollRow = Target.Row .ScrollColumn = Target.Column End With End Sub 本示例顯示活動工作簿中工作表 sheet1 上單元格 A1 中的值。 MsgBox Worksheets("Sheet1").Range("A1").Value 本示例顯示活動工作簿中每個(gè)工作表的名稱。 For Each ws In Worksheets MsgBox ws.Name Next ws 本示例向活動工作簿添加新工作表,并設(shè)置該工作表的名稱。 Set newSheet = Worksheets.Add newSheet.Name = "current Budget" 本示例關(guān)閉工作簿 Book1.xls,但不提示用戶保存所作更改。Book1.xls 中的所有 更改都不會保存。 Application.DisplayAlerts = False Workbooks("BOOK1.XLS").Close Application.DisplayAlerts = True 本示例設(shè)置保存文件時(shí)顯示提示,要求用戶輸入?yún)R總信息。 Application.PromptForSummaryInfo = True 本示例顯示 Microsoft Excel 的完整路徑。 Private Sub aa() MsgBox "The path is " & Application.Path End Sub 示例顯示每一個(gè)可用加載宏的路徑及文件名。 For Each a In AddIns MsgBox a.FullName Next a ChDir 語句 改變當(dāng)前的目錄或文件夾。 ChDir path 在 Power Macintosh 中,默認(rèn)驅(qū)動器總是改為在 path 語句中指定的驅(qū)動器。完整 路徑指定由卷標(biāo)名開始,相對路徑由冒號 ( 開始. ChDir 可以辨認(rèn)路徑中指定的 別名: ChDir "MacDrive:Tmp" ' 在 Macintosh 中 本示例顯示當(dāng)前路徑分隔符。 MsgBox "The path separator character is " & _ Application.PathSeparator Move 方法 將一個(gè)指定的文件或文件夾從一個(gè)地方移動到另一個(gè)地方。 語法 object.Move destination Move 方法語法有如下幾部分: 部分 描述 object 必需的。始終是一個(gè) File 或 Folder 對象的名字。 destination 必需的。文件或文件夾要移動到的目標(biāo)。不允許有通配符。 CreateFolder 方法 創(chuàng)建一個(gè)文件夾。 語法 object.CreateFolder(foldername) reateFolder 方法有如下幾部分: 部分 描述 object 必需的。始終是一個(gè) FileSystemObject 的名字。 foldername 必需的。字符串表達(dá)式,它標(biāo)識創(chuàng)建的文件夾。 本示例使用 MkDir 語句來創(chuàng)建目錄或文件夾。如果沒有指定驅(qū)動器,新目錄或文件 夾將會建在當(dāng)前驅(qū)動器中。 MkDir "MYDIR" ' 建立新的目錄或文件夾。 Name 語句示例 本示例使用 Name 語句來更改文件的名稱。示例中假設(shè)所有使用到的目錄或文件夾都 已存在。 在 Macintosh 中,默認(rèn)驅(qū)動器名稱是 “HD” 并且路徑部分由冒號取代 反斜線隔開。 Dim OldName, NewName OldName = "OLDFILE": NewName = "NEWFILE" ' 定義文件名。 Name OldName As NewName ' 更改文件名。 OldName = "C:\MYDIR\OLDFILE": NewName = "C:\YOURDIR\NEWFILE" Name OldName As NewName ' 更改文件名,并移動文件。 本示例顯示當(dāng)前默認(rèn)文件路徑。 MsgBox "The current default file path is " & _ Application.DefaultFilePath 本示例設(shè)置替換啟動文件夾。 Application.AltStartupPath = "C:\EXCEL\MACROS" FolderExists 方法 如果指定的文件夾存在返回 True,不存在返回 False。 語法 object.FolderExists(folderspec) 本示例在單元格中啟用編輯。 Application.EditDirectlyInCell = True 程序說明: 幾種用VBA在單元格輸入數(shù)據(jù)的方法: Public Sub Writes() 1-- 2 方法,最簡單在 "[ ]" 中輸入單元格名稱。 1 [A1] = 100 '在 A1 單元格輸入100。 2 [A2:A4] = 10 '在 A2:A4 單元格輸入10。 3-- 4 方法,采用 Range(" "), " " 中輸入單元格名稱。 3 Range("B1") = 200 '在 B1 單元格輸入200。 4 Range("C1:C3") = 300 '在 C1:C3 單元格輸入300。 5-- 6 方法,采用 Cells(Row,Column),Row是單元格行數(shù),Column是單元格欄數(shù)。 5 Cells(1, 4) = 400 '在 D1 單元格輸入400。 6 Range(Cells(1, 5), Cells(5, 5)) = 50 '在 E1:E 5單元格輸入50。 End Sub 你點(diǎn)選任何單元格,按 Selection 按鈕,則則所點(diǎn)選的單元格均會被輸入文字 "Test"。 Public Sub Selection1() Selection.Value = "Test" '在任何你點(diǎn)選的單元格輸入文字 "Test"。 End Sub VBALesson2 程序說明: 幾種如何把別的工作表 Sheet4 數(shù)據(jù),讀到這個(gè)工作表的方法:在被讀取的單元格 前加上工作表名稱 Sheet4。 Public Sub Writes() 1-- 2 方法,最簡單在被讀取的 "[ ]" 前加上被讀取的工作表名稱 Sheet4。 1 [A1] = Sheet4.[A1] '把Sheet4 A1 單元格的數(shù)據(jù),讀到 A1單元格。 2 [A2:A4] = Sheet4.[B1] ''把 Shee4 工作表單元格 B1 數(shù)據(jù),讀到 A2:A4 單元格。 3-- 4 方法,在被讀取的工作表 Range(" ")的 Range 前加上被讀取的工作表名稱 Sheet4。 3 Range("B1") = Sheet4.Range("B1") ''把 Shee4工作表單元格 B1 數(shù)據(jù),讀 到 B1 單元格。 4 Range("C1:C3") = Sheet4.Range("C1") '把 Shee4 工作表單元格 C1 數(shù)據(jù) ,讀到 C1:C3 單元格。 5-- 6 方法,在被讀取的工作表 Cells(Row,Column),Cells 前加上被讀取工作表 名稱 Sheet4。 5 Cells(1, 4) = Sheet4.Cells(1, 4) '把 Shee4 工作表單元格 D1 數(shù)據(jù),讀 到 D1 單元格。 6 Range(Cells(1, 5), Cells(5, 5)) = Sheet4.Cells(1, 5) '把 Shee4 工 作表單元格 E1 數(shù)據(jù),讀到 E1:E 5單元格。 End Sub 你點(diǎn)選任何單元格,按 Selection 按鈕,則所點(diǎn)選的單元格均會被輸入 Shee4 工 作表單元格 F1 數(shù)據(jù)。 Public Sub Selection1() Selection.Value = Sheet4.[F1] '把 Shee4 工作表單元格 F1 數(shù)據(jù),讀到任 何你點(diǎn)選的單元格。 End Sub VBALesson3 程序說明: 如何利用 Worksheet_SelectionChange 輸入數(shù)據(jù)的方法。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Target = 100 End Sub Target 指的是你鼠標(biāo)所選的單元格,Worksheet_SelectionChange() 事件的參數(shù) 。 可以是一個(gè)也可以是好幾個(gè)單元格。 Range 是 Excel 特有的變量形態(tài),叫范圍。 Target As Rang 是把 Target 這個(gè)參數(shù)設(shè)定為 Range 變量形態(tài)。 Target = 100 是把你點(diǎn)選的單元格輸入數(shù)字100。 VBALesson4 程序說明: 如何利用 Worksheet_SelectionChange 在限定的單元格輸入數(shù)據(jù)的方法。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Row >= 2 And Target.Column = 2 Then Target = 100 End If End Sub If ... Then ... End If 這是我們學(xué)的這一個(gè)邏輯判斷語句。 Target.Row >= 2,指的是鼠標(biāo)選定的單元格的行大于或等于 2。 Target.Column = 2 ,指的是鼠標(biāo)選定的單元格的欄等于 2。 If Target.Row >= 2 And Target.Column = 2 Then 指的是只有在Target.Row >= 2及Target.Column = 2二個(gè)條件成立時(shí)。 就是 (Target.Row >= 2) 為True及(Target.Column = 2)為True時(shí),才執(zhí)行下面的 程序 Target=100, 也就是 B 欄第二行及以下行用鼠標(biāo)被點(diǎn)選時(shí),才會被輸入100,其它單元格則不被輸 入數(shù)據(jù)。 VBALesson5 程序說明: 比較 Worksheet_SelectionChange() 與用按鈕 CommandButton1_Click() 來執(zhí)行 程序二者的方法與寫法有何不同。 Worksheet_SelectionChange()事件 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Row >= 2 And Target.Column = 2 Then Target = 100 End If End Sub 按鈕 CommandButton1_Click() Private Sub CommandButton1_Click() If ActiveCell.Row >= 2 And ActiveCell.Column >= 3 Then ActiveCell = 100 End If End Sub 二者執(zhí)行方法最大的地方,在于 Worksheet_SelectionChange() 是自動的,你不用 了解他是怎么完成工作的。 按鈕 CommandButton1_Click() 是人工的,比 SelectionChange()多一道手續(xù), 就是要去按那接鈕,程序才會執(zhí)行。 SelectionChange() 有一個(gè)參數(shù) Target 可用;CommandButton1_Click ()沒有。 所以我們要用 ActiveCell 內(nèi)定函數(shù)來取代Target,ActiveCell 與 Target最大的 不同點(diǎn)他只能指定一個(gè)單元格。 就是你選取多個(gè)單元格也只有最上面的單元格會加上數(shù)據(jù);用 Selection 取代 ActiveCell, 用法就跟 Target 一樣了。 VBALesson 6 程序說明: 完整的 If...Then ┅ End 邏輯判斷式。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Row >= 2 And Target.Column = 2 Then Target = 200 ElseIf Target.Row >= 2 And Target.Column = 3 Then Target = 300 ElseIf Target.Row >= 2 And Target.Column = 2 Then Target = 400 Else Target = 500 End If End Sub 這是個(gè)完整的 If 邏輯判斷式,意思是說,假如 If 後的判斷式條件成立的話,就 執(zhí)行第二條程序,否則假如 ElseIf 後的判斷式條件成立的話,就執(zhí)行第四條程序 ,否則假如另一個(gè) ElseIf 後的判斷式條件成立的話,就執(zhí)行第六條程序。 Else 的意思是說,假如以上條件都不成立的話,就執(zhí)行第八條程序。 他的執(zhí)行方式是假如 IF 的條件成立的話,就不執(zhí)行其它ElseIf 及Else 的邏輯判 斷式,假如 If 後的條件不成立的話才會執(zhí)行 ElseIf 或 Else 邏輯判斷式。第二 個(gè) ElseIf後的條件因?yàn)榕c IF 後的條件一樣,所以這個(gè)判斷式後面的 Target=400 將是永遠(yuǎn)無法執(zhí)行到的程序。 VBALesson 7 程序說明∶我們?yōu)槭颤N要用變數(shù)。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim i , j As Integer Dim k As Range i = Target.Row j = Target.Column Set k = Target If i >= 2 And j = 2 Then k = 200 ElseIf i >= 2 And j = 3 Then k = 300 ElseIf i >= 2 And j = 4 Then k = 400 Else k = 500 End If End Sub 跟VBALesson 6比較,程序是不是明朗多了,在前課重復(fù)的用 Target.Row, Target.Column及Target來寫程序是不是有一點(diǎn)煩。用變量的第一個(gè)好處大家馬上感 覺得出來,就是可以簡化程序。 使用變量前,你得先宣告變量。宣告變量的方法是在 "Dim " 后面寫上變量 " i " As 后面接上變量的形態(tài) "Integer"。 Dim i , j As Integer 就是宣告 i 與 j 為整數(shù)變量,這是同時(shí)宣告二個(gè)變量 i 與 j 所以要在二個(gè)變量間加個(gè) " , "號。 Dim k As Range 是宣告 k 為范圍資料形態(tài),Range這是 Excel 特有的資料形態(tài) 。 i = Target.Row是把當(dāng)前單元格的行數(shù),指定給變量 i。 j = Target.Column 是把當(dāng)前單元格的欄數(shù),指定給變量 j。 Set k = Target 是把當(dāng)前的單元格,指定給變量 k。 用像 i 與 j 這樣簡單的變量,在程序的前面你可能還記得 i 或 j 代表著 什厶。程序?qū)戦L了,你可能忘記 i 或 j 代表著什厶。所以最好的方法是用比較有 意義的代號,來為變量命名如 iRow 或 iCol 來取代 i 及 j 。 VBALesson 8 程序說明∶體會一下Worksheet_Change()事件。 Private Sub Worksheet_Change(ByVal Target As Range) Dim iRow, iCol As Integer iRow = Target.Row iCol = Target.Column If iRow >= 2 And iCol = 2 And Target "" Then Application.EnableEvents = False Cells(iRow, iCol + 1) = Cells(iRow, iCol) * 2 Application.EnableEvents = True ElseIf iRow >= 2 And iCol = 2 And Target = "" Then Cells(iRow, iCol + 1) = "" Else Cells(iRow, iCol + 1) = "" End If End Sub 前幾個(gè)教程都是用Worksheet_SelectionChange 事件來舉例子,大家應(yīng)該能體會他 是怎厶一回事了吧。 這個(gè)教程就是要讓你來體會什厶是Worksheet_Chang()事件。因?yàn)檫@二個(gè)事件在VBA 都是非常有用的,所以一定要了解。 簡單的說,前者是你鼠標(biāo)移動到那個(gè)單元格,就觸發(fā)那個(gè)事件的執(zhí)行。後者是要等到 你點(diǎn)選的單元格,數(shù) |
|