【发布时间】: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