|
楼主 |
发表于 2009-6-20 10:23
|
显示全部楼层
第11部分 其他应用
技巧188 VBE的操作
188-2 建立事件过程
在使用VBA代码添加工作表后,如果需要在新工作表中添加事件过程,可以使用技巧188-1中的添加代码的方法,但是事件过程一般包含参数,因此此方法容易出错,所以更好的方法是使用CreateEventProc方法,如下面的代码所示。- #001 Sub AddMatter()
- #002 Dim Sh As Worksheet
- #003 Dim i As Integer
- #004 For Each Sh In Worksheets
- #005 If Sh.Name = "abc" Then
- #006 MsgBox "工作簿中已有""abc""工作表,不能重复添加!"
- #007 Exit Sub
- #008 End If
- #009 Next
- #010 Set Sh = Sheets.Add(After:=Sheets(Sheets.Count))
- #011 Sh.Name = "abc"
- #012 Application.VBE.MainWindow.Visible = True
- #013 With ThisWorkbook.VBProject.VBComponents(Sh.CodeName).CodeModule
- #014 i = .CreateEventProc("SelectionChange", "Worksheet")
- #015 .ReplaceLine i + 1, vbTab _
- #016 & "MsgBox ""你选择了"" & Target.Address(0, 0) & ""单元格!"""
- #017 End With
- #018 Application.VBE.MainWindow.Visible = False
- #019 Set Sh = Nothing
- #020 End Sub
复制代码 代码解析:
AddMatter过程在工作簿中新建一张“abc”工作表,并在工作表的SelectionChange事件中写入事件代码。
第4行到第11行代码使用Add方法在工作簿中新建一张工作表,请参阅技巧25 。
第12行代码打开VBE窗口。
第14行代码使用CreateEventProc方法在新添加的工作表中创建“SelectionChange”过程并将起始行号赋给变量i。
应用于CodeModule对象的CreateEventProc方法创建一个事件过程,语法如下:
object.CreateEventProc(eventname, objectname) As Long
参数object是必需的,一个有效的对象表达式。
参数eventname是必需的,用来指定欲添加到模块的事件名称。
参数objectname是必需的,用来指定事件源的对象名称。
CreateEventProc方法创建成功则返回事件过程开始行的行号,其创建的过程只包含一个空行。
第15、16行代码使用ReplaceLine方法将空行替换为指定的代码。应用于CodeModule对象的ReplaceLine方法用特定的代码代替原代码,语法如下:
object.ReplaceLine(line, code)
参数object是必需的,一个有效的对象表达式。
参数line是必需的,用来指定所要代替的行号。
参数code是必需的,用来指定要插入的代码。
第18行代码关闭VBE窗口。
运行AddMatter过程在工作簿中新建一张“abc”工作表,并在工作表中写入事件代码,如图所示。
[ 本帖最后由 yuanzhuping 于 2009-6-23 09:02 编辑 ] |
|