我试图将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
答案 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
现在,您可以在工作表的公式中调用它,就像任何内置函数一样。
选择足够高的垂直范围的单元格以容纳转置数据。
单击Excel顶部的公式栏。
输入以下公式:
=MATRIX2VECTOR(allhazards)
这是一个数组公式,必须使用 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))
此致