【问题标题】:If "iserror" FOR loop with varying object typeIf "iserror" FOR 循环具有不同的对象类型
【发布时间】:2016-09-05 23:09:39
【问题描述】:

我有一列包含字符串类型(例如“N/A”)或数字。我正在尝试编写一个 vba 代码,如果 FOR 循环遇到字符串类型,它将被转换为 0。基本上发生的事情是代码下降一列 (K) 值(例如 10 美元、600 美元, $5200, N/A, $5),如果它是一个数字,并且如果单元格中有文本,则保留单元格值,然后将文本转换为 0。范围是 (K6:K10),公式看起来像,

=If(iserror(K6/10) = TRUE, 0, K6)

代码:

Dim a As Integer
Dim DilutedRev As Integer
For a = 6 To 10
    DilutedRev = ActiveCell(a, 11).Value
    If IsError(DilutedRev / 100) = True Then
        ActiveCell(a, 11) = 0
    Else
        ActiveCell(i, 11) = DilutedRev
    End If

【问题讨论】:

  • 毫无疑问...
  • 叹息。为什么人们从不向他们的last question学习XD
  • 运行此代码时没有任何反应,所以我很想知道出了什么问题。当列中有不同的对象类型时,我不确定是否可以将 DilutedRev 建立为整数类型
  • @Davey Nothing happens when I run this code so I'm curious to know what's wrong. 回到你的上一个问题并自己回答。

标签: excel vba if-statement for-loop variable-types


【解决方案1】:

首先,正如您在上一个问题中指出的那样; Activecell 仅指 activecell 它是一个单元格而不是一个范围。你想要 Cells()。

接下来通过在循环中重新声明变量,它允许 Excel 每次确定其类型。如果不是,它将是 excel 第一次分配的类型,并且您不能将文本值存储在 Integer 类型中。

然后我们测试该变量是否为数字。

但是你可以跳过它,按照@Jeeped 的建议去做。

Dim a As Integer

For a = 6 To 10
    Dim DilutedRev 
    DilutedRev = Cells(a, 11).Value
    If Not isnumeric(DilutedRev) Then
        Cells(a, 11) = 0
    Else
        Cells(a, 11) = DilutedRev
    End If

【讨论】:

  • Cell()?或Cells()?我认为您的计算机已被劫持/入侵!
  • @BruceWayne 是啊是啊......有时我会跳上一件事而想念其他事情。这就是为什么我周围都是像你们这样的人。我走得很快,希望别人在我搞砸时告诉我。谢谢。
  • 成为上帝的意义非凡。猜猜超级英雄是要走的路。
  • @Davey 您应该将 Jeeped 的答案标记为正确。它有更好的信息。
  • @Jeeped 和我一样,所以对我来说差别不大。我觉得你的答案更好,就像通常一样。
【解决方案2】:

使用IsNumeric function 确定单元格是否包含数字。

Dim a As Long

With ActiveSheet
    For a = 6 To 10
        If IsNumeric(.Cells(a, "K").Value2) Then
            .Cells(a, 11) = CLng(.Cells(a, "K").Value2)
        Else
            .Cells(a, 11) = 0
        End If
    Next a
End With

由于相对原点¹,像您一样使用 ActiveCell property 并不是“最佳实践”;最好使用Range.Cells property

返回布尔值的 VBA 函数(例如 IsNumericIsError 等)不必与 True 或 False 进行比较。它们已经是 True 或 False。

我已使用Range.Value2 property 进行检查,但也可以使用Range.Value property

通常值得明确定义Range.Parent 工作表属性,而不是隐式依赖ActiveSheet property


¹ 严格来说,像您所做的那样偏移ActiveCell 并没有错,但结果完全与工作表上的当前选择相关,通常不被视为“最佳实践”。在工作表上选择 D5 后,activecell(1,1) 引用 D5,activecell(2,3) 引用 F6。在非常特殊的情况下,这种行为可能是可取的,但一般来说,最好使用Range.Cells property 并使用 row_numbercolumn_number 从 @ 引用单元格987654332@ 视角,不作为从 ActiveCell 的偏移位置。

【讨论】:

  • 哇,错过了多少脚注机会?!?!啧啧吉普。
  • /羞愧地躲起来XD
猜你喜欢
  • 1970-01-01
  • 2018-01-29
  • 2011-10-29
  • 2021-07-11
  • 1970-01-01
  • 2020-01-08
  • 1970-01-01
  • 1970-01-01
  • 2015-06-22
相关资源
最近更新 更多