如何清除并激活单元格作为变量?

时间:2019-05-22 16:05:24

标签: excel vba

我试图按功能清除和激活单元格,但是它不起作用。

 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

出现味精,但没有清除或激活。

1 个答案:

答案 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"

aRange对象,这是

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,因此当Falsea.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值。