Excel:引用非零单元格

时间:2015-09-08 00:37:29

标签: excel vba excel-vba indexing excel-formula

我试图将50行x 8列单元格(定义为' allhazards')列入一列

然而,myhazards中的每个单元格都引用其他工作表并包含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行×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

2 个答案:

答案 0 :(得分:1)

我为你的情况创建了一个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

选择足够高的垂直范围的单元格以容纳转置数据。

2

单击Excel顶部的公式栏。

3

输入以下公式:

=MATRIX2VECTOR(allhazards)

4

  

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

答案 1 :(得分:1)

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

=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))

根据需要复制。

如果您使用单个辅助单元格在 allhazards 中存储非零条目的数量,并且还存储ROW / COLUMN部分,这将更有效作为定义的名称。例如,如果你把:

=COUNTIF(allhazards,"<>0")

例如J1,并在名称管理器中定义 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))

此致