第5章 Excel事件

1 让Excel自动响应你的行为

1.1、 让Excel自动问好

Private Sub Workbook_Open()
    MsgBox "你好, 主人"
End Sub

保存退出,重新打开就能看到效果


1.2、事件、VBA里的自动开关

 Workbook_Open()     (Workbook事件作用的对象为工作簿,Open对象的事件是打开)

1.3、事件过程

触发动作所执行的过程称为事件过程

1.4、编写事件过程

格式:对象名称_事件名称

2、Worksheet事件

2.1、关于Worksheet事件

写在工作表的事件

2.2、常用的Worksheet事件

Worksheet_Change事件:自动提示更改的内容

语法:

Private Sub Worksheet_Change(ByVal Target As Range)

代码块

End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    MsgBox Target.Address & "单元格的值被改为:" & Target.Value
End Sub


Worksheet_SelectionChange事件:你选中了谁

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    MsgBox Target.Address & "单元格选中:" & Target.Value
End Sub

Worksheet_Activate事件:自动提示工作表名

Private Sub Worksheet_Activate()
    MsgBox "当前活动工作表为:" & ActiveSheet.Name
End Sub

Worksheet_Deactivate事件:禁止选中其他工作表

Private Sub Worksheet_Deactivate()
    MsgBox "不允选中成绩表以外的其他工作表!"
    Worksheets("成绩表").Select
End Sub

2.3、Worksheet事件列表


3、Workbook事件

3.1、关于Workbook事件

3.2、常用的Workbook事件

Open事件

Workbook_Open事件告诉Excel,当打开工作簿自动运行程序

BeforeClose 事件

Workbook_BeforeClose事件告诉Excel,在关闭工作簿之前自动运行程序

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    If MsgBox("你确定要关闭工作簿吗?", vbYesNo) = vbNo Then
    
        Cancel = True   '取消
    End If
End Sub
Workbook_SheetChange事件

Workbook_SheetChange事件告诉Excel,当工作簿里任意一个单元格被更改时,自动运行程序

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    MsgBox "当前更改的工作表为:" & Sh.Name & Chr(13) & _
    "发生更改的单元格地址为:" & Target.Address
End Sub

4、别样的自动化

4.1、不是事件的事件

Application 对象的OnKey方法

按下某个键触发事件

Option Explicit

Sub ok()
    Application.OnKey "+e", "test"
End Sub

Sub test()
    MsgBox "按键事件"
End Sub


语法:Application.OnKey   “+e” , "test"   (+e表示按下Shift+e, 触发的方法为test)

Application对象的OnTime方法

定时任务

Sub oT()
    '一分钟之后,自动运行Test过程
    Application.OnTime Now() + TimeValue("00:01:00"), "ontest"
End Sub

Public Sub ontest()
    MsgBox "定时任务"
End Sub
运行过程oT,   表示1分钟后运行

5、典型的技巧与示例

5.1、自动补全商品信息



Private Sub Worksheet_Change(ByVal Target As Range)
    '如果改变的单元格不是C列第3行以下的单元格或更改的单元格个数大于1时退出程序
    If Application.Intersect(Target, Range("C2:C65536")) Is Nothing Or Target.Count > 1 Then
        Exit Sub
    End If
    Dim i As Integer '定义变量
    i = 2            '参照表中第一条记录在第2行,所有初始值2
    With Worksheets("参照表")      '
        Do While .Cells(i, "A").Value <> ""
            '判断录入的字母与参照表的字母是否相等
            If UCase(Target.Value) = .Cells(i, "A").Value Then
                Application.EnableEvents = False ' 禁用事件,防止将字母改为商品名时,两次执行程序
                Target.Value = .Cells(i, "A").Offset(0, 1).Value '写入产品名称
                Target.Offset(0, -1).Value = Date               '写入日期
                Target.Offset(0, 1).Value = .Cells(i, "A").Offset(0, 2).Value '写入商品代码
                Target.Offset(0, 2).Value = .Cells(i, "A").Offset(0, 3).Value '写入商品单价
                Target.Offset(0, 3).Select        '填写销售数量
                Application.EnableEvents = True '重启事件
                Exit Sub
            End If
            i = i + 1
        Loop
    End With
End Sub


5.2、请找出所有特定数字(点击某个数字)


Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Cells.Interior.ColorIndex = xlNone  '清除所有单元格原有底纹颜色
    '当选中的单元格个数大于1时,重新给Target赋值
    If Target.Count > 1 Then
        Set Target = Target.Cells(1)
    End If
    Dim rng As Range   '定义一个Range型变量
    '遍历单元格
    For Each rng In Cells(1, "A").CurrentRegion
        If rng.Value = Target.Value Then
            rng.Interior.ColorIndex = 39
        End If
    Next
End Sub


5.3、让文件每隔一分钟自动保存一次

步骤一:

在任意一个模块写入代码

Sub otime()
    '一分钟后自动运行wbSave过程
    Application.OnTime Now() + TimeValue("00:01:00"), "wbSave"
End Sub

Sub wbSave()
    ThisWorkbook.Save   '保存本工作簿
    Call otime          '再次运行otime过程
End Sub


步骤二:

Private Sub Workbook_Open()
    Call otime     '在打开工作簿后自动运行otime过程
End Sub


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值