从一个范围创建非空白单元格值列表?

时间:2016-10-11 10:20:33

标签: arrays excel

我有一个像这样的电子表格:

Column A

Ducks
Frogs
<Blank>
Rabbits
<blank>
Horse

我希望能够创建范围(A列)中所有非空白单元格的列表,如下所示:

Ducks
Frogs
Rabbits
Horse

我不希望空白值出现在我的列表中。

此外,如果在范围内找到空白值,我的公式应该跳过并列出范围内的下一个非空白单元格。

然而,目前我正在获得0

这是我的数组公式,请有人告诉我我哪里出错了吗?

=IFERROR(INDEX($F$16:$F$5000,IF($G$16:$G$5000<>"",ROW($1:$5000)),1),"")

3 个答案:

答案 0 :(得分:1)

此设置中的

IFERROR效率非常低,特别是如果要查询的数据集的大小很大; cf我的回复:

https://superuser.com/questions/812727/look-up-a-value-in-a-list-and-return-all-multiple-corresponding-values

最好使用单个单元格来记录预期返回数量,并在主公式中的初始IF子句中引用该单元格。例如,如果我们为此目的使用单元格H16,我们会在该单元格中放置:

=COUNTIF(G$16:G$5000,"<>")

主阵列公式**是:

=IF(ROWS($1:1)>H$16,"",INDEX(F:F,SMALL(IF(G$16:G$5000<>"",ROW(G$16:G$5000)),ROWS($1:1))))

并向下复制,直到你得到空白。

对于唯一列表,请将H16中的公式更改为:

=SUM(IF(FREQUENCY(IF(G16:G5000<>"",MATCH(F16:F5000,F16:F5000‌​,0)),ROW(F16:F5000)-MIN(ROW(F16:F5000))+1),1))

和主要公式:

IF(ROWS($1:1)>H$16,"",INDEX(F:F,SMALL(IF(FREQUENCY(IF(G$16:G$5000<>"",MATCH(F$16:F$5000,F$16:F$5000,0)),ROW(F$16:F$5000)-MIN(ROW(F$16:F$5000))+1),ROW(F$16:F$5000)),ROWS($1:1))))

此致

答案 1 :(得分:0)

我建议您考虑将macro用于此问题(在工具栏选项中)。您可以录制一个空宏并粘贴我附加的代码。 请注意,宏会覆盖使用历史记录(ctrl + z)更改回来的功能。在代码中,列为16,最后一行为5000,但您可以更改它。

Dim max As Integer
Dim colNum As Integer
Dim limit As Integer

max = 5000
colNum = 16

limit = max

For i = 1 To max
    If Cells(i, colNum) = "" Then
        Cells(i, colNum).Delete Shift:=xlUp
        If limit > 0 Then
            i = i - 1
            limit = limit - 1
        end if
    End If
Next i

答案 2 :(得分:0)

我发现其他解决方案(也是该主题的大多数搜索引擎热门)都难以理解:)如果不明确,很难适应另一种/更通用的用法。

不知道性能,但这会实现A列的非空白列表:

=INDEX( $A:$A, 2*ROW($A1)-COUNTIF($A$1:$A1,"<>") )

通过计算上方有多少空白单元格并将其用作“向前看”所需的运行偏移量来工作。