暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

VBA限制重复值录入

VBA语言専攻 2022-08-31
128
【分享成果,随喜正能量】幸福,不是靠狼狈不堪换来的,不要把时间日程安排到每一分每一秒,空出一点时间给自己,或冥想,或思考,才会发现生活的多姿多彩。。
《VBA代码解决方案》(10028096)这套教程是我最早推出的教程,目前已经是第二版修订了。这套教程定位于入门后的提高,在学习这套教程过程中,侧重点是要理解及掌握我的“积木编程”思想。要灵活运用教程中的实例像搭积木一下把自己喜欢的代码摆好。
这套教程共三册,一百四十七讲,内容覆盖较广,也是初级和中级间的过度教程,改版后的内容主要是提供程序源码文件及代码修正为32位和64位兼用代码。今后一段时间会给大家陆续推出。今日的内容是第51讲:VBA限制重复值录入

第五十一讲  利用VBA代码,限制重复值的录入

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

1  Worksheet_Change事件及EnableEvents属性讲解

如何实现刚才提到的场景需求呢?此时可以利用工作表的Change事件结合工作表的CountIf 函数来判断所录入的人员编号是否重复,本例子中将要用到的知识点如下:
n Worksheet_Change 事件:当用户更改工作表中的单元格,或外部链接引起单元格的更改时发生此事件。
n ByVal Target As Range:其中Target是必须的,Range可以是多个单元格。byval 的意思是定义的形式参数“按值传递”,Target 是形参的名称,可以定义成自己喜欢的名字,包括默认的事件处理过程中,As Range 是这个形参的类型,也就决定了对应的要传递进来的实参的类型,可以是普通变量,比如 As Single ,As Integer,  As Double, 也可以是对象变量,As Worksheet,As Range等这里的As Range 规定类型是单元格区域对象 Range
nApplication.EnableEvents 的作用是控制事件的触发。当 Application.EnableEvents 设置为 False 时,禁止触发事件发生。当 Application.EnableEvents 设置为 True 时,可以正常触发事件,excel默认状态。
n工作表的CountIf 函数计算区域中满足给定条件的单元格的个数。

CountIf 函数语法如下:
COUNTIF(range, criteria)参数range为需要计算其中满足条件的单元格数目的单元格区域。
参数criteria为确定哪些单元格将被计算在内的条件,其形式可以为数字、表达式、单元格引用或文本。

2  限制重复值录入的代码

下面我们看看示例代码如下。
 Private Sub Worksheet_Change(ByVal Target As Range) '51  利用VBA代码,限制重复值的录入
   With Target
    If .Column <> 1 Or .Count > 1 Then Exit Sub
    If WorksheetFunction.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列中只能录入唯一的人员编号,如果录入重复值会进行提示。
当录入的值重复时:
弹出对话框:
当点确定后,原先录入的重复的数值2被清除掉。


今日内容回向:
1  如何可以做到不重复录入?(本例是判断CountIf 函数的返回值,如果大于1,说明录入的是重复编号
2 采用VBA代码做到不重复录入时需要哪些知识点?

本讲内容参考程序文件:VBA代码解决方案修订(49-98).xlsm





我20多年的VBA实践经验,全部浓缩在下面的各个教程中:
【分享成果,随喜正能量】人生苦短,世事无常。何必事事那么在乎,更不必处处那么计较。人这一辈子,不过百年,没必要过分苛求什么,奢望什么,做你想做的,爱你想爱的,努力过好每一天,闲看庭前花开花落,远望天边云卷云舒。苛求太多,烦恼就多,奢望太多,痛苦更甚。。
文章转载自VBA语言専攻,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论