【问题标题】:Restricting cells to a specific order of entering a specific range of numbers将单元格限制为输入特定数字范围的特定顺序
【发布时间】:2017-08-30 06:32:11
【问题描述】:

这是场景。我在 E6:E309 列中有所有工作编号。我希望销售人员过来并在 D6:D309 中的相关单元格中键入要首先绘制的工作,方法是在 D6:D309 范围内键入 1 到 303 之间的任何数字。如果销售人员在 D11 列中输入“1 ",即作业号为 E11 的作业要先切割。困难的部分是以下两个条件:

第一个条件: 属于范围 D6:309 的任何单元格中的第一个条目应该是数字 1,第二个是数字 2,第三个是数字 3,依此类推,直到数字 309 . 因此,销售人员不能在属于 D6:D309 的任何单元格中输入数字“2”,除非在属于范围 D6:D309 的任何单元格中的其他位置输入数字“1”,并且以此类推。

第二个条件:没有特定的顺序输入单元格在另一个之前。 销售人员可以开始进入任何单元格,本质上是 D10,输入“1”,然后移动到 D18,他只能输入“2”,然后回到 D3,他只能输入“3”,并且以此类推。

非常感谢您的帮助。

【问题讨论】:

    标签: excel validation vba


    【解决方案1】:

    这可以通过一些巧妙的自定义验证来完成。要进行客户验证,请选择要应用此验证的单元格,然后选择数据->数据验证。在设置下的表单中,在“允许”下拉菜单中选择自定义并输入公式。

    具体来说,您需要进行以下三个验证:

    1. 单元 D6:=D6=(MAX($D$7:$D$309,0)+1)
    2. 单元格 D7:D308(确保单元格 D7 是选择中的活动单元格:=D7=(MAX($D$6:$D6,$D8:$D$309,0)+1)
    3. 单元 D309:=D309=(MAX($D$6:$D$308,0)+1)

    如果您愿意,您可以在“错误警报”选项卡中添加自定义错误消息,以向用户解释逻辑。

    注意:虽然此解决方案满足您的条件,但一旦删除任何条目,您就会遇到问题!在这种情况下,验证仍然会强制用户输入下一个最高的数字,因此无法输入已删除的数字,除非它上面的所有其他数字都已被删除!

    【讨论】:

    • 嗨,彼得,非常感谢。了不起的工作。它完全符合我的要求,无需 VBA。但是,有没有办法我可以添加另一个条件,如果 E6“”,则只允许进入 D6。 D7 到 D309 也是如此,以及它们的相关单元格。
    • 所以只是为了理解 - 下面的直接单元格必须首先填充?如果用户从第 309 行开始并且必须将其填充到顶部?
    • 如果 E6 已填充(即 E6""),则允许您的数据验证在 D6 中工作。同样,对于 D7 直到 D309,如果填充了 E7(即 E7""),则允许您的数据验证在 D7 中工作,依此类推。因此,必须首先填充相邻的单元格,而不是下面的单元格。
    • 你能帮我吗?
    【解决方案2】:

    遵循Worksheet_Change 事件应该可以工作。它执行以下操作:

    1) 检查输入的值是否为数字,如果不显示信息并退出
    2) 检查输入的数字是否正确

    Private Sub Worksheet_Change(ByVal Target As Range)
        If Intersect(Target, Range("D6:D309")) Is Nothing Or Target.Cells.Count > 1 Then Exit Sub 'check for range
    
        Application.EnableEvents = False
        Dim countPrevNum As Long, largeNum As Long, currNum As Long
    
        If Not IsNumeric(Target.Value) Then     'check if entered value is number
            MsgBox "Enter a number"
            Target.Cells.Clear
            Target.Cells.Select
            Application.EnableEvents = True
            Exit Sub
        End If
    
        currNum = Target.Value      'value entered
        Target.Cells.Clear          'clear the target cell
    
        If WorksheetFunction.CountA(Range("D6:D309")) Then
            largeNum = WorksheetFunction.Large(Range("D6:D309"), 1)   'get the largest number in the range
        End If
    
        If largeNum <> currNum - 1 Then     'check if previous largest number is equal to currNum-1
            MsgBox "Number to be entered : " & largeNum + 1
            Target.Cells.Select         'select the target cell
        Else
            Target.Value = currNum      'enter the value target cell
        End If
        Application.EnableEvents = True
    End Sub
    

    【讨论】:

    • 嗨,Mrig。谢谢你的努力。我宁愿避免使用 VBA,因为我可能不得不分享这本工作簿。谢谢,不过。
    猜你喜欢
    • 2020-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    • 2017-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多