Vba Excel:引用非零单元格

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

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

但是,myhazards中的每个单元格都引用了其他工作表,并且包含0,其中没有可引用的文本

当我使用以下公式在单个列中列出“所有危险”中的数据时:

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