我想创建一个包含许多属性的工作表,例如仅接受数字条目的列和仅接受下拉列表中的值的列。我已经创建了一个几乎完美的VBA脚本但是我有一个问题我无法解决,这似乎与IsEmpty()
函数有关。
目前,在C列中,D和HI只能从下拉列表中输入值,并且我的错误消息("请从下拉列表中选择值")否则抛出(包括如果值被粘贴)。 IsEmpty()
函数调用允许删除值而不会抛出错误。
在Value_Columns
范围内,我只能输入值,并且这些值格式正确。如果我删除单个单元格中的值,IsEmpty()
函数将正常运行,并清除该值。但是,如果我选择一系列单元格(例如I5:I10
)并按删除,则会抛出以下错误消息:
条目必须是数字
这与列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
答案 0 :(得分:1)
如果查看IsEmpty()https://msdn.microsoft.com/en-us/library/office/gg264227.aspx的定义,它表明它适用于表达式
执行If Not IsEmpty(Target) Then
时,VBA隐式转换它If Not IsEmpty(Target.Value) Then
,而Range.Value是一个表达式。因此,独立范围可以被视为表达式。
但是在你的情况下,隐式转换为表达式不起作用。你必须创建一个看起来所有单元格都是空的函数。
通过以下IsEmpty()
实施并替换您的IsRangeEmpty()
,它将起作用
' 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