VBA 事件的初步认识(二)

昨天工作表事件中的Change事件还没结束,今天继续。

接着昨天内容   https://blog.csdn.net/Di77HaoWenMing/article/details/107738298

三、常用事件的实际操作

2.工作表的事件

2.2 Change事件的实际操作。

2.2.1如果不加以设置的话,只要有变动就会触发,但是实际情况是我们一般要求特定区域的单元格需要加事件进行处理,所以如何对特定单元格或区域进行设置是很重要滴,实现特定区域代码如下:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rng As Range
    '比如只对A1:D10这样4*10的单元格设置
    Set rng = Range("A1:D10")
    
    '设置判断条件,在区域内的就触发下面内容
    'intersect是返回两个单元格区域的交叉部分
    If Intersect(Target, rng) Is Nothing Then
    Else
        MsgBox ("你修改的单元格在A1:D10里面")
    End If
End Sub

 

如果我们在A1:D10单元格区域内修改了,确实能正常触发。

2.2.2 比如要实现单元格区域内的其他操作,把条件和结果修改一下即可。

比如实现有公式的地方就加粗

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rng As Range
    '如果处理的单元格区域不是空值,就判断有没有公式
    If Not Target Is Nothing Then
        For Each rng In Target
            If rng.HasFormula Then
                rng.Font.Bold = True
            End If
        Next
    End If
End Sub

输入完公式就自动变粗啦,不过需要注意的事,只要是输入了=,系统就会认为是公式。

 

2.2.3 实现数据有效性验证,比如只能输入数字,可以把上面的再改一下实现

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rng As Range
    '如果处理的单元格区域不是空值,就再下一步判断是不是输入的纯数字
    If Not Target Is Nothing Then
        For Each rng In Target
            '注意IsNumber是EXCEL的函数哈,不是VBA的
            If Not WorksheetFunction.IsNumber(rng) Then
                MsgBox ("兄弟你这输入的不是数字啊!")
            End If
        Next
    End If
End Sub

 

 

实际操作发现,只要最后结果是数字就是数字,不管是实际输入数字还是输入了公式。

当然了,弹出警告后还要清除用户输入的内容,所以咱们第一时间就想到在在第八行后面加一句

rng.ClearContents

然后就出大问题了,系统不停弹窗,因为要回到故事开头所讲的,清除内容本身就出发Change事件,然后就:

    清除单元格——触发change事件——判断清除操作没有数字——弹出警告框——清除单元格——……死循环了

所以按照昨天的内容,需要在修改本身前添加禁用事件命令,结束了再启用就可以啦。

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rng As Range
    '如果处理的单元格区域不是空值,就再下一步判断是不是输入的纯数字
    If Not Target Is Nothing Then
        For Each rng In Target
        '注意IsNumber是EXCEL的函数哈,不是VBA的
            If Not WorksheetFunction.IsNumber(rng) Then
                MsgBox ("兄弟你这输入的不是数字啊!")
                Application.EnableEvents = False
                rng.ClearContents
            End If
        Next
    End If
   Application.EnableEvents = True
End Sub

注意看禁用的位置是在要操作前,取消禁用是在Change事件结束前哟。

 

 

2.3 SelectionChange。改变或刷新工作表中的选择时使用,也有一个Range参数,看起来和Change事件差不多。

2.4 BeforeDoubleClick。双击时执行(为什么加个Before看起来这么怪)有2个参数,第一个是双击对应的单元格,另一个是布尔型,设置了True双击就啥也不干。

2.5 BeforeRightClick。右键点击后执行,几乎和2.4一模一样。系统本来右键后就有内容,自己修改后可能不是很友好,看起来没什么用。

 

 

©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页