基于另一列的数组公式

时间:2018-08-13 19:35:27

标签: arrays excel excel-formula

我正在处理两个Excel文件。第一个有一个数组公式。

=IF(ISERR(INDEX('[Talent Biography Report Sample 8-8-18.xlsx]Leadership Training Info'!$A:$E,SMALL(IF('[Talent Biography Report Sample 8-8-18.xlsx]Leadership Training Info'!$A:$E=$B$1,ROW('[Talent Biography Report Sample 8-8-18.xlsx]Leadership Training Info'!$A:$E)),ROW(1:1)),5)),"",INDEX('[Talent Biography Report Sample 8-8-18.xlsx]Leadership Training Info'!$A:$E,SMALL(IF('[Talent Biography Report Sample 8-8-18.xlsx]Leadership Training Info'!$A:$E=$B$1,ROW('[Talent Biography Report Sample 8-8-18.xlsx]Leadership Training Info'!$A:$E)),ROW(1:1)),5))

此数组公式正在调用另一个Excel文件,并比较每行中的数字以查看它们是否匹配。因此,基本上,如果Excel文件1中的B1与Excel文件2中的B2相匹配,则输出E2E2是时间戳日期)。转到下一行并比较数字,依此类推,直到B1 不匹配B2

我希望E2是仅显示日期的时间戳,即2/21/2012而不是2/21/2012 11:00 AM EST ,所以我写了这个公式来去除时间戳记关闭。

=(LEFT(E2,FIND("/",E2,FIND("/",E2)+1)-1)&"/"&IF(LEN(RIGHT(E2,LEN(E2)-SEARCH(" ",E2)))=12,LEFT(RIGHT(E2,17),4),LEFT(RIGHT(E2,16),4)))/1

当我更改数组以输出现在为F2的日期时,输出将显示为空白。我假设数组无法输出使用其他公式的行的值?

2 个答案:

答案 0 :(得分:0)

假设这是您的月份,并且对您有用。

LEFT(E2,FIND("/",E2,FIND("/",E2)+1)-1))

假设这是你的一年

IF(LEN(RIGHT(E2,LEN(E2)-SEARCH(" ",E2)))=12,LEFT(RIGHT(E2,17),4),LEFT(RIGHT(E2,16),4))

假设您正在寻找

/1

将每个细分都放入DATE函数中

DATE(year, month, day)
=DATE(IF(LEN(RIGHT(E2,LEN(E2)-SEARCH(" ",E2)))=12,LEFT(RIGHT(E2,17),4),LEFT(RIGHT(E2,16),4)),LEFT(E2,FIND("/",E2,FIND("/",E2)+1)-1)),1)

如果上述假设正确,那将为您提供每月的第一天。

答案 1 :(得分:0)

尽管此数组公式似乎可行,但我建议您进行一些调整以提高其性能:

=IF( ISERR(
INDEX( '[Talent Biography Report Sample 8-8-18.xlsx]Leadership Training Info'!$A:$E,
SMALL( IF('[Talent Biography Report Sample 8-8-18.xlsx]Leadership Training Info'!$A:$E=$B$1,
ROW( '[Talent Biography Report Sample 8-8-18.xlsx]Leadership Training Info'!$A:$E) ),
ROW(1:1) ), 5 ) ), "",
INDEX('[Talent Biography Report Sample 8-8-18.xlsx]Leadership Training Info'!$A:$E,
SMALL( IF('[Talent Biography Report Sample 8-8-18.xlsx]Leadership Training Info'!$A:$E = $B$1, 
ROW('[Talent Biography Report Sample 8-8-18.xlsx]Leadership Training Info'!$A:$E)),
ROW(1:1)), 5 ) )

为了简化对数组公式的检查,我们通过将'[Talent Biography Report Sample 8-8-18.xlsx]Leadership Training Info'替换为'[Wb]Sh'来对其进行总结:

=IF( ISERR( 
INDEX( '[Wb]Sh'!$A:$E,  
SMALL( IF( '[Wb]Sh'!$A:$E = $B$1, ROW( '[Wb]Sh'!$A:$E) ), ROW(1:1) ), 5 ) ), "",  
INDEX( '[Wb]Sh'!$A:$E, 
SMALL( IF( '[Wb]Sh'!$A:$E = $B$1, ROW( '[Wb]Sh'!$A:$E) ), ROW(1:1) ), 5 ) )

可以使用WorksheetFunction.IfError Method (Excel)如下改进此数组公式:

=IFERROR( INDEX( '[Wb]Sh'!$A:$E, 
SMALL( IF( '[Wb]Sh'!$A:$E = $B$1, ROW( '[Wb]Sh'!$A:$E) ), ROW(1:1) ), 5 ) ), "")

通过将数组减少到严格必要的大小可以实现进一步的改进:

=IFERROR( INDEX( '[Wb]Sh'!$E:$E, 
SMALL( IF( '[Wb]Sh'!$A:$A = $B$1, ROW( '[Wb]Sh'!$A:$A) ), ROW(1:1) ) ), "")

解决方案:

此标准公式使用WorksheetFunction.Aggregate Method (Excel)从数组中返回匹配结果。

1.a假设位于'[Talent Biography Report Sample 8-8-18.xlsx]Leadership Training Info'!$A:$A处的列表之间没有空白单元格:

= IFERROR( INDEX( TargetRange,
AGGREGATE( 15, 6, ROW(MatchCellColumn) / ( SourceRange = MatchCell ), 
ROWS($1:1) ) ), "" )  

1.b如果位于'[Talent Biography Report Sample 8-8-18.xlsx]Leadership Training Info'!$A:$A的列表之间有空白单元格,请使用以下公式:

= IFERROR( INDEX( TargetRange,
AGGREGATE( 15, 6, ROW(MatchCellColumn) / ( ( SourceRange <> "" ) *
( SourceRange = MatchCell ) ), 
ROWS($1:1) ) ), "" )  

位置:
TargetRange'[Talent Biography Report Sample 8-8-18.xlsx]Leadership Training Info'!$E:$E
SourceRange'[Talent Biography Report Sample 8-8-18.xlsx]Leadership Training Info'!$A:$A
MatchCell$B$1
MatchCellColumn$B:$B

为了仅从TargetRange返回时间戳记的日期,我们应将以上Index公式包装在该公式中(此解决方案也可以应用于Array公式)

2.a要以字符串形式返回日期,请使用以下公式:

= IFERROR( TRIM( LEFT( SUBSTITUTE( INDEX( ), " ",REPT(" ",5) ), 10)  ), "" )  

2.b要将日期作为日期序列返回,请使用以下公式:

= IFERROR( DATEVALUE( TRIM( LEFT( SUBSTITUTE( INDEX( ), " ",REPT(" ",5) ), 10) ) ), "" )  

注意: 如果无法将时间戳中的日期识别为有效的Excel日期,即时间戳格式为,则该公式将返回错误(即““”) mm-dd-yyyy,系统日期定义为dd-mm-yyyy

公式:

使用以下公式从位于'[Talent Biography Report Sample 8-8-18.xlsx]Leadership Training Info'!$A:$E的列表中返回时间戳:

  1. 要返回时间戳,请在E2中输入以下公式,然后根据需要向下复制:

= IFERROR( INDEX( '[Talent Biography Report Sample 8-8-18.xlsx]Leadership Training Info'!$E:$E, AGGREGATE( 15, 6, ROW($B:$B) / ( '[Talent Biography Report Sample 8-8-18.xlsx]Leadership Training Info'!$A:$A = $B$1 ), ROWS($1:1) ) ), "" )

  1. 要以字符串形式返回日期,请在F2中输入以下公式,然后根据需要向下复制:

= IFERROR( TRIM( LEFT( SUBSTITUTE( INDEX( '[Talent Biography Report Sample 8-8-18.xlsx]Leadership Training Info'!$E:$E, AGGREGATE( 15, 6, ROW($B:$B) / ( '[Talent Biography Report Sample 8-8-18.xlsx]Leadership Training Info'!$A:$A = $B$1 ), ROWS($1:1) ) ), " ",REPT(" ",5) ), 10) ), "" )

  1. 要将日期作为日期序列返回,请在E2中输入此公式,然后根据需要向下复制

= IFERROR( DATEVALUE( TRIM( LEFT( SUBSTITUTE( INDEX( '[Talent Biography Report Sample 8-8-18.xlsx]Leadership Training Info'!$E:$E, AGGREGATE( 15, 6, ROW($B:$B) / ( '[Talent Biography Report Sample 8-8-18.xlsx]Leadership Training Info'!$A:$A = $B$1 ), ROWS($1:1) ) ), " ",REPT(" ",5) ), 10) ) ), "" )

enter image description here

enter image description here