3

该程序是将一列数据从累积转换为非累积。在我的工作表上,我有 A1、B1 和 C1,分别带有文本 Non-Cumulative、Cumulative 和 Converted。我在 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
4

2 回答 2

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 rangevariant array
  • 处理数组并Transpose返回到具有 B 和 C 列的范围。
  • 通过这样做,您可以手动省略循环大小的设置,但使用数组的绑定来设置它;LowerUpper
于 2012-12-20T22:41:27.007 回答
3

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

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
于 2012-12-20T20:24:41.137 回答