此程序用于将数据列从累积转换为非累积。在我的工作表上,我有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
答案 0 :(得分:6)
您编写代码的方式是合乎逻辑的,只是最初需要的一个小的语法更改。然而,
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
Transpose
返回到范围。Lower
和Upper
设置它;)答案 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