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

标签 vba excel excel-2010

该程序是将一列数据从累积数据转换为非累积数据。在我的工作表上,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/

相关文章:

excel - 将文件名的一部分指定为变量

vba - 运行时错误 : 1004 Reference is Not Valid resulting from Goal Seek

vba - 使用 Excel VBA 从 Word 表格的单元格中删除内容

excel - 如何使用 Excel VBA 获得多项式回归系数?

excel - 如何使用查找功能

excel - 将excel的新动态数组功能与VBA相结合

excel - 检测自动过滤器更改

excel - 使用可变日期vba抓取网页

java - jxl 中程序关闭时数据损坏

excel - 使用部分查找来匹配 SUMIF