• 我国拟推行建筑工人实名制 2018-05-27
  • “君怡娱乐网上赌球”明升88代理重磅 | 网络餐饮新规发布:外卖商户应有实体店 明年元… 2018-05-27
  • 花茶以及花茶的冲泡讲究 2018-05-27
  • “发现池州之美”——凤观池州全媒体行5月10日启动 2018-05-26
  • 《手机2》将拍 崔永元重提旧怨:冯小刚是渣子 2018-05-26
  • 自贡贡井:122名村(社区)党支部书记“充电”全覆盖 2018-05-25
  • 辽宁长海县:海岛垃圾将实现自产自消 2018-05-25
  • 本港台网址葡京六合彩图库 2018-05-25
  • 你还在用微信聊天,聪明的人早已在用微信赚钱!—海口论坛 2018-05-25
  • 西安今晚开始天气转阴 全省这周阴雨天气为主|阴雨|天气-要闻 2018-05-24
  • 日媒称“森友丑闻”持续发酵 打乱安倍长期执政设想 2018-05-24
  • 向世界说明前郭尔罗斯城市精品推介会在京举行 2018-05-24
  • 导演江平:增强文化自信 中国电影才会更好看 2018-05-24
  • 4月增持回购近262亿元 产业资本吹响抄底A股号角 2018-05-24
  • 郜林强势爆发让球迷欣喜 未来他会继续在恒大挑起大梁 2018-05-23
  • Excel VBA 事件过程实现数据变化结果也会随之自动更新

    时间:2017-10-30   作者:snow   来源:Office之家

    我们知道,在Excel中进行公式运算时,随着单元格数据的变化,公式单元格中的结果也会随之自动更新,如下面简单的演示。

    Excel VBA中有一类称作“事件”的过程程序,能够对我们的操作自动作出相应的响应。例如,每次打开工作簿时,自动弹出一个设定好的信息框。

    这是响应工作簿的Open事件,即在打开工作簿时Excel所发生的行为。

    在VBE编辑器中,单击工作簿或者工作表???,然后在代码输入窗口顶部左侧列表框中选择工作表对象名,在右侧列表框中会出现供选择的相应的事件。通常,在左侧列表框中选择对象名后,Excel会自动在代码输入窗口中放置默认的事件,如工作表的SelectionChange事件。

    事件响应所执行的操作就是我们在事件过程中放置的代码,这些代码规定了我们希望事件发生时要做什么。

    在《Excel实战技巧8:基于当前单元格实时显示相关数据记录》中,当用户在工作表第1列含有数据的单元格中移动时,会自动弹出一个窗体,并显示该单元格所在行的详细信息。

    这里就是使用了工作表的SelectionChange事件,其代码如下:

    Dim lngRow As Long

    Private SubWorksheet_SelectionChange(ByVal Target As Range)

       Dim rngBottom As Range

       With wksUserInfo

            '查找列A中最后使用的单元格

            Set rngBottom = .Range("A"& .Rows.Count).End(xlUp)

       End With

       '卸载原来的用户窗体

       If lngRow <> Target.Row Then

            Unload ufmUser

       End If

       '当前单元格位于第1列且具有数据时才显示用户窗体

       If Target.Column = 1 And Target.Row > 1 And Target.Row <=rngBottom.Row Then

            ufmUser.Show 0 '无模式窗体

       End If

       '填充用户窗体

       '在工作表单元格发生改变后能实时反映到用户窗体中

       ufmUser.PopulateRecord

       '更新用户窗体显示

       '当活动单元格变化后,显示该单元格所在行的内容

       lngRow = Target.Row

    End Sub

    注意到,事件过程含有参数,允许将相应的值通过参数传递给事件过程。例如本例中的参数Target,将当前单元格传递到过程。

    有时候,一个事件可能触发其他事件,包括该事件本身,从而带来连锁反应。例如,修改工作表单元格中的数据时,会触发Worksheet_Change事件,此时如果事件中的代码修改了另一个单元格中的数据,那么会再次触发该事件,再该事件会再次修改单元格,这引起事件的又一次触发,如此反复循环。这往往不是我们所需要的。

    可以使用:

    Application.EnableEvents = False

    临时禁止触发事件,从而防止发生这类情形。当达到目的后,再重新启用触发事件:

    Application.EnableEvents = True

    例如:

    Private Sub Worksheet_Change(ByValTarget As Range)

       Application.EnableEvents = False

       If Target.Column = 1 Then

            Range("C1") = Target.Value

       End If

       Application.EnableEvents = True

    End Sub

    Excel定义了与工作簿对象、工作表对象等相关的一系列事件,还可以使用VBA自定义事件。一般来说,常使用的Excel事件有:

    Excel应用程序事件,即根据Excel本身的操作来响应的事件,例如响应新建工作簿的NewWorkbook事件。

    工作簿事件,即根据操作工作簿的动作来响应的事件,例如打开工作簿的Open事件。

    工作表事件,即根据操作工作表的动作来响应的事件,例如选取工作表单元格变化时的SelectionChange事件。

    图表事件,即操作图表时响应的事件,例如激活图表时的Activate事件。

    后面的内容将主要讲解工作表事件,其他事件将在后续讲到相应的内容时再详细讲解

    发表评论