将单元格限制为输入特定数字范围的特定顺序

时间:2017-08-30 06:32:12

标签: excel excel-vba validation vba

这是场景。我在E6:E309栏中列出了所有工号。我希望销售人员来D6中键入相关单元格:D309首先在D6:D309范围内键入1到303之间的任何数字来绘制作业。如果销售人员在D11列中输入&# 34; 1",这意味着首先要裁掉工作号码E11。困难的部分是以下两个条件:

第一个条件:属于D6:309范围的任何单元格中的第一个条目应为数字1,第二个条目为数字2,第三个条目为数字3,依此类推至数字309 。因此,销售人员无法输入数字" 2"在属于D6:D309的任何细胞中,除非数字" 1"进入属于D6范围的任何单元格中的其他位置:输入D309,依此类推。

第二个条件:在另一个之前没有输入哪些单元格的特定顺序。 销售人员可以通过输入" 1"开始进入任何单元格,本身D10,然后转到D18,他只能输入" 2",然后再返回D3他只能输入" 3"等等。

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

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

详细说明,您需要进行以下三次验证:

  1. Cell D6:=D6=(MAX($D$7:$D$309,0)+1)
  2. 细胞D7:D308(确保细胞D7是选择中的活跃细胞:=D7=(MAX($D$6:$D6,$D8:$D$309,0)+1)
  3. Cell D309:=D309=(MAX($D$6:$D$308,0)+1)
  4. 如果需要,可以在“错误警报”选项卡中添加自定义错误消息,以向用户解释逻辑。

    请注意:虽然此解决方案符合您的条件,但在删除任何条目时您都会遇到问题!在此,验证仍然强制用户输入下一个最高号码,因此除非删除其上方的所有其他号码,否则无法输入删除的号码!

答案 1 :(得分:0)

以下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