该程序是将一列数据从累积数据转换为非累积数据。在我的工作表上,A1、B1 和 C1 分别带有文本“非累积”、“累积”和“已转换”。我在 A1 下有数字 1 到 10,然后将它们累加到 B1 下。 C1 是我想要将 B 列转换回非累积的位置。
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
最佳答案
您编写代码的方式是合乎逻辑的,最初只需要进行一些小的语法更改。然而,
- 最好先检查范围是否为空...
- 然后检查该值是否为数字。
- 更好的是,如果将 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
<小时/>
让您的代码更加动态:
- 另一个建议,您可以简单地将需要验证的整个
B 列范围
Application.WorkSheetFunction.Transpose()
放入变体数组
> - 处理数组并
转置
回包含 B 列和 C 列的范围。 - 通过这样做,您可以省略手动设置循环大小,而是使用数组的
下限
和上限
进行设置;)
关于vba - 我是否正确使用了 isnumeric 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13979848/