excel中用vba查找出重复值 (vba实现excel重复项自动求和)

大家好,今日讲解VBA代码解决方案的第51讲:利用VBA代码,如何限制重复值的录入,为什么要提出这个问题呢?因为在工作表中录入数据时,有时希望能限制重复值的录入,比如在示例的A列单元格只能录入唯一的人员编号,这个不能重复,该怎么办呢?

此时可以利用工作表的Change事件结合工作表的CountIf 函数来判断所录入的人员编号是否重复,本例子中将要用到的知识点如下:

第一 Worksheet_Change 过程:当用户更改工作表中的单元格,或外部链接引起单元格的更改时发生此事件。

第二 ByVal Target As Range:其中Target是必需的,Range可以是多个单元格。byval 的意思是定义的形式参数" 按值传递",Target 是形参的名称,可以定义成自己喜欢的名字,包括默认的事件处理过程中,As Range 是这个形参的类型,也就决定了对应的要传递进来的实参的类型,可以是普通变量,比如 As Single ,As Integer, As Double, 也可以是对象变量,As Worksheet,As Range等这里的As Range 规定类型是 单元格区域对象 Range

第三 Application.EnableEvents 的作用是控制事件的触发。当 Application.EnableEvents 设置为 False 时,禁止触发事件。当 Application.EnableEvents 设置为 True 时,可以正常触发事件,excel默认状态。

第四:工作表的CountIf 函数计算区域中满足给定条件的单元格的个数,语法如下:

COUNTIF(range, criteria)参数range为需要计算其中满足条件的单元格数目的单元格区域。

参数criteria为确定哪些单元格将被计算在内的条件,其形式可以为数字、表达式、单元格引用或文本。

下面我们看看示例代码如下。

Private Sub Worksheet_Change(ByVal Target As Range)

With Target

If .Column <> 1 Or .Count > 1 Then Exit Sub

If Application.CountIf(Range("A:A"), .Value) > 1 Then

.Select

MsgBox "不能输入重复的人员编号!", 64

Application.EnableEvents = False

.Value = ""

Application.EnableEvents = True

End If

End With

End Sub

代码解析:工作表的Change事件过程,使A列单元格只能录入唯一的人员编号。

a) 第4行代码使用工作表的CountIf 函数来判断在A列单元格输入的人员编号是否重复。

在示例中以所录入的人员编号与A列单元格区域进行比较,如果CountIf 函数的返回值大于1,说明录入的是重复编号。

b) 第5行代码,重新选择该单元格便于下一步清空后重新录入。

c) 第7、8、9行代码,清除录入的重复编号,在清除前将Application对象的EnableEvents属性设置为False,禁用事件。因为如果不禁用事件,那么在清除重复值的过程中会不断地触发工作表的Change事件,从而造成代码运行的死循环。

经过以上的设置,在工作表的A列中只能录入唯一的人员编号,如果录入重复值会进行提示不能输入重复的人员编号!

代码窗口:

利用vba代码限制重复值的录入,excel中用vba查找出重复值

当录入的值重复时:

利用vba代码限制重复值的录入,excel中用vba查找出重复值

弹出对话框:

利用vba代码限制重复值的录入,excel中用vba查找出重复值

当点确定后,原先录入的重复的数值2被清除掉。

利用vba代码限制重复值的录入,excel中用vba查找出重复值

今日内容回向:

1 如何可以做到不重复录入?

2 采用VBA代码做到不重复录入时需要哪些知识点?