我试图按功能清除和激活单元格,但是它不起作用。
Function cts(a) As Range
If IsEmpty(a.Value) = True Then
MsgBox ("ok")
ElseIf IsNumeric(a.Value) = False Then
MsgBox "non-numeric entry"
Range("a").ClearContents
Range("a").Activate
ElseIf Int(a.Value) = False Then
MsgBox "integer required"
Range("a").ClearContents
Range("a").Activate
ElseIf a.Value > 5 Or a.Value < 1 Then
MsgBox "valid values are between 1 and 5"
Range("a").ClearContents
Range("a").Activate
Else:
MsgBox "ok"
End If
End Function
出现味精,但没有清除或激活。
答案 0 :(得分:1)
该a
参数是一个Range
对象-应该这样声明:
Public Function cts(ByVal a As Range) As Range
IsEmpty
返回Boolean
;将其与布尔文字进行比较是多余的:
If IsEmpty(a.Value) = True Then
应该是:
If IsEmpty(a.Value) Then
表达式("Ok")
毫无价值地被当作String
值(它已经 是字符串文字)被求值。 Don't use parentheses when you discard a function's return value:
MsgBox "Ok"
a
是Range
对象,这是
Range("a").ClearContents Range("a").Activate
可能就是这样("a"
不是有效的单元格引用,因此无法评估Range("a")
)
a.ClearContents
a.Activate
通过声明a As Range
,您将获得 IntelliSense 和Ctrl + Space自动补全的成员调用;在您的代码中,它是一个隐式Variant
,因此所有成员调用都在运行时解决(Option Explicit
不能使您避免打字错误)。
该函数没有返回任何内容,也不清楚您要返回的Range
是什么(或原因)。
如果您希望它返回a
,您可以这样做:
Set cts = a
如果该过程不需要返回任何内容,则应为Sub
过程,而不是Function
。
ElseIf Int(a.Value) = False Then
如果Int
包含一个a.Value
值,则Variant/Error
函数调用将失败,并出现 type mismatch 错误,因为条件块尚未首先评估是否IsError(a.Value)
是真实的; = False
也将Integer
强制转换为Boolean
,因此当False
为a.Value
时,表达式将错误地求值为0
(因为零是False
,并且任何非零值都是True
)。 Int
函数接受123.456
并输出123
,即它返回给定值的整数部分-它不评估参数是否为整数。
为了评估该值是否为整数,首先需要确保您要查看的是数字值:
If IsNumeric(a.Value) Then
然后将Int(a.Value)
与a.Value
进行比较,看看它们是否相同:
If Int(a.Value) = a.Value Then
确保将ElseIf a.Value > 5 Or a.Value < 1 Then
放入IsNumeric
例中,否则给定一个错误值,该条件也会爆炸,因为Variant/Error
不能与除Error
值。