我是否正确使用了isnumeric函数?

时间:2012-12-20 20:19:26

标签: vba excel-vba excel-2010 excel

此程序用于将数据列从累积转换为非累积。在我的工作表上,我有A1,B1和C1,文本分别为非累积,累积和转换。我在A1下面有数字1到10,然后它们累计在B1下面。 C1是我想将B列转换回非累积的地方。

IsNumeric用于使C中的第一行数据等于B中的第一行数据。它应该检测到标题高于它正在评估的数字,因此知道不必执行任何计算。对于其余的人来说,它会看到正在评估的数字是一个数字,因此必须进行计算。

我的问题是它不起作用。我认为原因是因为IsNumeric()不断回归是假的。我应该使用不同的功能吗?单元格引用在IsNumeric中不起作用吗?

这是程序!

Option Explicit

Dim i As Variant

Sub Conversion()

Sheets("Test Sheet").Select

For i = 1 To 10
    If IsNumeric("B" & i) = False Then
        Range("C" & i + 1) = Range("B" & i + 1)
    Else: Range("C" & i + 1) = Range("B" & i + 1) - Range("B" & i - 1)
    End If
Next

End Sub

2 个答案:

答案 0 :(得分:6)

您编写代码的方式是合乎逻辑的,只是最初需要的一个小的语法更改。然而,

  • 最好先检查范围是否为空......
  • 然后检查值是否为数字。
  • 如果将Range设置为Range对象并使用offset
  • ,则更好

代码:

Option Explicit '-- great that you use explicit declaration :)

Sub Conversion()
  Dim i As Integer '-- integer is good enough
  Dim rngRange as Range

  '-- try not to select anything. And for a cleaner code
  Set rngRange = Sheets("Test Sheet").Range("B1") 

    For i = 1 To 10
      If (rangeRange.Offset(i,0).value) <> "" then '-- check for non-empty
        If IsNumeric(rangeRange.Offset(i,0).value) = False Then
           rangeRange.Offset(i+1,1) = rangeRange.Offset(i+1,0)
        Else
           rangeRange.Offset(i+1,1) = rangeRange.Offset(i+1,0) - rangeRange.Offset(i-1,0)
        End If
      End if
    Next i '-- loop
End Sub

让您的代码更具活力:

  • 另一个建议是,您可能只需要Application.WorkSheetFunction.Transpose()验证B column range
  • 所需的整个variant array
  • 使用列B和C处理数组并将Transpose返回到范围。
  • 通过这样做,您可以省略手动设置循环大小,但可以使用数组的LowerUpper设置它;)

答案 1 :(得分:3)

您需要检查B i的范围是否为数字,而不是字符串“B”&amp;一世  而不是选择工作表,只需使用父标识符,如:

sheets("sheet1").range("B" & i)  

这可以帮助您避免代码中的错误

For i = 1 To 10
    If IsNumeric(sheets("test sheet").range("B" & i).value) = False Then
        Range("C" & i + 1) = Range("B" & i + 1)
    Else: Range("C" & i + 1) = Range("B" & i + 1) - Range("B" & i - 1)
    End If
Next