为什么我的If语句返回#VALUE?

时间:2018-05-16 15:41:09

标签: vba excel-vba excel

我有一部分代码可以修剪可能包含多个单词的单元格中的单词。然后它将这个单词放入另一个单元格。有时包含多个单词的单元格只包含一个单词,所以当它修剪时,我得到#VALUE!在牢房里回来了。

如果它试图修剪一个空格,我会得到相同的返回值,在这种情况下是#34; _______________"。它评估寻找#VALUE!的单元格,如果它存在,则检查包含多个单词的单元格,看是否原因是因为它是空白的" ________________"或者是一个单词。

我已经使用下面的代码来完成此操作,但它现在忽略代码的AND部分,并在单元格读取#VALUE时立即执行操作!不管第二个条件。

有谁知道可能导致这种情况的原因?

'Trims the full name
    Cells(i + 2, 10).FormulaR1C1 = _
        "=TRIM(RIGHT(SUBSTITUTE(REPLACE(RC[10],FIND(""/"",RC[10])-0,LEN(RC[10]),""""),"" "",REPT("" "",255)),255))"

    'Replaces Error with a blank ***Sometimes there are no defect 2 defects which causes this error
If Cells(i + 2, 10) = "#VALUE!" And Cells(i + 2, 20) = "________________________________________________________________________________" Then
Cells(i + 2, 10) = ""
Else
End If

'Replaces Error with a blank ***Sometimes there are no defect 3 which causes this error
If Cells(i + 2, 10) = "#VALUE!" Then
Cells(i + 2, 10) = Cells(i + 2, 20)
Else
End If 

2 个答案:

答案 0 :(得分:1)

vbNullString""通常做得更清洁时,不确定为什么需要将一系列下划线视为空白值;假设我们坚持使用这些下划线,我首先用SUBSTITUTE(<range>,"_","")消除它们,然后解决它 - 如果单元格只包含下划线,那么该函数的结果将是一个空字符串。

所以像LEN(SUBSTITUTE(<range>,"_",""))=0这样的谓词会告诉我们,我们是否正在查看需要被视为空的<range>

因此,IF(LEN(SUBSTITUTE(<range>,"_",""))=0, <value if empty>, <value if not empty>)将是建立在IMO上的“骨架”公式,除非我遗漏了某些东西(很可能)。

VALUE!

#VALUE!单元格错误不是一个表示"#VALUE!"的字符串 - 它是类型为Error错误,并且无法进行比较到String字面(或任何事情)。

因此,如果单元格实际包含错误,则此语句可保证抛出类型不匹配错误:

If Cells(i + 2, 10) = "#VALUE!" Then

这意味着您必须在该代码段的顶部放置On Error Resume Next,这意味着您的代码实际上忽略了运行时错误,并且在错误状态下愉快地运行 - 这很可能是语句无条件执行的原因。 / p>

证明:

Sub test()
    On Error Resume Next
    If 12 / 0 > 1 And False Then ' throws error 11 "division by zero"
        Debug.Print "And False was ignored!" 'runs unconditionally
    End If
End Sub

删除On Error Resume Next,它没有帮助。

您想要验证单元格是否包含错误 - 请使用IsError函数:

If IsError(Cells(i + 2, 10)) Then

如果您需要具体检查#VALUE!错误,可以这样做:

If Cells(i + 2, 10).Value = CVErr(xlErrValue) Then

然而,这有点没有实际意义,因为#VALUE!错误来自您输入的公式 - 使用公式中的IFERROR Excel函数在出现错误时提供值:

=IFERROR(<formula>, <value to return formula results in an error>)

你可以在那里获得你的后备价值。

那说String(n, "_")会给你一个带有n下划线的字符串。调试可能比处理字面中有n下划线的字符串文字要容易得多。更容易做String(80,"_")比实际计算下划线更容易,并且有意外地有79或81的风险。

答案 1 :(得分:0)

不是通过VBA将公式放在单元格中,而是在程序本身中执行此公式。

With Cells(i + 2, 10)
    If InStr(.Offset(, 10).Value, "/") > 0 Then
       wrds = Split(Split(.Offset(, 10), "/")(0), " ")
       .Value = wrds(UBound(wrds))
    Else
      .Value = .Offset(, 10).Value 'or ""
    End If
End With  

我认为这些下划线已被淘汰