Vba Excel:引用非零单元格
我试图将50行x 8列单元格(定义为“allhazards”)列成一列 但是,myhazards中的每个单元格都引用了其他工作表,并且包含0,其中没有可引用的文本 当我使用以下公式在单个列中列出“所有危险”中的数据时:Vba Excel:引用非零单元格,vba,excel,indexing,excel-formula,Vba,Excel,Indexing,Excel Formula,我试图将50行x 8列单元格(定义为“allhazards”)列成一列 但是,myhazards中的每个单元格都引用了其他工作表,并且包含0,其中没有可引用的文本 当我使用以下公式在单个列中列出“所有危险”中的数据时: =INDEX(allhazards,1+INT((ROW($A1)-1)/COLUMNS(allhazards)),MOD(ROW($A1)-1+COLUMNS(allhazards),COLUMNS(allhazards))+1) (然后向下拖动该列以获取“allhazard
=INDEX(allhazards,1+INT((ROW($A1)-1)/COLUMNS(allhazards)),MOD(ROW($A1)-1+COLUMNS(allhazards),COLUMNS(allhazards))+1)
(然后向下拖动该列以获取“allhazards”中的所有单元格)
我如何实现这一点:
如果“allhazards”中的单元格为0,则不要引用此单元格,移动到下一行
…然后引用下一行的列,直到单元格为0,然后移动到下一行
…继续执行此操作,直到没有要引用的行为止
例如,如果“所有危险”包含这些单元格(例如2行x 8列):
向下拖动公式时,应产生以下结果:
hello
how
are
good
但不是这个:
hello
how
are
0
0
0
0
0
good
0
0
0
0
0
0
0
我为你的情况创建了一个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
4.
这是一个数组公式,必须用Ctrl+Shift+Enter确认
如果您对非VBA解决方案感兴趣:
=IF(行($1:1)>COUNTIF(所有危害,“0”),“”,间接(文本(聚合(15,6,(10^5*行(所有危害)+列(所有危害))/(所有危害),行($1:1)),“R0C00000”),0))
按要求抄写
如果您使用单个辅助单元格来存储allhazards中非零条目的数量,并将行
/列
部分作为定义的名称来存储,这将更加有效。例如,如果您将:
=COUNTIF(所有危险,“0”)
在例如J1中,并在名称管理器中定义Arry1为:
=10^5*行(所有危险)+列(所有危险)
然后,主要公式变成:
=IF(行($1:1)>$J$1,”),间接(文本(聚合(15,6,Arry1/(allhazards0),行($1:1)),“R0C00000”),0))
如果您的数据与包含结果的表不同,只需包含包含数据的表名,即:
=IF(行($1:1)>$J$1,”,间接('YourSheetName'!”)和文本(聚合(15,6,Arry1/(allhazards0),行($1:1)),“R0C00000”),0))
关于您是否同意在VBA中创建的用户定义函数,您可以在工作表中使用该函数?您好,谢谢您的时间和努力。我遵循了你的方法,获得了价值!列表中的每个单元格都有错误。数据“allhazards”是一组引用其他表格文本的单元格。这有什么原因吗?Cheers@Jared从其他图纸中提取数据时,命名范围内的单元格应该没有问题。但您可以通过复制并将值粘贴到“allhazards”中进行测试。这样行吗?你在用Control Shift Enter确认公式吗?@Jared你能给我一份不起作用的副本吗?我肯定我能很快把它分类?我的电子邮件地址是:丹尼尔。ferry@gmail.com@杰瑞德:早上好。你能把它发动起来吗?如果你想给我发电子邮件,我仍然可以提供帮助。我有一个相当大的工作簿,一直在寻找非VBA方法(因为我不熟悉VBA),但我会尝试删除该表,以便您今天晚些时候查看(昨天赶时间,并对延迟表示歉意)干杯:)您好。您提供的第一位代码仅在“allhazards”数据存储在同一张表中时有效。我想在不同的表中使用代码来存储我的数据。这可能吗?谢谢。已经添加到我的帖子的底部。请注意,工作表名称周围的单撇号和感叹号是经过深思熟虑的,应该包括在内。我包含所有危险的工作表称为“程序”,我尝试将“YourSheetName”替换为“程序”(保留单撇号),但计算结果均为0,我试着评估这个公式,但它突然停了下来,说“这个公式可能是循环引用”,有什么想法吗?再次感谢您抽出时间来帮助我。您没有在范围内的任何地方输入配方?
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
=MATRIX2VECTOR(allhazards)