【问题标题】:If vlookup is between 2 dates, return earlier one如果 vlookup 在 2 个日期之间,则返回较早的一个
【发布时间】:2017-10-03 13:44:58
【问题描述】:

我有一个人们提交他们想要出售某物的日期列表,并且我有一个每 2 周的出售窗口,这些卖家可以实际出售。

我想将列表与所有日期与那些销售窗口的列表相匹配(销售窗口在 13.07 和 27.07。),但是简单的 vlookup(使用 TRUE)返回给我这样的信息:

卖家
提交 |销售窗口(使用卖方窗口列表中的 vlookup)
13.07.2016 |对应的卖出窗口应该是 13.07。这里
14.07.2016 |但是 27.07。从这里开始。
14.07.2016
14.07.2016
14.07.2016
18.07.2016
18.07.2016
20.07.2016
20.07.2016
20.07.2016
21.07.2016
21.07.2016
22.07.2016
25.07.2016 |但是,vlookup 返回 13.07。直到这里和
27.07.2016 | 27.07。仅从该日期起作为销售窗口。
28.07.2016
28.07.2016

有谁知道我该如何解决这个问题?

【问题讨论】:

  • 我认为你可以使用完全匹配和不完全匹配的组合,但要等一会儿才能回答。
  • @ykjk 你有没有看我的回答...?

标签: excel date vlookup


【解决方案1】:

假设您的日期采用日期格式 - 在您的 vlookup 中,从日期中减去 1。然后您的 vlookup 将提前 2 周。

要更正此问题,您可以在 vlookup 结果中添加 14。

=VLOOKUP(D4-1,$F$3:$F$6,1)+14

您的上市日期在 D 列中,而您的销售日期在 F 列中。

【讨论】:

  • 遗憾的是,由于公共假期,销售窗口并非总是相隔 14 天,否则好主意! ;)
  • 在这种情况下,索引匹配应该做到这一点。 =INDEX($F$3:$F$6,MATCH((D3-1),$F$3:$F$6,1)+1)
【解决方案2】:

您可以将MATCH 函数与INDEX 函数结合使用来查找值,这将使您受益于构成MATCH 函数一部分的match_type 参数。

以下是有关match_type 参数的一些信息:

比赛类型信息

  • 如果 match_type 为 1 或省略,MATCH 会查找小于或等于 lookup_value 的最大值。 lookup_array 参数中的值必须按升序排列,例如:...-2、-1、0、1、2、...、A-Z、FALSE、TRUE。
  • 如果 match_type 为 0,MATCH 会找到第一个完全等于 lookup_value 的值。 lookup_array 参数中的值可以是任意顺序。
  • 如果 match_type 为 -1,MATCH 会查找大于或等于 lookup_value 的最小值。 lookup_array 参数中的值必须按降序排列,例如:TRUE、FALSE、Z-A、...2、1、0、-1、-2、...等。

(来源:https://support.office.com/en-gb/article/MATCH-function-e8dffd45-c762-47d6-bf89-533f4a37673a

这意味着您可以使用-1match_type,只要您的lookup_array(销售窗口)按降序排列!

公式看起来像这样:

=INDEX($C$2:$C$3,MATCH(A1,$C$2:$C$3,-1))

您的销售窗口在C2:C3,您的提交日期在A列,公式在B列,例如:

  | A          | B          | C               |
  |------------+------------+-----------------|
 1| Submitting | Lookup     | Selling Windows |
  |------------+------------+-----------------|
 2| 13/07/2016 | 13/07/2016 | 27/07/2016      |
 3| 14/07/2016 | 27/07/2016 | 13/07/2016      |
 4| 15/07/2016 | 27/07/2016 |                 |
 5| 16/07/2016 | 27/07/2016 |                 | 
 6| 17/07/2016 | 27/07/2016 |                 |
 7| 18/07/2016 | 27/07/2016 |                 |
 8| 19/07/2016 | 27/07/2016 |                 |
 9| 20/07/2016 | 27/07/2016 |                 |
10| 21/07/2016 | 27/07/2016 |                 |
11| 22/07/2016 | 27/07/2016 |                 |
12| 23/07/2016 | 27/07/2016 |                 |
13| 24/07/2016 | 27/07/2016 |                 |
14| 25/07/2016 | 27/07/2016 |                 |
15| 26/07/2016 | 27/07/2016 |                 |
16| 27/07/2016 | 27/07/2016 |                 |

【讨论】:

    【解决方案3】:

    这是我的想法。

    如果完全匹配成功(例如 13/7/16),则从 B 列的匹配行中获取结果。

    如果完全匹配失败(例如 14/7/16),进行不完全匹配并从 B 列的下一行获取结果。

    =INDEX($B$2:$B$5,IFERROR(MATCH(A2,$B$2:$B$5,0),MATCH(A2,B$2:$B$5,1)+1))
    

    为了完整起见,这里有一个 VLOOKUP 公式

    =VLOOKUP(A2,$B$2:$B$5,1,TRUE)+14*(A2>VLOOKUP(A2,$B$2:$B$5,1,TRUE))
    

    和另一个使用 MOD 的公式

    =IF(MOD(A2-$B$2,14),A2+14-MOD(A2-$B$2,14),A2)
    

    但最后两个假设销售日期之间存在 14 天的恒定差异。第一个公式更灵活,因为如果销售日期如问题中所述以列表形式提供,则可以考虑公共假期等。

    【讨论】:

    • 多么美妙的解决方案。在我的数据上运行得像一台上油的机器!非常感谢!
    • 谢谢,非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    • 2019-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多