【问题标题】:Too many IF statements Excel / VBAIF 语句过多 Excel / VBA
【发布时间】:2018-03-28 08:56:21
【问题描述】:

我在这个文件中添加了一些示例数据来更好地解释我的问题。我已经混合了与公式无关的列: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)

非常感谢任何帮助!

【问题讨论】:

  • Status 来自哪里?另外,假设 Count_of_ID 是列 M?
  • 也许只是按结束日期和金额排序,然后按客户 ID 删除重复项?我无法检查您的文件,但如果您想保留行的初始顺序,请预先添加序号列,然后在删除重复项后按其排序。
  • 第3个,你需要所有的IF吗?这可以用 OR 来完成吗?
  • 嗨@Tom,状态是我隐藏的一列。它说明合同是否已续签、已过期、是否处于续签过程中,或者是否是客户的第一份合同。如果是第一份合同。如果合同处于续订过程中或者是客户的第一份合同,则客户 ID 被视为不符合条件并从分析中删除
  • 嗨@Nathan_Sav,您认为包括或将使我能够显着减小公式的大小?

标签: vba excel if-statement


【解决方案1】:

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

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

使用命名公式返回 true 或 false 的单个单词。我使用了相对寻址,excel会为你处理这个。所附图像应为您提供使用它所需的所有信息。我单击 B2 并正常构建公式,对其进行测试然后复制它,右键单击 >DefineName,为其命名并将公式粘贴到“引用”中。 要使用它,只需将名称添加到单元格中,Excel 就会处理所有相对寻址的内容。

【讨论】:

    猜你喜欢
    • 2017-11-30
    • 2018-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-28
    • 2013-07-09
    • 2018-12-30
    • 2017-06-26
    相关资源
    最近更新 更多