2012-12-20 44 views
2

该程序将数据列从累计转换为非累计。在我的工作表上,我有A1,B1和C1分别带有非累积,累积和转换的文本。我在A1下面有数字1到10,然后他们在B1下面累计。 C1是我想将列B转换回非累积的位置。我正确使用isnumeric函数吗?

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

我的问题是它不工作。我认为这是因为IsNumeric()不断返回为false。我应该使用不同的功能吗?单元格引用在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 

回答

4

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

  • 这也是最好的检查范围为空第一...
  • 然后检查是否值是数字。
  • 更好,甚至,如果在设定的范围为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()您需要验证成variant array
  • 进程中的阵列和Transpose回用柱B和C
  • 的范围通过这样做整个B column range,可以省略手动设置为环的大小,但使用Lower设置它和Upper绑定的阵列;)
+0

@TheTreeMan请试试看代码并发表您的意见:) – bonCodigo

+0

谢谢!我对编码还很陌生,并且还在努力教自己新的东西。你的建议非常出色。谢谢! – TheTreeMan

+0

@TheTreeMan我很高兴你的工作:)高兴地在一些帮助。祝你好运! – bonCodigo

3

您需要检查是否乙i的范围是数值,而不是串“B” &我 和而不是选择片材,只是使用父标识符等:

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