【问题标题】:Excel - Retrieve list of column names with cells containing >0 in one rowExcel - 检索列名列表,其中一行包含> 0的单元格
【发布时间】:2024-04-16 16:20:02
【问题描述】:

我有一个庞大的鸟类观察数据电子表格,每列名称是一个物种的名称,A 列中的每一行是一个与进行物种计数的地理位置相关联的数字。所以每个物种下的每个细胞都是在其各自位置被看到的次数的计数。

我想要的是一个函数,它会给我一个列名列表,在该位置具有值>0。我发现的所有内容都向我展示了如何找到第一个值>0,但我想要一个可以包含 50 个物种名称的列表。

最后的想法是,对于每个地理点,我只有一个在那里见过的物种列表。我假设该函数将从我读过的内容中以 INDEX 开头,但不确定如何继续。

如果 VBA 是唯一的前进道路,那很好,但我对它很陌生,所以欢迎提出如何实现这一目标的建议。

【问题讨论】:

  • 您应该能够将答案调整为Concatenate top row cells if column below has 1
  • FWIW,如果您拥有最新的 Office 365,那么以下数组公式将为示例数据执行此操作。 =TEXTJOIN(",",TRUE,IF(B2:D2>0,$B$1:$D$1,"")) 是和数组,需要用 Ctrl-Shift-Enter 确认。如果正确完成,Excel 将在公式周围添加{}

标签: vba excel indexing


【解决方案1】:

正如@Jeeped 在上面的评论中给出的那样,这是根据您的情况调整的答案,来自他发布的链接答案。

由于您要处理 50 列,因此处理是创建一个 VBA 用户定义函数。

这就是你如何创建一个:

  1. Alt+F11
  2. 当 VBE 打开时,在菜单中选择 Insert ► Module (Alt+I,M)。
  3. 将以下内容粘贴到窗口中。

Public Function conditional_concat(rSTRs As Range, rCRITs As Range, Optional sDELIM As String = ", ")
    Dim c As Long, sTMP As String
    For c = 1 To Application.Min(rSTRs.Cells.Count, rCRITs.Cells.Count)
        If CBool(rCRITs(c).Value2) Then _
            sTMP = sTMP & rSTRs(c).Value & sDELIM
    Next c
    conditional_concat = Left(sTMP, Application.Max(Len(sTMP) - Len(sDELIM), 0))
End Function
  1. 保存工作簿。

现在您可以在工作表上的单元格的公式中使用此函数。

在您的情况下,将以下内容添加到“找到的物种”列的第二行(BB 是您的最后一列物种):

=conditional_concat(A$1:BB$1, A2:BB2)

然后您可以将其复制粘贴到其余行上。

【讨论】:

    【解决方案2】:

    考虑这个用户定义函数:

    Public Function Headerr(rIN As Range) As String
        Dim r As Range
        Headerr = ""
        For Each r In rIN
            If r.Value > 0 Then Headerr = Headerr & "," & r.EntireColumn.Cells(1).Value
        Next r
        If Headerr <> "" Then Headerr = Mid(Headerr, 2)
    End Function
    

    例如:

    此示例仅使用五列,但这不是限制。

    用户定义函数 (UDF) 非常易于安装和使用:

    1. ALT-F11 调出 VBE 窗口
    2. ALT-I ALT-M 打开一个新模块
    3. 粘贴内容并关闭 VBE 窗口

    如果您保存工作簿,UDF 将与它一起保存。 如果您使用的是 2003 年以后的 Excel 版本,则必须保存 文件为 .xlsm 而不是 .xlsx

    要删除 UDF:

    1. 如上所示打开 VBE 窗口
    2. 清除代码
    3. 关闭 VBE 窗口

    要使用 Excel 中的 UDF:

    =myfunction(A1)

    要了解有关宏的更多信息,请参阅:

    http://www.mvps.org/dmcritchie/excel/getstarted.htm

    http://msdn.microsoft.com/en-us/library/ee814735(v=office.14).aspx

    有关 UDF 的详细信息,请参阅:

    http://www.cpearson.com/excel/WritingFunctionsInVBA.aspx

    必须启用宏才能正常工作!

    【讨论】: