这是场景。我在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"等等。
非常感谢您的帮助。
答案 0 :(得分:0)
这可以通过一些聪明的自定义验证来完成。要进行客户验证,请选择要应用此验证的单元格,然后选择数据 - >数据验证。在设置下的表单中,在“允许”下拉列表中选择自定义,然后输入公式。
详细说明,您需要进行以下三次验证:
=D6=(MAX($D$7:$D$309,0)+1)
=D7=(MAX($D$6:$D6,$D8:$D$309,0)+1)
=D309=(MAX($D$6:$D$308,0)+1)
如果需要,可以在“错误警报”选项卡中添加自定义错误消息,以向用户解释逻辑。
请注意:虽然此解决方案符合您的条件,但在删除任何条目时您都会遇到问题!在此,验证仍然强制用户输入下一个最高号码,因此除非删除其上方的所有其他号码,否则无法输入删除的号码!
答案 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