Excel:引用非零单元格

我试图把50行x 8列的单元格(定义为“allhazards”)列入一列

然而,每个在危险中的单元都引用了其他表单,并且在没有要引用的文本的情况下包含0。

当我使用这个公式在单列中列出'allhazards'中的数据时:

=INDEX(allhazards,1+INT((ROW($A1)-1)/COLUMNS(allhazards)),MOD(ROW($A1)-1+COLUMNS(allhazards),COLUMNS(allhazards))+1) 

(然后拖动列以获取所有的单元格从“allhazards”)

我如何实现这一点:

如果'allhazards'中的单元格为0,则不要引用此单元格,移动到下一行…然后引用下一行的列直到单元格为0,然后移动到下一行…继续这样做,直到没有剩下行被引用

例如。 如果包含这些单元格的“allhazards”(例如2行x 8列):

 hello how are 0 0 0 0 0 good 0 0 0 0 0 0 0 

拖动公式时应该产生这个:

 hello how are good 

但不是这样的:

 hello how are 0 0 0 0 0 good 0 0 0 0 0 0 0 

我为你的情况创build了一个UDF。 请将以下步骤放在标准的代码模块中。

 Public Function MATRIX2VECTOR(r As Range) Dim i&, j&, k&, v, m, o v = r ReDim o(1 To Application.Caller.Rows.Count, 1 To 1) For i = 1 To UBound(v, 1) For j = 1 To UBound(v, 2) m = v(i, j) If Len(m) Then If m <> 0 Then k = k + 1 o(k, 1) = v(i, j) End If End If Next Next For k = k + 1 To UBound(o): o(k, 1) = "": Next MATRIX2VECTOR = o End Function 

现在,您可以像工作表中的任何内置函数一样从工作表中调用它。

1

select一个高度足以容纳转置数据的垂直范围的单元格。

2

单击Excel顶部的公式栏。

3

input这个公式:

 =MATRIX2VECTOR(allhazards) 

4

这是一个数组公式,并且必须用Ctrl + Shift + Enter确认

如果您对非VBA解决scheme感兴趣:

=IF(ROWS($1:1)>COUNTIF(allhazards,"<>0"),"",INDIRECT(TEXT(AGGREGATE(15,6,(10^5*ROW(allhazards)+COLUMN(allhazards))/(allhazards<>0),ROWS($1:1)),"R0C00000"),0))

根据需要复制。

如果您使用单个帮助程序单元来存储所有危险中的非零条目 ,并且将ROW / COLUMN部分存储为定义名称,则这将更有效。 例如,如果你把:

=COUNTIF(allhazards,"<>0")

在例如J1中,并在名称pipe理器中将Arry1定义为:

=10^5*ROW(allhazards)+COLUMN(allhazards)

那么主要公式就变成:

=IF(ROWS($1:1)>$J$1,"",INDIRECT(TEXT(AGGREGATE(15,6,Arry1/(allhazards<>0),ROWS($1:1)),"R0C00000"),0))

如果您的数据位于与收录结果不同的工作表中,只需包含包含数据的工作表名称即:

=IF(ROWS($1:1)>$J$1,"",INDIRECT("' YourSheetName '!"&TEXT(AGGREGATE(15,6,Arry1/(allhazards<>0),ROWS($1:1)),"R0C00000"),0))

问候