VBA中的IsEmpty()Excel函数不能按预期方式运行

我想要创build一个有许多属性的工作表,例如只接受数字条目的列和只接受下拉列表中的值的列。 我创build了一个几乎完美的VBA脚本,但是我有一个问题,我不能解决这似乎与IsEmpty()函数有关。

此时,在列C,D和HI中只能从下拉列表中input值,否则会引发错误消息(“请从下拉列表中select值”)(包括如果粘贴值)。 IsEmpty()函数调用允许删除值而不会引发错误。

Value_Columns范围内,我只能input值,这些值格式正确。 如果我删除单个单元格中的值,则IsEmpty()函数将正常运行,并且该值将被清除。 但是,如果我select一个单元格范围(例如I5:I10 )并按下delete,则会引发以下错误消息:

input必须是一个数字

这与列C,D和H形成对比,删除单元格内容的范围不会引发错误消息。

我看不出为什么这种行为似乎是不一致的任何理由。 谁能帮忙?

 Sub Worksheet_Change(ByVal Target As Range) Dim Industry_Column As Range Dim Proposition_Column As Range Dim Status_Column As Range Dim Value_Columns As Range Set Industry_Column = Range("C5:C500") Set Proposition_Column = Range("D5:D500") Set Status_Column = Range("H5:H500") Set Value_Columns = Range("I5:W500") If Not IsEmpty(Target) Then If Not Application.Intersect(Target, Industry_Column) Is Nothing Then If IsError(Application.Match(Target, Worksheets("Drop Down Lists").Range("A2:A6"), 0)) Then Application.EnableEvents = False Application.Undo MsgBox "ERROR - Please select value from drop-down list" Application.EnableEvents = True End If ElseIf Not Application.Intersect(Target, Proposition_Column) Is Nothing Then If IsError(Application.Match(Target, Worksheets("Drop Down Lists").Range("C2:C6"), 0)) Then Application.EnableEvents = False Application.Undo MsgBox "ERROR - Please select value from drop-down list" Application.EnableEvents = True End If ElseIf Not Application.Intersect(Target, Status_Column) Is Nothing Then If IsError(Application.Match(Target, Worksheets("Drop Down Lists").Range("E2:E6"), 0)) Then Application.EnableEvents = False Application.Undo MsgBox "ERROR - Please select value from drop-down list" Application.EnableEvents = True End If ElseIf Not Application.Intersect(Target, Value_Columns) Is Nothing Then If Not IsNumeric(Target) Then Application.EnableEvents = False Application.Undo MsgBox "ERROR - Entry must be a number" Application.EnableEvents = True Else Target.NumberFormat = "#,##0.00_ ;[Red]-#,##0.00 " End If End If End If End Sub 

如果你看看IsEmpty()的定义https://msdn.microsoft.com/en-us/library/office/gg264227.aspx它表明它在expression式

当你这样做的时候If Not IsEmpty(Target) Then VBA隐式地转换它If Not IsEmpty(Target.Value) Then Range.Value是一个expression式。 所以一个独立的范围可以被认为是一个expression式。

但在你的情况下,隐式转换为expression式不起作用。 你必须创build一个function,看看所有单元格是否为空。

用下面的IsRangeEmpty()实现和replace你的IsEmpty() ,它将起作用

 ' Return if a range is empty Private Function IsRangeEmpty(ByVal rng As Range) As Boolean Dim cell As Range ' for each cell in the range For Each cell In rng ' if a cell is not empty If Not IsEmpty(cell) Then ' return "not empty" IsRangeEmpty = False Exit Function End If Next ' Here all cells are empty IsRangeEmpty = True End Function