数据验证:检查空白和负数以及输出消息框

时间:2016-05-20 18:04:39

标签: excel excel-vba vba

我有这个,它确保一切都是一个数字。但是我仍然想要进行数据验证,以确保它在您尝试离开空白时为您提供错误。如果不是太麻烦,我如何调整我的工作代码以确保只有正数。

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

2 个答案:

答案 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变量即可。我测试了好几次,看起来效果很好。当用户访问此工作表时,如果她输入一个字母,一个负数或一个空白,则事件处理程序调用宏并向用户提供友好消息,然后以红色突出显示有问题的单元格。如果所有值都很好,那么看起来好像没有发生任何事件!