我有一部分代码可以修剪可能包含多个单词的单元格中的单词。然后它将这个单词放入另一个单元格。有时包含多个单词的单元格只包含一个单词,所以当它修剪时,我得到#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
答案 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!"
的字符串 - 它是类型为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
我认为这些下划线已被淘汰