Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 2135|回复: 5

[已解决]出现不连续输入某个数值时禁止输入

[复制链接]
发表于 2016-5-7 19:00 | 显示全部楼层 |阅读模式
本帖最后由 longchaowu 于 2016-5-8 16:37 编辑

各位大神,能否帮个忙用VBA实现,就是如图片所示,第一次在A列输入某个数值时,只要是连续输入,这个数值允许重复输入。当再次输入这个值时,如果与第一次输入的这个值出现了断行,不连续时,后续所有的这个值都需要被禁止输入,谢谢! help.png help.rar (41.14 KB, 下载次数: 4)
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2016-5-7 22:49 | 显示全部楼层
本帖最后由 爱疯 于 2016-5-7 22:50 编辑

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = 1 And Target.Count = 1 Then
        '如果不连续
        If isContinuity(Target) = False Then
            '如果重复了
            If isRepeated(Target) = True Then
                '清除当前值
                Application.EnableEvents = False
                Target.ClearContents
                Application.EnableEvents = True
            End If
        End If
    End If
End Sub

'条件1:是否连续
Function isContinuity(Target As Range) As Boolean
    Dim rng As Range
    '从该值第1次出现的行号,到当前行号
    Set rng = Range(Cells(getFirstRow(Target), Target.Column), Target)
    '如果区域无空白单元格,表示是连续的
    isContinuity = Application.CountBlank(rng) = 0
End Function

'条件2:是否重复
Function isRepeated(Target As Range) As Boolean
    Dim rng As Range
    '如果当前是第1行,则不重复
    If Target.Row = 1 Then isRepeated = False: Exit Function
    '从该值第1次出现的行号,到当前行的上一行
    Set rng = Range(Cells(getFirstRow(Target), Target.Column), Target.Offset(-1, 0))
    isRepeated = Application.CountIf(rng, Target) > 1
End Function

'获取该值的第1次出现的行号
Function getFirstRow(Target As Range)
    Dim rng As Range
    Set rng = Columns(Target.Column).Find(Target)
    If rng Is Nothing Then getFirstRow = Target.Row Else getFirstRow = rng.Row
End Function


help2.rar (45.99 KB, 下载次数: 5)
回复

使用道具 举报

 楼主| 发表于 2016-5-8 09:14 | 显示全部楼层
爱疯 发表于 2016-5-7 22:49
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

多谢版主的鼎力相助,实现了我想要的功能
回复

使用道具 举报

 楼主| 发表于 2016-5-8 10:23 | 显示全部楼层
爱疯 发表于 2016-5-7 22:49
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

版主大神,刚才在用时发现了两个问题,是我没说清楚,望帮我完善一下,非常感谢!
help2.rar (87.08 KB, 下载次数: 5)
回复

使用道具 举报

发表于 2016-5-8 12:37 | 显示全部楼层    本楼为最佳答案   
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = 1 And Target.Count = 1 Then
        '如果不连续
        If isContinuity(Target) = False Then
            '如果重复了
            If isRepeated(Target) = True Then
                '清除当前值
                Application.EnableEvents = False
                Target.ClearContents
                Application.EnableEvents = True
            End If
        End If
    End If
End Sub

'条件1:是否连续
Function isContinuity(Target As Range) As Boolean
    Dim area As Range
    Dim f As Long
    f = firstRow(Target)
    '从该值第1次出现的行号,到当前行
    Set area = Range(Cells(f, Target.Column), Target)
    isContinuity = Application.CountIf(area, Target) = Target.Row - f + 1
End Function

'条件2:是否重复
Function isRepeated(Target As Range) As Boolean
    Dim area As Range
    '如果当前是第1行,则不重复
    If Target.Row = 1 Then isRepeated = False: Exit Function
    '从该值第1次出现的行号,到当前行
    Set area = Range(Cells(firstRow(Target), Target.Column), Target)
    isRepeated = Application.CountIf(area, Target) > 1
End Function

'获取该值的第1次出现的行号
Function firstRow(Target As Range) As Long
    Dim rng As Range
    Set rng = Columns(Target.Column).Find(Target)
    If rng Is Nothing Then firstRow = Target.Row Else firstRow = rng.Row
End Function

help3.rar (87.21 KB, 下载次数: 9)
回复

使用道具 举报

 楼主| 发表于 2016-5-8 16:30 | 显示全部楼层
爱疯 发表于 2016-5-8 12:37
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

完美解决,感激不尽!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-23 14:55 , Processed in 0.380010 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表