使用公式确定复杂excel字段中的最大日期

时间:2016-05-17 12:29:47

标签: excel excel-formula

我有一个excel文件,其中一列作为项目分配。该列的样本值如下:

XXX E(10aug15-30sep16),YYY G(30nov15-29jul16),ZZZZ C(18jan16-23dec16),AAA B(04jan16-28jul16)

您可以看到,每个作业都有开始日期和结束日期。可以使用')'括号识别结束日期,即')'括号前的7个字符。

我必须写一个公式来给我最大的所有结束日期。我知道,我可以使用宏,但由于安全问题,我们的组织希望避免使用宏。

上述字段的输出应为2016年12月23日。

请建议。

4 个答案:

答案 0 :(得分:3)

假设对于给定的字符串(在A1中):

1)该字符串中每个结束日期的格式正好是 ddmmmyy

2)紧接每个右括号之前的条目绝不是结束日期之外的任何内容

然后,数组公式**

=MAX(0+MID(A1,MODE.MULT(IF(MID(A1,ROW(INDEX(A:A,1):INDEX(A:A,LEN(A1))),1)={")",")"},ROW(INDEX(A:A,1):INDEX(A:A,LEN(A1)))))-7,7))

根据需要格式化包含此公式的单元格,例如自定义类型 ddmmmyy

请注意,如果您使用的是Excel版本,此数组常量中的行和列分隔符分别不是分号和逗号,则此解决方案可能需要进行少量修改。

此致

**数组公式的输入方式与“标准”公式的输入方式不同。您只需按住CTRL和SHIFT键,然后按ENTER键,而不是按ENTER键。如果你已经正确地完成了它,你会注意到Excel在公式周围放置了大括号{}(虽然不要尝试自己手动插入这些)。

答案 1 :(得分:2)

假设您的开始日期总是大于结束日期,您只需要最大的日期,您可以使用以下公式找到该日期:

对于单元格 A1

中的字符串
XXX E(10aug15-30sep16),YYY G(30nov15-29jul16),ZZZZ C(18jan16-23dec16),AAA B(04jan16-28jul16)

使用公式:

=MAX(IFERROR(VALUE(MID(A1,ROW($A$1:$A$1000),7)),0))

将其作为数组公式输入 - 使用 Ctrl + Shift + Enter

请注意以下代码:

ROW($A$1:$A$1000)

这会将最大字符串长度设置为1000 - 根据您认为您需要的内容,或多或少。越少越好,因为excel不需要努力工作。根据你的示例字符串,我建议200可能绰绰有余。

答案 2 :(得分:1)

不是很灵活,但只要您有4个结束日期而不偏离给定格式,它就会起作用。除了理想的VBA之外,别想其他任何方式做到这一点。

=TEXT(MAX(MID(A1,FIND("-",A1,1)+1,7),MID(A1,FIND("-",A1,FIND("-",A1,1)+1)+1,7),MID(A1,FIND("-",A1,FIND("-",A1,FIND("-",A1,1)+1)+1)+1,7),MID(A1,FIND("-",A1,FIND("-",A1,FIND("-",A1,FIND("-",A1,1)+1)+1)+1)+1,7)),"ddmmmyy")

答案 3 :(得分:0)

使用MID在括号中提取数据。假设您的数据在A列中,您可以使用公式:

=MID(A2,FIND("(",A2)+1,FIND(")",A2)-FIND("(",A2)-1)

您将获得以连字符分隔的开始和结束日期(如下所示:10aug15-30sep16)。 现在使用LEFTRIGHTSEARCH来获取开始和结束日期:

开始日期:

=LEFT(B2,SEARCH("-",B2)-1)

结束日期:

=RIGHT(B2,LEN(B2)-SEARCH("-",B2))

要将这些日期转换为文字,请按以下方式使用TEXT

=TEXT(D2,"ddmmmyy")

希望我已经包含了您报告可能需要的所有公式。