如果“iserror”FOR循环具有不同的对象types

我有一个stringtypes(例如“N / A”)或数字的列。 我试图写一个VBA代码,如果FOR循环遇到一个stringtypes,它将被转换为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 

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

 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属性并不是“最佳实践” 最好使用Range.Cells属性 。

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

我已经使用Range.Value2属性来检查,但也可以使用Range.Value属性 。

通常值得显式定义Range.Parent工作表属性,而不是隐式地依赖于ActiveSheet属性 。


¹ 严格来说,抵消ActiveCell并没有什么问题,但是结果与工作表上的当前select完全相关,通常不被认为是“最佳实践”。 在工作表上selectD5时, activecell(1,1)引用D5和activecell(2,3)引用F6。 在一个非常特殊的情况下,这种行为可能是可取的,但一般来说,最好使用Range.Cells属性,并使用row_numbercolumn_number从工作表对象透视图引用单元格,而不是从ActiveCell偏移位置。

首先是在你最后一个问题中指出的; Activecell指的是活动单元是一个单元而不是一个范围。 你想要Cells()。

接下来通过在循环内重新声明variables,它允许Excel每次确定它的types。 如果不是,那么它将是excel首次分配的types,并且不能以整数types存储文本值。

然后我们testing这个variables是否是数字。

但是你可以跳过这一点,做@Jeepedbuild议。

 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