笔者第一次用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版本或者设置哪里没有对吧。。。最后,尝试上述方法,才得以实现。