有人知道在 MicrosoftExcel 中查找列中最后一个非空单元格的值的公式吗?
这同时适用于文本和数字,并且不关心是否有空白单元格,也就是说,它将返回最后一个非空白单元格。
它需要用数组输入 ,这意味着您需要键入或粘贴 按 Ctrl-Shift-Enter。A 栏如下:
=INDEX(A:A,MAX((A:A<>"")*(ROW(A:A))))
这可以在 Excel2003中使用(稍后稍作修改,见下文)。按 Ctrl + Shift + Enter (不仅仅是 Enter)输入数组公式。
=IF(ISBLANK(A65536),INDEX(A1:A65535,MAX((A1:A65535<>"")*(ROW(A1:A65535)))),A65536)
请注意,Excel2003是 不能,用于将数组公式应用于整个列。这样做的结果是 #NUM!; 可能会出现不可预测的结果!来自 Microsoft 的相互冲突的信息: 关于 Excel2007,同样的 梅或 也许不会是正确的; 问题 梅已经在2010年得到修复。)
#NUM!
这就是为什么我将数组公式应用于范围 A1:A65535,并对最后一个单元格进行特殊处理,即 Excel2003中的 A65536。不能只说 A:A或甚至 A1:A65536,因为后者会自动恢复为 A:A。
A1:A65535
A65536
A:A
A1:A65536
如果你完全确定 A65536是空白的,那么你可以跳过 IF部分:
IF
=INDEX(A1:A65535,MAX((A1:A65535<>"")*(ROW(A1:A65535))))
请注意,如果使用的是 Excel2007或2010,则最后一行编号为1048576,而不是65536,因此可以适当调整以上内容。
如果您的数据中间没有空白单元格,那么我将使用更简单的公式 =INDEX(A:A,COUNTA(A:A))。
=INDEX(A:A,COUNTA(A:A))
还有一个选择: =OFFSET($A$1;COUNTA(A:A)-1;0)
=OFFSET($A$1;COUNTA(A:A)-1;0)
将此代码放在 VBA 模块中。
Function LastNonBlankCell(Range As Excel.Range) As Variant Application.Volatile LastNonBlankCell = Range.End(xlDown).Value End Function
受到 Doug Glancy 答案的启发,我想出了一个不需要数组公式就可以做同样事情的方法。不要问我为什么,但我热衷于尽可能避免使用数组公式(不是出于任何特殊原因,这只是我的风格)。
这就是:
=SUMPRODUCT(MAX(($A:$A<>"")*(ROW(A:A))))
用于查找使用列 A 作为引用列的最后一个非空行
=SUMPRODUCT(MAX(($1:$1<>"")*(COLUMN(1:1))))
用于查找使用第1行作为引用行的最后一个非空列
这可以进一步与索引函数结合使用,以有效地定义动态命名范围,但这是另一个职位的东西,因为这与本文讨论的直接问题无关。
我已经用 Excel2010测试了上面的方法,包括“原生的”和“兼容模式”(针对较老版本的 Excel) ,它们都可以工作。同样,使用这些命令,您不需要执行任何 Ctrl + Shift + Enter 命令。通过利用 sumproduct 在 Excel 中的工作方式,我们可以理解进行数组操作的必要性,但是我们没有使用数组公式。我希望有人能像我一样欣赏这些提议的总结解决方案的美丽、简洁和优雅。不过,我不能证明上述解决方案的记忆效率。只要它们简单、漂亮、有助于实现预期目的,并且足够灵活,可以将其用于其他用途:)
希望这个能帮上忙!
一切顺利!
没有数组公式(可能是 更有活力而不是 之前的一个答案,有一个没有数组公式的(提示)解)的另一种解决方案是
=INDEX(A:A,INDEX(MAX(($A:$A<>"")*(ROW(A:A))),0))
以 这个答案为例。 向帮助解决 这个问题的 布拉德和 Barry Houdini致敬。
选择非数组公式的可能原因如下:
Microsoft 官方页面 (查找“使用数组公式的缺点”)。 数组公式看起来很神奇,但它们也有一些缺点:
阵列公式异端邪说。
一个对我有用的简单方法:
=F7-INDEX(A:A,COUNT(A:A))
使用以下简单公式 更快
=LOOKUP(2,1/(A:A<>""),A:A)
Excel2003:
=LOOKUP(2,1/(A1:A65535<>""),A1:A65535)
它具有以下优点:
说明:
{TRUE,TRUE,..,FALSE,..}
1/(A:A<>"")
{1,1,..,#DIV/0!,..}
LOOKUP
lookup_range
2
1
result_range
另外,小注意 -上面的公式没有考虑有错误的单元格(只有在最后一个非空单元格有错误时才能看到)。如果你想考虑这些因素,请使用:
=LOOKUP(2,1/(NOT(ISBLANK(A:A))),A:A)
下图显示了区别:
我用了 HLOOKUP
A1有一个日期; A2:A8有不同时期的天气预报,我要最新的
A1
A2:A8
=Hlookup(a1,a1:a8,count(a2:a8)+1)
这使用一个标准查找公式,查找数组由条目数量定义。
文字资料:
EQUIV("";A1:A10;-1)
数值资料:
EQUIV(0;A1:A10;-1)
这将为您提供所选范围内最后一个非空单元格的相对索引(这里是 A1: A10)。
如果你想得到这个值,在构建绝对单元格引用之后通过 INDIRECT 访问它,例如:
INDIRECT("A" & (nb_line_where_your_data_start + EQUIV(...) - 1))
取自 给你的 =INDEX(A:A, COUNTA(A:A), 1)
=INDEX(A:A, COUNTA(A:A), 1)
文本数据的 =MATCH("*";A1:A10;-1)
=MATCH("*";A1:A10;-1)
数值数据的 =MATCH(0;A1:A10;-1)
=MATCH(0;A1:A10;-1)
好吧,我和提问者有同样的问题,并且尝试了两个最佳答案。但只能得到公式错误。结果我需要把“ ,”换成“ ;”,这样公式才能正常工作。我正在使用 XL 2007。
例如:
=LOOKUP(2;1/(A:A<>"");A:A)
或者
=INDEX(A:A;MAX((A:A<>"")*(ROW(A:A))))
我也有同样的问题。这个公式也同样有效:-
=INDIRECT(CONCATENATE("$G$",(14+(COUNTA($G$14:$G$65535)-1))))
14是要计数的行中第一行的行号。
慢性爪牙综合症
对于版本跟踪(将字母 v 添加到数字的开头) ,我发现这个在 Xcelius (SAP 仪表板)中工作得很好
="v"&MAX(A2:A500)
如果你知道中间不会有空的单元格,最快的方法是这样的。
=INDIRECT("O"&(COUNT(O:O,"<>""")))
它只计数非空单元格并引用适当的单元格。
它也可以用于特定的范围。
=INDIRECT("O"&(COUNT(O4:O34,"<>""")+3))
这将返回范围 O4: O34中的最后一个非空单元格。
我知道这个问题很老了,但是我对所提供的答案并不满意。
LOOKUP、 VLOOKUP 和 HLOOKUP 都有性能问题,真的不应该使用。
数组函数有很多开销,而且还可能存在性能问题,因此只能作为最后的手段使用。
如果数据不是连续的非空白数据,那么 COUNT 和 COUNTA 就会遇到问题,也就是说,在有问题的范围内有空格,然后又有数据
INDIRECT 是不稳定的,因此只能作为最后的手段使用
OffSET 是不稳定的,因此只能作为最后的手段使用
对最后一行或列的任何引用(例如 Excel2003中的第65536行)都是不健壮的,并导致额外的开销
我就用这个
当数据类型混合时: =max(MATCH(1E+306,[RANGE],1),MATCH("*",[RANGE],-1))
=max(MATCH(1E+306,[RANGE],1),MATCH("*",[RANGE],-1))
当已知数据只包含数字时: =MATCH(1E+306,[RANGE],1)
=MATCH(1E+306,[RANGE],1)
当已知数据只包含文本时: =MATCH("*",[RANGE],-1)
=MATCH("*",[RANGE],-1)
MATCH 具有最低的开销,并且是非易失性的,因此如果要处理大量数据,这是最好的选择。
用于 MicrosoftOffice2013
非空行的“最后但是一个”:
=OFFSET(Sheet5!$C$1,COUNTA(Sheet5!$C:$C)-2,0)
“ Last”非空行:
=OFFSET(Sheet5!$C$1,COUNTA(Sheet5!$C:$C)-1,0)
我尝试了所有的非易失性版本,但没有一个版本给出了以上工作。.Excel 2003/2007更新。当然,这可以在 Excel 2003中完成。不作为数组或标准公式。 我要么得到一个空白,0或 # 值错误。 所以我采取了反复无常的方法. . 这很有效. 。
= LOOKUP (2,1/(T4: T369 < > “”) ,T4: T369)
@ Julian Kroné..使用“ ;”代替“ ,”不起作用!我想你使用的是自由办公而不是微软的卓越? 查找是如此令人讨厌的不稳定,我使用它作为最后的手段
2010年,这个公式在我的办公室里奏效了:
= LOOKUP (2; 1/(A1: A100 < >”) ; A1: A100)
A1: 第一个单元格 A100: 参考比较中的最后一个单元格
我认为 W5ALIVE 的响应最接近于我用来查找列中最后一行数据的响应。不过,假设我要查找列 A 中包含数据的最后一行,我将使用以下内容进行更一般的查找:
=MAX(IFERROR(MATCH("*",A:A,-1),0),IFERROR(MATCH(9.99999999999999E+307,A:A,1),0))
第一个 MATCH 将查找最后一个文本单元格,第二个 MATCH 将查找最后一个数字单元格。如果第一个 MATCH 找到所有数字单元格,或者如果第二个匹配找到所有文本单元格,则 IFERROR 函数返回零。
基本上,这是 W5ALIVE 的混合文本和数字解决方案的一个轻微变化。
在测试时机时,这比等效的 LOOKUP 变化要快得多。
为了返回最后一个单元格的实际值,我倾向于像下面这样使用间接单元格引用:
=INDIRECT("A"&MAX(IFERROR(MATCH("*",A:A,-1),0),IFERROR(MATCH(9.99999999999999E+307,A:A,1),0)))
Sancho.s 提供的方法可能是一个更干净的选项,但是我会将查找行号的部分修改为:
=INDEX(MAX((A:A<>"")*(ROW(A:A))),1)
唯一的区别是,“ ,1”返回第一个值,而“ ,0”返回整个值数组(除了一个值外,其他值都不需要)。我仍倾向于将单元格寻址为其中的 index 函数,换句话说,返回单元格值的方法是:
=INDIRECT("A"&INDEX(MAX((A:A<>"")*(ROW(A:A))),1))
好线!
如果你不害怕使用数组,那么下面是一个非常简单的公式来解决这个问题:
= SUM (IF (A: A < > “”,1,0))
必须按 CTRL + SHIFT + ENTER,因为这是一个数组公式。
如在(A)栏内搜寻,请使用:
=INDIRECT("A" & SUMPRODUCT(MAX((A:A<>"")*(ROW(A:A)))))
如果你的射程是 A1: A10,你可以使用:
=INDIRECT("A" & SUMPRODUCT(MAX(($A$1:$A10<>"")*(ROW($A$1:$A10)))))
在这个公式中:
SUMPRODUCT(MAX(($A$1:$A10<>"")*(ROW($A$1:$A10))))
返回最后一个非空白行号,间接()返回单元格值。
INDEX 根据数组中的索引位置返回一个值,然后使用 ROWS 指定数组的最后一个位置。
=LET(array,A1:A10,INDEX(array,ROWS(array)))
在将 INDEX 的参数[ column _ num ]设置为0时,也可用于多列:
=LET(array,A1:C10,INDEX(array,ROWS(array),0))