Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 5807|回复: 10

[分享] VBA入门之三《夏夜,我们看萤火虫》

[复制链接]
发表于 2006-12-11 00:33 | 显示全部楼层 |阅读模式
 

气温日见上升,在没有空调的电脑房里笑傲秋老虎,真英雄也。苦在今宵,乐在明朝,坚持吧,满嘴VBA行话,是不是你长久期待、梦寐以求的酷?

1“事件”像萤火虫,有心看它,你会觉得很美。

开关一按,灯亮了

把手一扬,的士靠边停下

老师说“下课”,同学们涌出教室

灯亮了、的士停下、涌出教室都是“事件”,这些事件的发生都有前因后果,因为“一按”,所以“亮了”等等。在特定环境下,什么样的动作与什么样的事件都是一一对应的。

三句不离本行,我要说的是,在VBA工程中,存在许许多多的事件。

还记得吗?点击按钮,弹出一个对话框“哈哈,我会 VBA 啦……”

还记得吧?点击按钮,为A8单元格填充了一个数据。

因为“点击”,所以发生后面的“事件”。

打开下面的附件,有两个工作表,用鼠标去点击按钮和图片,稍后回来,我们一起讨论“事件”。

[此贴子已经被admin于2007-2-10 10:21:34编辑过]
 楼主| 发表于 2006-12-11 00:36 | 显示全部楼层
本帖最后由 爱疯 于 2011-6-24 20:07 编辑

2“事件”像萤火虫,有心看它,总想知道它在哪发光。

在第一个工作表中,有两个按钮,当你把鼠标移到它上面时,它就移动一个位置。第二个工作表中,用左键和右键得到不同的运行效果。这都是运用“事件”的效果。

①鼠标单击事件Click。

实际上,我们从第一讲开始就接触了“事件”,只是没有提它,你也可能没有在意。打开你编写过代码的工作簿,在VBE编辑窗口中可以看到,无论按钮的名称是CommandButton1,还是CommandButton2,代码第一行的后面都是“_Click()”:

 

Private Sub CommandButton1_Click()

    MsgBox "哈哈,我会 VBA 啦……"

End Sub

 
这个“Click”表示“鼠标的单击事件”。

就像你家的开关不能控制他家的灯一样,用鼠标单击不同的控件,都发生“Click”事件,但触发运行的代码却各不相同,点击CommandButton1,运行:

Private Sub CommandButton1_Click()

End Sub

点击CommandButton2,运行:

Private Sub CommandButton2_Click()

End Sub

②鼠标移动事件。

单击控件时,触发“Click”事件,除了该事件,还有哪些“事件”呢?

在上面附件中找到如下代码(如果找不到,先到楼下看看,记着回来哦):

Private Sub CommandButton1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    '当鼠标移动到按钮CommandButton1上面时,发生本事件,执行下面代码:
    CommandButton1.Top = CommandButton1.Top + 10
    CommandButton1.ForeColor = Int(Rnd * 16777215)
End Sub

“MouseMove”是移动鼠标事件。如果你想在鼠标移动到CommandButton2时返回什么信息或者修改某单元格的值,那么你应该把代码写在:

Private Sub CommandButton2_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
'这里写代码
End Sub

③点击鼠标按钮事件。

哄小孩子的把戏结束了,小孩子不会知道这是点击鼠标按钮事件“MouseDown”,但你会知道,应该知道。

Private Sub Image1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    '在控件 Image1 上按下鼠标按钮时,触发本事件,运行如下代码:
   
    MsgBox "回答" & Mid("对错", Button, 1) & "了。            ", 64 - (Button - 1) * 16, "蓝猫告诉你"
    [c3] = Int(Rnd * 20)
    [e3] = Int(Rnd * 20)
   
End Sub

MouseDown 与 Click 好像是同一回事,点击鼠标左键既触发“Click”事件,又触发“MouseDown”事件,它们之间的区别是,“MouseDown”发生在鼠标按下按钮还没有松开的那一段时间,接着松开鼠标又触发“MouseUp”事件,“Click”是整个过程,点击过按钮后,先触发“MouseDown”事件,后触发“Click”事件。另一个区别是,鼠标右键点击控件,不触发“Click”事件。

除了以上介绍的“事件”,还有许多:

激活工作表的时候,触发Activate事件。

当用鼠标右键单击工作表时产生BeforeRightClick事件。

打开工作簿时,触发Open事件。

打印工作表时,触发BeforePrint事件。

等等

不同对象间的事件不一定相同,如按钮有13个事件,工作表有9个事件,工作簿有28个事件,以后会掌握的。

回复

使用道具 举报

 楼主| 发表于 2006-12-11 00:36 | 显示全部楼层
本帖最后由 爱疯 于 2011-6-24 19:44 编辑

这一层介绍几个概念,可以不看。

3、控件的名称

按钮和其它所有的控件,都有默认的名字,但允许修改它。


练习一下,添加按钮,打开属性框,修改名称,双击控件进入VBE窗口,观察过程名称(控件名_事件名)。

4、工程、模块、过程

下图所示的窗口称为“工程资源管理器”。一个工作簿对应一个VBA“工程”,工程下面分若干“模块”,模块中可以有若干“过程”。


模块是对过程管理的一个中间层,可以理解为一个目录的作用。你的控件在sheet1中,双击它,自动把代码写在sheet1的模块里,如果控件在sheet2,双击它,则自动把代码写在sheet2的模块里,不同工作表可以有相同名称的控件,对应地,不同模块里,可以有相同名称的过程。

右键单击工作表标签,选择“查看代码”,自动打开该工作表对应的模块。

在工程资源管理器里,双击模块名,打开该模块。可以浏览和编辑该模块下的过程代码。

VBE主窗口是代码编辑器,灰色线条分开的是各个过程。


2楼说到哪里了?回头看一遍,接着下楼继续。

回复

使用道具 举报

 楼主| 发表于 2006-12-11 00:39 | 显示全部楼层
本帖最后由 爱疯 于 2011-6-24 19:49 编辑

5、“事件”像萤火虫,只要你喜欢,可以捧在手心,可以把它放飞。

看这个帖子,可谓喜忧参半,VBA逐渐被我们掌控和驯服,这是喜,可是,那比火车还长的过程名,让人看了心里发毛,怎么记呀,怎么写呀?就像这:

Private Sub CommandButton2_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)

End Sub

 

是啊,谁能把它背下来。不用背,我就没背过,相信你也不用,耳听为虚,眼见为实:

在控件所在模块中,点击如图所示的“对象”下拉菜单,你工作表中添加的控件,都在这个列表中。如图所示,选择它。

 

 

如果还没有为这个对象编写过代码,它会自动建立一个默认的过程。如果这个过程不是你需要的,以后可以删除它,留一个空的过程在哪也没关系。

选择好对象之后,窗口右边的一个组合框就是这个对象的“事件”列表,也即是“过程”列表。点击下拉按钮,选择你需要的过程名:


 

接下来,就是发挥你智慧的时候了,试试在过程中写上点什么代码,然后制造点“事端”运行它。耳听为虚,眼见为实,手动为真。

练习:把“中国移动”改为“一江春水向东流”,让鼠标一碰它就往右挪,“月亮走我也走”改为“跟屁虫”,当鼠标碰到它时,就跟在前边按钮的后面,两个按钮相互连着:


 

200612110425378812.rar (10.02 KB, 下载次数: 22)

回复

使用道具 举报

 楼主| 发表于 2006-12-11 00:43 | 显示全部楼层
本帖最后由 爱疯 于 2011-6-24 19:56 编辑

6、“事件”像萤火虫,东边在飞,西边也在飞。

与控件存在事件一样,工作表也存在事件,共有9个。这9个事件当中,其中有两个是编程中最常用到的,可称亨哈二将,在此认识认识它:

 

①选定新的单元格区域时,产生SelectionChange事件。

②改变单元格的值时,产生Change事件。

 

20061211046054876.rar (13.61 KB, 下载次数: 12)

回复

使用道具 举报

 楼主| 发表于 2006-12-11 00:47 | 显示全部楼层
本帖最后由 爱疯 于 2011-6-24 19:58 编辑

前面介绍过,VBA工程中有一个工作簿模块,双击它,在对象下拉列表中选择“Workbook”,从右边的过程列表中可以看到,工作簿共有28个事件。我们也来认识其中的一两个:

①打开工作簿时,产生 Open 事件,系统自动运行代码。把下面代码加入到工作簿模块中,试试:


Private Sub Workbook_Open()
    MsgBox "现在打开 " & ThisWorkbook.Name & "         " & Chr(13) _
         & "工作簿共有 " & Worksheets.Count & " 个工作表", 64, "信息"
End Sub

通常在这个过程中,处理一些初始化的事务,清除工作表中无用数据、打开自定义窗体、验证用户权限等。

 

②打印工作簿时,产生BeforePrint事件。示例:

200612110474318972.rar (6.76 KB, 下载次数: 13)

回复

使用道具 举报

 楼主| 发表于 2006-12-11 00:48 | 显示全部楼层
本帖最后由 爱疯 于 2011-6-24 20:08 编辑

7、“事件”像萤火虫,如果喜欢,她们都是你的。


到了现在,最大的疑惑,就是,除了上面介绍的几个事件有个粗略的了解,其它事件还是一无所知,怎么办呢?是不是山菊花还接着讲?不讲,也不必讲。第一讲中提到一个有用的功能“F1”,还在用吧?注意一点,在这里,你要用选取的办法,如下所示,选取“SelectionChange”,再按F1。

 
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

End Sub
 

再会。

回复

使用道具 举报

 楼主| 发表于 2006-12-11 00:48 | 显示全部楼层

VBA入门之三
QUOTE:
以下是引用ai4ni在2006-8-18 14:51:50的发言:

山菊花老师,我想问你一个本课之外的问题,你讲到工作表事件的时候,有一个附件,是有关"清除数据"的那一个EXCEL表,请问为什么A列,C列不可以选择,我点到他们的时候就自动移动到B列了,请问这个是如何设置的,还有A列C列自动填充的内容,是用的公式吗?请指教,不胜感激!

 

这也是事件的效果--选择单元格事件。

考考你,在模块中找代码。

[此贴子已经被admin于2007-2-10 10:22:47编辑过]
回复

使用道具 举报

发表于 2006-12-11 09:14 | 显示全部楼层

谢谢分享,我一定会努力的[em01]
回复

使用道具 举报

发表于 2006-12-11 12:47 | 显示全部楼层

收藏了先!我喜欢这样图文并茂的好帖子

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-31 15:37 , Processed in 0.354980 second(s), 6 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表