我有这个,它确保一切都是一个数字。但是我仍然想要进行数据验证,以确保它在您尝试离开空白时为您提供错误。如果不是太麻烦,我如何调整我的工作代码以确保只有正数。
Private Sub Worksheet_Change(ByVal Target As Range)
Const CELL_ADDRESS = "$C$5:$C$7,$C$9:$C$11,$C$12:$C$13,$C$15:$C$16,$C$18:$C$25"
If Not Application.Intersect(Target, Range(CELL_ADDRESS)) Is Nothing Then
If Not IsNumeric(Target.Value) Then
MsgBox "Please Enter Numerical Values Only", vbCritical, "Error"
Target.Value = vbNullString
End If
End If
End Sub
This is the blank code I have but It does not work.
'Validation for No Blank Cells
Private Sub Worksheet_Change1(ByVal Target As Range)
Const CELL_ADDRESS = "$C$5:$C$7,$C$9:$C$11,$C$12:$C$13,$C$15:$C$16,$C$18:$C$25"
If CELL_ADDRESS = "" Then
MsgBox "Please Enter Numerical Values", vbCritical, "Blank Cell(s)!"
' End If
' If Not Application.Intersect(Target, Range(CELL_ADDRESS)) Is Nothing Then
' If IsEmpty(Range(CELL_ADDRESS)) Then
' MsgBox "Please Enter Numerical Values for Cells C5:C7", vbCritical, "Blank Cell"
' End If
' End If End Sub
答案 0 :(得分:0)
IsEmpty应该适用于此,但您需要将其传递给单元格的值,而不是表示单元格的范围。如果你传递范围,那么它将始终返回False(因为有效范围是一个对象,因此不是空的。)
所以请改用:
Private Sub Worksheet_Change(ByVal Target As Range)
Const CELL_ADDRESS = "$C$5:$C$7,$C$9:$C$11,$C$12:$C$13,$C$15:$C$16,$C$18:$C$25"
If Not Application.Intersect(Target, Range(CELL_ADDRESS)) Is Nothing Then
If IsEmpty(Target.Value) Then
MsgBox "Please Enter Numerical Values for Cells C5:C7", vbCritical, "Blank Cell"
End If
End If
End Sub
但是,给定的代码只检查提供的Target的.Value。如果Target包含多个单元格(如果用户在选中的范围内复制/粘贴多个单元格,则会发生这种情况),然后Target包含一个包含多个单元格的范围,而.Value将返回一个包含所有单元格的数组。值。并且阵列<>空,所以IsEmpty会在那里失败。
要做的最好的事情是迭代你的细胞交叉中的所有细胞 - 检查和目标,检查每个单独的细胞IsEmpty,然后报告违反的实际细胞(通过细胞' .Address property。)。
答案 1 :(得分:0)
以下是我认为会产生您正在寻找的效果的一些代码。我在Worksheet中创建了一个事件处理程序,它调用另一个模块中的子过程:
Private Sub Worksheet_Change(ByVal Target As Range)
Call Module1.TDang
End Sub
然后,在Module1代码中,我写了以下内容:
Sub TDang()
' This procedure assumes your column of numbers is static
Dim MyCol As Range
Dim Cell As Range
Set MyCol = Worksheets("T Dang").Range("C5:C7, C9:C13, C15:C16, C18:C25")
For Each Cell In MyCol
' If all is good, clear colors
If Cell.Value >= 0 And IsNumeric(Cell.Value) And Not IsEmpty(Cell.Value) Then
Cell.Interior.Color = xlNone
End If
' Ensure values are positive numbers
If Cell.Value < 0 Then
MsgBox ("Values must not be negative." & vbNewLine & _
"Change " & Cell.Value & " in " & Cell.Address & " to a positive value.")
Cell.Interior.Color = RGB(255, 0, 0)
End If
' Ensure values are NOT letters
If Not IsNumeric(Cell.Value) Then
MsgBox ("Values can only be numeric." & vbNewLine & _
"Change '" & Cell.Value & "' in " & Cell.Address & " to a numeric value.")
Cell.Interior.Color = RGB(255, 0, 0)
End If
' Ensure there are no blanks
If IsEmpty(Cell.Value) Then
MsgBox ("Do not leave cell " & Cell.Address & " blank!")
Cell.Interior.Color = RGB(255, 0, 0)
End If
Next Cell
End Sub
如果列C
中的值范围发生变化,则只需更改MyCol Range变量即可。我测试了好几次,看起来效果很好。当用户访问此工作表时,如果她输入一个字母,一个负数或一个空白,则事件处理程序调用宏并向用户提供友好消息,然后以红色突出显示有问题的单元格。如果所有值都很好,那么看起来好像没有发生任何事件!