查找不晚于给定日期的最新非空白值 - 并快速

查找不晚于给定日期的最新非空白值 - 并快速

我真的很难找到解决这个看似简单的问题的方法。我甚至寻求了 ChatGPT 的帮助,但它的解决方案都不起作用。也许你可以证明你比机器更聪明(目前)?

我正在搜索相邻的工作表和外部工作簿,有时这些工作表和外部工作簿有数万行,所以我发现我需要比LOOKUP或更快的程序,否则事情就会停滞不前。但是,我使用的是 LibreOffice 7.4,因此不支持VLOOKUP动态数组公式和一些较新的 Excel 函数,例如XLOOKUPFILTER和。SORT

A 列包含按升序或降序排列的日期列表。B 列包含未排序的数字和空白单元格。

A
01/05/23 1234.10
02/05/23 134.25
05/05/23 5123.45
08/05/23
10/05/23 0.00

需要一个非 CPU 密集型公式来查找 B 列中最新的非空白值(包括零),其中查找值是不晚于单元格中的日期的日期$Z1。我尝试了LOOKUP(2,1/INDEX MATCH、的变体VLOOKUP,但我得到的要么是全零,要么是错误,要么是 B 列中的第一个或最后一个值,而忽略了日期。

有什么想法吗?我开始怀疑 LibreOffice 是否有问题。这不是我第一次必须重新安装它才能让它开始正常运行。

编辑:到目前为止我尝试过的公式列表:

{=INDEX($B$2:$B$9999,MAX(IF($A$2:$A$9999<=$Z1,ROW($A$2:$A$9999)-MIN(ROW($A$2:$A$9999))+1)))}

它返回的值为 0。我认为它正在查找单元格 $B$9998,而不是最后一个非空白单元格 $B$124。

=LOOKUP(2,1/($A$2:$A$9999<=$Z1),$B$2:$B$9999)

它返回一个空字符串。我以前用过不同的版本:

=LOOKUP(2,1/($Z1>=$A$2:$A$9999)/$B$2:$B$9999,$B$2:$B$9999)

它可以工作,但是它不支持值为 0 的单元格。

{=MAX(IF($A$2:$A$9999<=$Z1, $B$2:$B$9999, ""))}

不知何故,这个返回的是 B 列中的第三个值,而不是最后一个值 - 无论单元格 $Z1 中的日期是什么。

{=OFFSET($'Savings chart'.$B$2,MAX(IF($'Savings chart'.$A$2:$A$9999<=$A38,ROW($'Savings chart'.$A$2:$A$9999)-ROW($A$2)+1,0))-1,0)}

这个查看单元格 $B$9998 并返回值 0,而不是查看最后一个非空白单元格。

{=INDIRECT("'Sheet 2'.B"&SUMPRODUCT(MAX(('Sheet 2'.A:A<=$Z1)*ROW('Sheet 2'.A:A))))}

该函数返回值为 0。

{=INDEX('Sheet 2'.B:B, MAX(IF('Sheet 2'.A:A<=$Z1, ROW('Sheet 2'.A:A))))}

该函数返回值为 0。

{=INDEX($B$2:$B$9999,MAX(IF($A2:$A$9999<=$Z1,ROW($B$2:$B$9999)-MIN(ROW($B$2:$B$9999))+1)))}

该函数返回值为 0。

{=OFFSET('Savings chart'.$B$1, MAX(IF('Savings chart'.$B$2:$B$9999<>"", ROW('Savings chart'.$B$2:$B$9999)-ROW('Savings chart'.$B$2)+1, 0))-1, 0)}

有点令人惊讶的是,这个返回了 B 列中的倒数第二个值。

{=INDEX($B$2:$B$9999, MAX(IF($B$2:$B$9999<>"", ROW($B$2:$B$9999)-ROW($B$2)+1, 0)))}

返回最后一个非空白单元格的值在 B 列中,但我当时不知道如何让它考虑 $Z1 中的日期。(您可能已经看出来,我做这件事的时候很累。)

=INDEX($B$2:$B$9999, MATCH(2, 1/($A$2:$A$9999<=$Z1), 1))

这个函数查看单元格 $B$9998 并返回值 0。

=IF($A5>=$'Savings chart'.$A$2:$A$9999,LOOKUP(9.999999E+306,$'Savings chart'.$B$2:$B$9999),0)

无论单元格 $Z1 中的日期是什么,此函数始终返回 B 列中的最后一个非空白单元格。

=XLOOKUP($'Savings chart'.$A$2:$B$9999,($A2>=$'Savings chart'.$A$2:$A$9999)*($'Savings chart'.$B$2:$B$9999<>""),$'Savings chart'.$B$2:$B$9999)

安装后goosepirate 提供的 Lox365 扩展,我尝试了这个公式XLOOKUP。它产生了一个错误代码 Err:504这时,我放弃了,去睡觉了。

以下是我一直使用的数据示例:

Date    Data
1 Jan 23    490.44
1 Jan 23    
1 Jan 23    
2 Jan 23    
3 Jan 23    
4 Jan 23    
4 Jan 23    
5 Jan 23    
6 Jan 23    
7 Jan 23    
8 Jan 23    
9 Jan 23    
11 Jan 23   
11 Jan 23   
11 Jan 23   
11 Jan 23   
11 Jan 23   
12 Jan 23   
12 Jan 23   
13 Jan 23   
14 Jan 23   
16 Jan 23   
16 Jan 23   
17 Jan 23   
18 Jan 23   
18 Jan 23   
19 Jan 23   
20 Jan 23   493.44
21 Jan 23   
21 Jan 23   
22 Jan 23   
22 Jan 23   
23 Jan 23   499.44
24 Jan 23   
24 Jan 23   
24 Jan 23   
24 Jan 23   
25 Jan 23   484.81
25 Jan 23   
25 Jan 23   
25 Jan 23   
25 Jan 23   
25 Jan 23   
26 Jan 23   
26 Jan 23   
26 Jan 23   
27 Jan 23   
27 Jan 23   
27 Jan 23   
28 Jan 23   
29 Jan 23   
31 Jan 23   
31 Jan 23   
1 Feb 23    
1 Feb 23    
1 Feb 23    
3 Feb 23    
3 Feb 23    
4 Feb 23    
5 Feb 23    
5 Feb 23    
5 Feb 23    
6 Feb 23    
6 Feb 23    
6 Feb 23    
6 Feb 23    
6 Feb 23    
7 Feb 23    
7 Feb 23    
7 Feb 23    
7 Feb 23    
8 Feb 23    
8 Feb 23    
9 Feb 23    
9 Feb 23    
9 Feb 23    
10 Feb 23   
10 Feb 23   
10 Feb 23   
10 Feb 23   
10 Feb 23   
10 Feb 23   
10 Feb 23   
10 Feb 23   
11 Feb 23   
11 Feb 23   
11 Feb 23   
11 Feb 23   
11 Feb 23   
12 Feb 23   
12 Feb 23   
12 Feb 23   
13 Feb 23   
13 Feb 23   
13 Feb 23   
13 Feb 23   
14 Feb 23   
15 Feb 23   
15 Feb 23   
16 Feb 23   
16 Feb 23   
17 Feb 23   
17 Feb 23   
17 Feb 23   
17 Feb 23   
17 Feb 23   
17 Feb 23   
17 Feb 23   
18 Feb 23   
18 Feb 23   
19 Feb 23   
20 Feb 23   487.81
20 Feb 23   
20 Feb 23   
20 Feb 23   
21 Feb 23   
21 Feb 23   
22 Feb 23   
22 Feb 23   
22 Feb 23   
22 Feb 23   
23 Feb 23   493.81
24 Feb 23   477.81

答案1

我开始使用的公式是:
=LOOKUP(2,1/($A2>='Sheet 1'.$A$2:$A$10000)/$'Sheet 1'.B$2:B$10000,$'Sheet 1'.B$2:B$10000)

通过添加“非空白”过滤器,我能够获得所需的结果,如下所示:
=LOOKUP(2,1/($A2>='Sheet 1'.$A$2:$A$10000)/($'Sheet 1'.B$2:B$10000<>""),$'Sheet 1'.B$2:B$10000)

相关内容