excel中利用VBA实现筛选功能

笔者第一次用excel中的宏功能,在这中间也遇到一些疑难杂症,在此记录下。。。

笔者使用的是excel 2021家庭或学生版。

实现功能:在office的excel中,在一张表中,从表中第4行开始,C列、D列、E列、F列(4列)输入的数据在该四列已经输入的数据中已经存在(输入的数据类型多样化,并且允许4列数据中有空值存在)。此时,提示用户这数据已经存在,请勿重复输入,并且该条新增记录不被保存,怎么实现?

1、打开开发工具和设置宏相关配置

1、excel中默认状态下是未显示出来的。打开它在文件菜单》选项》自定义功能区》开发工具,确定后就可以在工具菜单栏看到开发工具选项。

2、如果要运行宏文件,还需要进行如下设置,进入excel选项菜单》信任中心》信任中心设置》宏设置》通过通知禁用宏(也可以选择启用宏,但为了安全,建议不选择。)》启用vba时用excel 4.0 宏(有就勾上,没有就算了)》信任对vba工程对象模型的访问》确定。这时候,就可以运行带有宏的文件。

2、开始利用vba编写宏文件

1、在开发工具选项中,点击Visual Basic(Alt+F11),进入vba编辑器,进行写代码。打开后,界面如下图所示,笔者excel工作簿中有四张表,所以图中有4个sheet。

2、选择你需要控制的工作表,我就以sheet1表格为例。实现上述功能。

具体实现代码如下:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim checkRange As Range
    Dim data As Variant
    Dim found As Boolean
    Dim i As Long
    
    ' 设置工作表对象
    Set ws = ThisWorkbook.Sheets("螺栓") ' 请替换为您的工作表名称
    
    ' 检查更改是否发生在C列到F列
    If Not Intersect(Target, ws.Range("C:F")) Is Nothing Then
        ' 获取更改发生的单元格的行号
        Dim targetRow As Long
        targetRow = Target.Row
        
        ' 检查是否从第4行开始
        If targetRow >= 4 Then
            ' 组合当前行的C、D、E、F列数据到数组中
            data = Array(ws.Cells(targetRow, "C").Value, ws.Cells(targetRow, "D").Value, ws.Cells(targetRow, "E").Value, ws.Cells(targetRow, "F").Value)
            
            ' 假设数据从第4行开始检查
            lastRow = ws.Cells(ws.Rows.Count, "C").End(xlUp).Row
            
            ' 检查数据是否已存在于之前的行中
            found = False
            For i = 4 To lastRow
                ' 跳过当前更改的行
                If i <> targetRow Then
                    ' 检查数据是否相同(允许空值)
                    If (ws.Cells(i, "C").Value = data(0) Or (ws.Cells(i, "C").Value = "" And data(0) = "")) And _
                       (ws.Cells(i, "D").Value = data(1) Or (ws.Cells(i, "D").Value = "" And data(1) = "")) And _
                       (ws.Cells(i, "E").Value = data(2) Or (ws.Cells(i, "E").Value = "" And data(2) = "")) And _
                       (ws.Cells(i, "F").Value = data(3) Or (ws.Cells(i, "F").Value = "" And data(3) = "")) Then
                        found = True
                        Exit For
                    End If
                End If
            Next i
            
            ' 如果找到重复数据,提示用户并撤销更改
            If found Then
                MsgBox "这数据已经存在,请勿重复输入。"
                Application.EnableEvents = False ' 禁用事件,以免在撤销时触发另一个Worksheet_Change
                ' 撤销更改
                Target.Value = ""
                Application.Undo
                Application.EnableEvents = True ' 重新启用事件
            End If
        End If
    End If
End Sub

这样,保存,就可以在sheet1表中,只要检测到C列~F列的单元格值有变化,且前面已经存在改行数据,就会弹出如下界面:

ps:这里需要注意,在带有宏文件的excel文件,需要将表格另存为.xlsm(或者启用宏的工作簿),在网上看到她们说:office 2007版本后,就需要这样操作,保存。

在上图中,点击确认后,10.9级就会被清零,让读者重新输入数据。

3、疑难杂症:

在这个过程中,网上都让在项目中插入下图中的模块,在模块中进行vba代码。但是,笔者按照下述方法操作后,运行宏代码,excel表格无任何反应,害的笔者找了好久的问题。(因为,笔者也没有专门学过这方面的知识,只是临时需要用到,所以,没有去纠结深层次原因。)可能因为笔者的office版本或者设置哪里没有对吧。。。最后,尝试上述方法,才得以实现。

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值