Excel中各种VBA写法http://www.cnblogs.com/xioxu/archive/2007/09/19/898282.html 先贴一段网上找的excel的各种事件 工作簿对象事件一览表 再贴一堆代码 例为设置密码窗口 (1)
If w.Name ThisWorkbook.Name Then w.Close savechanges:=True End If Next w Activate 事件 激活一个工作簿、工作表、图表或嵌入图表时产生此事件。 当激活工作表时,本示例对 A1:A10 区域进行排序。 Private Sub Worksheet_Activate() Range("a1:a10").Sort Key1:=Range("a1"), order:=xlAscending End Sub Calculate 事件 对于 Worksheet 对象,在对工作表进行重新计算之后产生此事件 每当工作表重新计算时,本示例就调整 A 列到 F 列的宽度。 Private Sub Worksheet_Calculate() Columns("A:F").AutoFit End Sub BeforeDoubleClick 事件 应用于 Worksheet 对象的 Activate 方法。 当双击某工作表时产生此事件,此事件先于默认的双击操作。 Private Sub expression_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) expression 引用在类模块中带有事件声明的 Worksheet 类型对象的变量。 Target 必需。双击发生时最靠近鼠标指针的单元格。 Cancel 可选。当事件发生时为 False。如果事件过程将该参数设为 True,则该 过程执行完之后将不进行默认的双击操作。 BeforeRightClick 事件 应用于 Worksheet 对象的 Activate 方法。 当用鼠标右键单击某工作表时产生此事件,此事件先于默认的右键单击操作。 Private Sub expression_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) expression 引用在类模块中带有事件声明的 Worksheet 类型对象的变量。 Target 必需。右键单击发生时最靠近鼠标指针的单元格。 Cancel 可选。当事件发生时为 False。如果该事件过程将本参数设为 True,则 该过程执行结束之后不进行默认的右键单击操作。 Change 事件 当用户更改工作表中的单元格,或外部链接引起单元格的更改时产生此事件。 Private Sub Worksheet_Change(ByVal Target As Range) Target 更改的区域。可以是多个单元格。 说明 重新计算引起的单元格更改不触发本事件。可使用 Calculate 事件俘获工作表重新 计算操作。 本示例将更改的单元格的颜色设为蓝色。 Private Sub Worksheet_Change(ByVal Target as Range) Target.Font.ColorIndex = 5 End Sub Deactivate 事件 图表、工作表或工作簿从活动状态转为非活动状态时产生此事件。 Private Sub object_Deactivate() object Chart、Workbook 或者 Worksheet。有关对 Chart 对象使用事件的详细 信息,请参阅 Chart 对象事件的用法。 本示例当工作簿转为非活动状态时,对所有打开的窗口进行排列。 Private Sub Workbook_Deactivate() Application.Windows.Arrange xlArrange End Sub FollowHyperlink 事件 当单击工作表上的任意超链接时,发生此事件。对于应用程序级或工作簿级的事件, 请参阅 SheetFollowHyperlink 事件。 Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink) Target Hyperlink 类型,必需。一个代表超链接目标位置的 Hyperlink 对象。 本示例对在当前活动工作簿中访问过的所有链接保留一个列表或历史记录。 Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink) With UserForm1 .ListBox1.AddItem Target.Address .Show End With End Sub PivotTableUpdate 事件 发生在工作簿中的数据透视表更新之后。 Private Sub expression_PivotTableUpdate(ByVal Target As PivotTable) expression 引用在类模块中带有事件声明的 Worksheet 类型对象的变量。 Target 必需。选定的数据透视表。 本示例显示一则消息,说明数据透视表已经更新。本示例假定您已在类模块中声明了 带有事件的 Worksheet 类型的对象。 Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable) MsgBox "The PivotTable connection has been updated." End Sub SelectionChange 事件 当工作表上的选定区域发生改变时,将产生本事件。 Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) Target 新选定的区域。 本示例滚动工作簿窗口,直至选定区域位于窗口的左上角。 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 本示例显示活动工作簿中每个工作表的名称。 For Each ws In Worksheets MsgBox ws.Name Next ws 本示例向活动工作簿添加新工作表,并设置该工作表的名称。 Set newSheet = Worksheets.Add newSheet.Name = "current Budget" 本示例关闭工作簿 Book1.xls,但不提示用户保存所作更改。Book1.xls 中的所有 更改都不会保存。 Application.DisplayAlerts = False Workbooks("BOOK1.XLS").Close Application.DisplayAlerts = True 本示例设置保存文件时显示提示,要求用户输入汇总信息。 Application.PromptForSummaryInfo = True 本示例显示 Microsoft Excel 的完整路径。 Private Sub aa() MsgBox "The path is " & Application.Path End Sub 示例显示每一个可用加载宏的路径及文件名。 For Each a In AddIns MsgBox a.FullName Next a ChDir 语句 改变当前的目录或文件夹。 ChDir path 在 Power Macintosh 中,默认驱动器总是改为在 path 语句中指定的驱动器。完整 路径指定由卷标名开始,相对路径由冒号 ( 开始. ChDir 可以辨认路径中指定的 别名: ChDir "MacDrive:Tmp" ' 在 Macintosh 中 本示例显示当前路径分隔符。 MsgBox "The path separator character is " & _ Application.PathSeparator Move 方法 将一个指定的文件或文件夹从一个地方移动到另一个地方。 语法 object.Move destination Move 方法语法有如下几部分: 部分 描述 object 必需的。始终是一个 File 或 Folder 对象的名字。 destination 必需的。文件或文件夹要移动到的目标。不允许有通配符。 CreateFolder 方法 创建一个文件夹。 语法 object.CreateFolder(foldername) reateFolder 方法有如下几部分: 部分 描述 object 必需的。始终是一个 FileSystemObject 的名字。 foldername 必需的。字符串表达式,它标识创建的文件夹。 本示例使用 MkDir 语句来创建目录或文件夹。如果没有指定驱动器,新目录或文件 夹将会建在当前驱动器中。 MkDir "MYDIR" ' 建立新的目录或文件夹。 Name 语句示例 本示例使用 Name 语句来更改文件的名称。示例中假设所有使用到的目录或文件夹都 已存在。 在 Macintosh 中,默认驱动器名称是 “HD” 并且路径部分由冒号取代 反斜线隔开。 Dim OldName, NewName OldName = "OLDFILE": NewName = "NEWFILE" ' 定义文件名。 Name OldName As NewName ' 更改文件名。 OldName = "C:\MYDIR\OLDFILE": NewName = "C:\YOURDIR\NEWFILE" Name OldName As NewName ' 更改文件名,并移动文件。 本示例显示当前默认文件路径。 MsgBox "The current default file path is " & _ Application.DefaultFilePath 本示例设置替换启动文件夹。 Application.AltStartupPath = "C:\EXCEL\MACROS" FolderExists 方法 如果指定的文件夹存在返回 True,不存在返回 False。 语法 object.FolderExists(folderspec) 本示例在单元格中启用编辑。 Application.EditDirectlyInCell = True 程序说明: 几种用VBA在单元格输入数据的方法: 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是单元格行数,Column是单元格栏数。 5 Cells(1, 4) = 400 '在 D1 单元格输入400。 6 Range(Cells(1, 5), Cells(5, 5)) = 50 '在 E1:E 5单元格输入50。 End Sub 你点选任何单元格,按 Selection 按钮,则则所点选的单元格均会被输入文字 "Test"。 Public Sub Selection1() Selection.Value = "Test" '在任何你点选的单元格输入文字 "Test"。 End Sub VBALesson2 程序说明: 几种如何把别的工作表 Sheet4 数据,读到这个工作表的方法:在被读取的单元格 前加上工作表名称 Sheet4。 Public Sub Writes() 1-- 2 方法,最简单在被读取的 "[ ]" 前加上被读取的工作表名称 Sheet4。 1 [A1] = Sheet4.[A1] '把Sheet4 A1 单元格的数据,读到 A1单元格。 2 [A2:A4] = Sheet4.[B1] ''把 Shee4 工作表单元格 B1 数据,读到 A2:A4 单元格。 3-- 4 方法,在被读取的工作表 Range(" ")的 Range 前加上被读取的工作表名称 Sheet4。 3 Range("B1") = Sheet4.Range("B1") ''把 Shee4工作表单元格 B1 数据,读 到 B1 单元格。 4 Range("C1:C3") = Sheet4.Range("C1") '把 Shee4 工作表单元格 C1 数据 ,读到 C1:C3 单元格。 5-- 6 方法,在被读取的工作表 Cells(Row,Column),Cells 前加上被读取工作表 名称 Sheet4。 5 Cells(1, 4) = Sheet4.Cells(1, 4) '把 Shee4 工作表单元格 D1 数据,读 到 D1 单元格。 6 Range(Cells(1, 5), Cells(5, 5)) = Sheet4.Cells(1, 5) '把 Shee4 工 作表单元格 E1 数据,读到 E1:E 5单元格。 End Sub 你点选任何单元格,按 Selection 按钮,则所点选的单元格均会被输入 Shee4 工 作表单元格 F1 数据。 Public Sub Selection1() Selection.Value = Sheet4.[F1] '把 Shee4 工作表单元格 F1 数据,读到任 何你点选的单元格。 End Sub VBALesson3 程序说明: 如何利用 Worksheet_SelectionChange 输入数据的方法。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Target = 100 End Sub Target 指的是你鼠标所选的单元格,Worksheet_SelectionChange() 事件的参数 。 可以是一个也可以是好几个单元格。 Range 是 Excel 特有的变量形态,叫范围。 Target As Rang 是把 Target 这个参数设定为 Range 变量形态。 Target = 100 是把你点选的单元格输入数字100。 VBALesson4 程序说明: 如何利用 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 If ... Then ... End If 这是我们学的这一个逻辑判断语句。 Target.Row >= 2,指的是鼠标选定的单元格的行大于或等于 2。 Target.Column = 2 ,指的是鼠标选定的单元格的栏等于 2。 If Target.Row >= 2 And Target.Column = 2 Then 指的是只有在Target.Row >= 2及Target.Column = 2二个条件成立时。 就是 (Target.Row >= 2) 为True及(Target.Column = 2)为True时,才执行下面的 程序 Target=100, 也就是 B 栏第二行及以下行用鼠标被点选时,才会被输入100,其它单元格则不被输 入数据。 VBALesson5 程序说明: 比较 Worksheet_SelectionChange() 与用按钮 CommandButton1_Click() 来执行 程序二者的方法与写法有何不同。 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 二者执行方法最大的地方,在于 Worksheet_SelectionChange() 是自动的,你不用 了解他是怎么完成工作的。 按钮 CommandButton1_Click() 是人工的,比 SelectionChange()多一道手续, 就是要去按那接钮,程序才会执行。 SelectionChange() 有一个参数 Target 可用;CommandButton1_Click ()没有。 所以我们要用 ActiveCell 内定函数来取代Target,ActiveCell 与 Target最大的 不同点他只能指定一个单元格。 就是你选取多个单元格也只有最上面的单元格会加上数据;用 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 这是个完整的 If 逻辑判断式,意思是说,假如 If 後的判断式条件成立的话,就 执行第二条程序,否则假如 ElseIf 後的判断式条件成立的话,就执行第四条程序 ,否则假如另一个 ElseIf 後的判断式条件成立的话,就执行第六条程序。 Else 的意思是说,假如以上条件都不成立的话,就执行第八条程序。 他的执行方式是假如 IF 的条件成立的话,就不执行其它ElseIf 及Else 的逻辑判 断式,假如 If 後的条件不成立的话才会执行 ElseIf 或 Else 逻辑判断式。第二 个 ElseIf後的条件因为与 IF 後的条件一样,所以这个判断式後面的 Target=400 将是永远无法执行到的程序。 VBALesson 7 程序说明∶我们为什麽要用变数。 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比较,程序是不是明朗多了,在前课重复的用 Target.Row, Target.Column及Target来写程序是不是有一点烦。用变量的第一个好处大家马上感 觉得出来,就是可以简化程序。 使用变量前,你得先宣告变量。宣告变量的方法是在 "Dim " 后面写上变量 " i " As 后面接上变量的形态 "Integer"。 Dim i , j As Integer 就是宣告 i 与 j 为整数变量,这是同时宣告二个变量 i 与 j 所以要在二个变量间加个 " , "号。 Dim k As Range 是宣告 k 为范围资料形态,Range这是 Excel 特有的资料形态 。 i = Target.Row是把当前单元格的行数,指定给变量 i。 j = Target.Column 是把当前单元格的栏数,指定给变量 j。 Set k = Target 是把当前的单元格,指定给变量 k。 用像 i 与 j 这样简单的变量,在程序的前面你可能还记得 i 或 j 代表着 什厶。程序写长了,你可能忘记 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 前几个教程都是用Worksheet_SelectionChange 事件来举例子,大家应该能体会他 是怎厶一回事了吧。 这个教程就是要让你来体会什厶是Worksheet_Chang()事件。因为这二个事件在VBA 都是非常有用的,所以一定要了解。 简单的说,前者是你鼠标移动到那个单元格,就触发那个事件的执行。後者是要等到 你点选的单元格,数 |
|
来自: COPY&PASTE > 《excel vba》