Excel精英培训网

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

[分享] VBA班第6课:课堂笔记

[复制链接]
发表于 2007-7-7 20:55 | 显示全部楼层 |阅读模式

休息时间,先发一下笔记先.家里可能要断网了,担心上不来.不多说.发贴

时间:2007年7月7日晚7点至9点

辅导:QEE用

主题:工作表事件

内容:

1.概念

2.常用事件

3.如何从外部调用事件

4.事件的特点小结

 

 

1.          概念

我的一惯主张是:

学习VBA对待概念,并不需要死记硬背,但需要做到 两点:

(1)需要能够识别

当遇到事件时,应知道这是事件。不能把事件和属 性、方法混淆

现在请大家按ALT+F11打开VBE编辑器

在VBE的右方

顶部会看到两个方框

分别为(通用),(声明)

 (通用)是对象列表框,点下拉箭头,会看到对象

双击左边的Sheet1

 现在对象列表框只有一个对象WorkSheet

 

 

在对象列表框选择WorkSheet 后,右边原来的(声明)便跟着改变

(声明)框,即是事件列表框,点它的下拉箭头,会看到右边对象WorkSheet的全部事件列表


 


 

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
 楼主| 发表于 2007-7-7 21:19 | 显示全部楼层

学习VBA对待概念,并不需要死记硬背,但需要做到 两点:

 

 

 

(1)需要能够识别

当遇到事件时,应知道这是事件。不能把事件和属 性、方法混淆 

第一点,大家应该能做到了吧(不需回答) 

(2)在上面的基础上看一下教科书或帮助中对事 件的标准定义,以加深了解

 

 

 

下面给大家贴出标准定义:

事件是一个对象可以辨认的动作,像单击鼠标或按下某键等,并且可以写某些代码针对此述动作来做 响应。用户做动作或程序代码的结果可能导致事件 的发生,或是由系统引发。

 

 

 

请大家实验完毕后去掉加入的代码

 

 

 

回复

使用道具 举报

 楼主| 发表于 2007-7-7 21:20 | 显示全部楼层

 

请大家实验完毕后去掉加入的代码

 

 

 

 

现在讲第二部分

[此贴子已经被element于2007-7-9 11:26:38编辑过]
回复

使用道具 举报

 楼主| 发表于 2007-7-7 21:21 | 显示全部楼层

第二部份:

1.     常用事件

 

工作表的事件有9个

按常用性划分,可以分为3级

 

最常用的SelectionChange,Change

 

比较常用

Activate

Deactivate

Calculate

BeforeRightClick

BeforeDoubleClick

 

不常用

*FollowHyperlink

*PivotTableUpdate

 

以上只是大体的一般划分,不考虑特殊情况  
回复

使用道具 举报

 楼主| 发表于 2007-7-7 21:22 | 显示全部楼层

下面我们分别讲它们的用途

SelectionChange

工作表上的选定区域发生改变时,将产生本事件。

这个事件我们刚才已经实验过

Worksheet_SelectionChange(ByVal Target As Range)

事件过程的参数只有一个,即Target Target是新被选定的区域

 

 

练习:

下面我们完成几个小任务,加深对它的认识:

(1)当用户点击A1单元格时,给出提示

提示内容自定,谁可以贴一下代码?

 

正确例子:

lvfeng1123

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    If Target.Address = "$A$1" Then

        MsgBox "你选择了A1单元格"

    End If

End Sub

 

[此贴子已经被作者于2007-7-7 21:23:02编辑过]
回复

使用道具 举报

 楼主| 发表于 2007-7-7 21:23 | 显示全部楼层

错误例子:

Luckyguy:

If Target = Range("a1") Then

MsgBox Target.Address

End If

 

Luckyguy的方法是不准确的

参数只能用里面点击后出现的参数吗?

是的

If Target = Range("a1")

比较的是被选定单元格和A1的值,

不同的单元格值是可能相等的

 

(1)如果选定单元格的值为5则给出提示

例:

lvfeng1123

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    If Target.Value = 5 Then

        MsgBox "答案正确"

    End If

End Sub

大家主要可以通过它们了解和巩固一下基础知识

原则上,这不属于事件的内容,但我们离不开它

下道题加一点难度

 

回复

使用道具 举报

 楼主| 发表于 2007-7-7 21:25 | 显示全部楼层

(3)判断用户是选定了一个单元格还是一个区域,分别提示

一个单元格:你选了一个单元格

区域:你选了?个单元格

 

例1:

Luckyguy

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    If Target.Count = 1 Then

            MsgBox "你选了一个单元格"

        Else

            MsgBox "你选了" & Target.Count & "个单元格"

    End If

End Sub

 

2情人泪

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

If Target.Count > 1 Then

MsgBox "你选定了" & Target.Count & "个单元格"

Else

MsgBox "你选了一个单元格"

End If

 

End Sub

 

3lvfeng1123

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    If Target.Count = 1 Then

        MsgBox "你选了一个单元格"

    Else

        MsgBox "你选了" & Target.Count & "个单元格"

    End If

End Sub

 

 

判断单元格个数量就是Count属性

 

回复

使用道具 举报

 楼主| 发表于 2007-7-7 21:26 | 显示全部楼层

(4)当用户选定的单元格的值和它左边单元格相等时,选定的单元格的值加1

大家不用考虑用错的问题

可以在代码首行加上

on error resume next

 

例1:Luckyguy

 

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

On Error Resume Next

    If Target.Value = Target.Offset(0, -1).Value Then

        Target.Value = Target.Value + 1

    End If

End Sub

 

(5)当选定区域是A1并且只包含A1单元格时才给出提示

例1:逍遥自在

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    If Target.Count = 1 And Target.Row = 1 And Target.Column = 1 Then

        MsgBox "你选中了A1单元格"

    End If

End Sub

 

回复

使用道具 举报

 楼主| 发表于 2007-7-7 21:28 | 显示全部楼层

*(6)判断选定区域是否包含B1单元格 (思考题)

例1:Luckyguy

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    On Error Resume Next

    If Union(Target, Range("B1")).Address = Target.Address Then

        MsgBox "你选择的区域包括B1单元格"

    End If

End Sub

 

2Luckyguy

 

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Dim abc As Range, hasb2 As Boolean

hasb2 = False

For Each abc In Target

    If abc.Address = "$B$2" Then

        hasb2 = True

    End If

Next abc

If hasb2 Then

    MsgBox "包含了B2 "

End If

End Sub

 

回复

使用道具 举报

 楼主| 发表于 2007-7-7 21:29 | 显示全部楼层

3:情人泪:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Dim A As Range

For Each A In Target

If A.Address = Range("B1").Address Then

MsgBox "你选择的区域包括B1"

Exit Sub

End If

Next

MsgBox "你选择的区域不包括B1"

End Sub

 

4V20

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Set isect = Application.Intersect(Target, Range("b2"))

If isect Is Nothing Then

    MsgBox "不包括B2单元格"

Else

    MsgBox "包括B2单元格"

End If

End Sub

 

以上Luckyguy,V20,情人泪方法都是正确的,大家课后研究一下

 

[此贴子已经被作者于2007-7-7 21:30:21编辑过]
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-31 14:16 , Processed in 0.470788 second(s), 5 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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