嵌套的IF语句返回#VALUE

时间:2013-05-24 22:30:02

标签: excel excel-vba if-statement vba

我有一个需要修改的预先录制的宏。它使用IF语句检查值是否为N/A并将其更改为0,除非它以CN开头,然后将单元格设置为CN*值。我需要IF语句来检查CN*V*并返回其中的值。

IF语句需要检查值是否为N/A并将单元格更改为0,否则如果值以CNV开头,则需要返回那个价值。

基本陈述:

ActiveCell.FormulaR1C1 = _
    "=IF(ISNA(VLOOKUP(""CN*"",RC[1]:RC[2],2,FALSE))=TRUE,0,VLOOKUP(""CN*"",RC[1]:RC[2],2,FALSE))"

修改后的声明:

ActiveCell.FormulaR1C1 = _
    "=IF(ISNA(VLOOKUP(""CN*"",RC[1]:RC[2],2,FALSE))=TRUE,0,VLOOKUP(""CN*"",RC[1]:RC[2],2,FALSE)) ORIF(ISNA(VLOOKUP(""V*"",RC[1]:RC[2],2,FALSE))=TRUE,0,VLOOKUP(""V*"",RC[1]:RC[2],2,FALSE))"

目前,基本语句正常返回0,但不检查以V*开头的值。修改后的语句返回#VALUE!

2 个答案:

答案 0 :(得分:1)

我认为你需要用新的支票替换你的第一个0结果,即替换这个if

ActiveCell.FormulaR1C1 = _
    "=IF(ISNA(VLOOKUP(""CN*"",RC[1]:RC[2],2,FALSE))=TRUE,
      0,
      VLOOKUP(""CN*"",RC[1]:RC[2],2,FALSE))"

通过此嵌套 if

ActiveCell.FormulaR1C1 = _
    "=IF(ISNA(VLOOKUP(""CN*"",RC[1]:RC[2],2,FALSE))=TRUE,
      IF(ISNA(VLOOKUP(""V*"",RC[1]:RC[2],2,FALSE))=TRUE,
        0,
        VLOOKUP(""V*"",RC[1]:RC[2],2,FALSE)),
      VLOOKUP(""CN*"",RC[1]:RC[2],2,FALSE))"

(根据可读性进行了调整)

如果您然后反转条件并切换剩余的if参数可能会更清楚:

ActiveCell.FormulaR1C1 = _
    "=IF(ISNA(VLOOKUP(""CN*"",RC[1]:RC[2],2,FALSE))=FALSE,
      VLOOKUP(""CN*"",RC[1]:RC[2],2,FALSE),
      IF(ISNA(VLOOKUP(""V*"",RC[1]:RC[2],2,FALSE))=FALSE,
        VLOOKUP(""V*"",RC[1]:RC[2],2,FALSE),
        0))"

答案 1 :(得分:1)

添加到mousio的答案,您可能还会使用IFERROR而不是简单IF,因为您重新计算从条件中获取的值。对于第一个,它将是:

ActiveCell.FormulaR1C1 = _
    "=IFERROR(VLOOKUP(""CN*"",RC[1]:RC[2],2,FALSE),0)"

这意味着,如果VLOOKUP(""CN*"",RC[1]:RC[2],2,FALSE)返回错误,则会获得0,如果不是,则会获得VLOOKUP(""CN*"",RC[1]:RC[2],2,FALSE)的值。

修改后的那个:

ActiveCell.FormulaR1C1 = _
    "=IFERROR(VLOOKUP(""CN*"",RC[1]:RC[2],2,FALSE),
      IFERROR(VLOOKUP(""V*"",RC[1]:RC[2],2,FALSE),
      0))"

在这一个中,如果VLOOKUP(""CN*"",RC[1]:RC[2],2,FALSE)返回错误,它会检查VLOOKUP(""V*"",RC[1]:RC[2],2,FALSE),如果这也返回错误,则会返回0