我的列中包含字符串类型(例如" 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
答案 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函数(例如IsNumeric,IsError等)不必与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的偏移位置。