如果" iserror"具有不同对象类型的FOR循环

时间:2016-05-10 19:42:24

标签: excel vba if-statement for-loop variable-types

我的列中包含字符串类型(例如" N / A")或其中的数字。我试图编写一个vba代码,如果FOR循环遇到字符串类型,它将被转换为0.基本上发生的是代码沿着列(K)向下移动值(例如$ 10,$ 600,$ 5200,N / A,$ 5),并保留单元格值,如果它是一个数字,如果单元格中有文本,则文本转换为0.范围是( K6:K10),公式看起来像,

=If(iserror(K6/10) = TRUE, 0, K6)

代码:

Dim a As Integer
Dim DilutedRev As Integer
For a = 6 To 10
    DilutedRev = ActiveCell(a, 11).Value
    If IsError(DilutedRev / 100) = True Then
        ActiveCell(a, 11) = 0
    Else
        ActiveCell(i, 11) = DilutedRev
    End If

2 个答案:

答案 0 :(得分:4)

首先,你在上一个问题中指出了这一点; Activecell仅指活动单元,它是一个单元而不是一个范围。你想要Cell()。

接下来,通过在循环内重新声明变量,它允许Excel每次确定其类型。如果不是,它将是excel第一次分配的类型,并且您不能以Integer类型存储文本值。

然后我们测试该变量是否为数字。

但你可以跳过这个并做@Jeeped建议的事情。

Dim a As Integer

For a = 6 To 10
    Dim DilutedRev 
    DilutedRev = Cells(a, 11).Value
    If Not isnumeric(DilutedRev) Then
        Cells(a, 11) = 0
    Else
        Cells(a, 11) = DilutedRev
    End If

答案 1 :(得分:4)

使用IsNumeric function确定单元格是否包含数字。

Dim a As Long

With ActiveSheet
    For a = 6 To 10
        If IsNumeric(.Cells(a, "K").Value2) Then
            .Cells(a, 11) = CLng(.Cells(a, "K").Value2)
        Else
            .Cells(a, 11) = 0
        End If
    Next a
End With

使用ActiveCell property就像你所做的那样,不是'最佳实践',因为相对原点¹;最好使用Range.Cells property

返回布尔值的VBA函数(例如IsNumericIsError等)不必与True或False进行比较。它们已经是真或假。

我已使用Range.Value2 property进行检查,但Range.Value property也可以使用。

通常有必要明确定义Range.Parent工作表属性,而不是隐含地依赖ActiveSheet property

¹严格来说,像你一样偏移ActiveCell没有错,但结果与工作表上的当前选择完全相关,通常不被认为是“最佳实践”。在工作表上选择D5后,activecell(1,1)引用D5和activecell(2,3)引用F6。在一个非常特殊的情况下,这种行为可能是可取的,但一般来说最好使用Range.Cells property并使用 row_number column_number 来引用来自Worksheet Object透视图,而不是ActiveCell的偏移位置。