Excel / VBA的IF语句太多

时间:2018-03-28 08:56:22

标签: excel vba excel-vba if-statement

我在此文件中添加了一些示例数据,以便更好地解释我的问题。我已经混合了与公式无关的列:https://docs.google.com/spreadsheets/d/1_lq0mYPF2ICiFgehQz_YkOa28JUyamG4G8ObV957onY/edit?usp=sharing

我的初始文件每个合约有一行。我希望每个客户ID最后一行。我只需要保留最近的合同,所以合同的结束日期最接近Now()。如果一个客户ID有两个同时结束的合约,我想保留每月发票金额较高的行。

我一直用IF语句做这个,​​但必须有一个更有效的方法。目前,客户与3的合同数量最多,但这将在未来几个月内增加,我的if语句将不再可行。

这是我目前的公式。

Range("P2").Select
    ActiveCell.FormulaR1C1 = _
        "=IF(OR(Status=""in renewing process"",Status=""first contract still running""),""Not Eligable"",IF(Count_of_ID=1,""keep"",IF(Count_of_ID=2,(IF(AND(RC[-15]=R[1]C[-15],MIN(RC[-1],R[1]C[-1])=RC[-1]),""keep"",""delete"")),IF(Count_of_ID=3,IF(AND(RC[-15]=R[1]C[-15],RC[-15]=R[2]C[-15],MIN(RC[-1],R[1]C[-1],R[2]C[-1])=RC[-1]),""keep"",""delete"")))))"

Range("P3").Select
    ActiveCell.FormulaR1C1 = _
        "=IF(OR(Status=""in renewing process"",Status=""first contract still running""),""Not Eligable"",IF(Count_of_ID=1,""keep"",IF(Count_of_ID=2,(IF(AND(RC[-15]=R[1]C[-15],MIN(RC[-15],R[1]C[-15])=RC[-15]),""keep"",IF(Count_of_ID=2,(IF(AND(RC[-15]=R[-1]C[-15],MIN(RC[-15],R[-1]C[-15])=RC[-15]),""keep"",""delete"")))),IF(Count_of_ID=3,IF(AND(RC[-15]=R[1]C[-15],RC[-15]=R[2]C[" & _
        "-15],MIN(RC[-15],R[1]C[-15],R[2]C[-15])=RC[-15]),""keep"",IF(Count_of_ID=3,IF(AND(RC[-15]=R[1]C[-15],RC[-15]=R[-1]C[-15],MIN(RC[-15],R[1]C[-15],R[-1]C[-15])=RC[-15]),""keep"",""delete""))))))))" & _
        ""

Range("P4").Select
    ActiveCell.FormulaR1C1 = _
        "=IF(OR(Status=""in renewing process"",Status=""first contract still running""),""Not Eligable"",IF(Count_of_ID=1,""keep"",(IF(AND(Count_of_ID=2,RC[-15]=R[1]C[-15],MIN(RC[-1],R[1]C[-1])=RC[-1]),""keep"",IF(AND(Count_of_ID=2,RC[-15]=R[-1]C[-15],MIN(RC[-1],R[-1]C[-1])=RC[-1]),""keep"",IF(AND(Count_of_ID=3,RC[-15]=R[1]C[-15],RC[-15]=R[2]C[-15],MIN(RC[-1],R[1]C[-1],R[2]C" & _
        "[-1])=RC[-1]),""keep"",IF(AND(Count_of_ID=3,RC[-15]=R[1]C[-15],RC[-15]=R[-1]C[-15],MIN(RC[-1],R[1]C[-1],R[-1]C[-1])=RC[-1]),""keep"",IF(AND(Count_of_ID=3,RC[-15]=R[-1]C[-15],RC[-15]=R[-2]C[-15],MIN(RC[-1],R[-1]C[-1],R[-2]C[-1])=RC[-1]),""keep"",""delete""))))))))" & _
        ""
    Range("P4").Select
    Selection.AutoFill Destination:=Range("P4:P" & Lastrow)

任何帮助非常感谢!

1 个答案:

答案 0 :(得分:0)

我会使用命名公式。它们并没有在Excel中广泛使用,但非常强大。作为一个例子,我减少了

=IF(OR(Status=""in renewing process"",Status=""first contract still running"")

使用命名公式返回true或false的单个单词。我使用过相对寻址,excel为你处理这个问题。附加的图像应该为您提供使用它所需的所有信息。我点击B2并按正常方式构建公式,测试然后复制它,右键单击> DefineName,给它命名并将公式粘贴到'指向'。 要使用它,只需将Name添加到单元格中,Excel将处理所有相对寻址内容。

enter image description here

相关问题