【问题标题】:In excel, how to get comma separated values from a column based on search criteria on another column在excel中,如何根据另一列的搜索条件从一列中获取逗号分隔值
【发布时间】:2015-07-02 02:11:22
【问题描述】:

例如,请参见下表中的两列。

我需要在单元格中获取逗号分隔的活动用户 ID(其中 Active = 1),如“预期输出”中所示。 users 表中可能有 n 行。

谁能建议一个 excel 公式来实现这一点(不使用 VBA 代码)?

【问题讨论】:

    标签: excel excel-formula


    【解决方案1】:

    您可以为该工作表运行一些 VBA

    Sub tester()
    Dim last As Integer
    Dim i As Integer
    Dim myString As String
    myString = ""
    
    last = Range("A1").End(xlDown).Row
    For i = 2 To last
        If Range("B" & i).Value = 1 And myString = "" Then
        myString = Str(Range("A" & i).Value)
        ElseIf Range("B" & i).Value = 1 Then
             myString = myString + "," + Str(Range("A" & i).Value)
        End If
    Next i
        Range("C2").Value = myString
    End Sub
    

    【讨论】:

    • 您的解决方案看起来不错。但是,我需要在将由许多用户共享的 XLS 模板中使用它。我们在某些客户端计算机上使用宏时遇到了问题。所以,我想知道基于公式的解决方案是否可行。在问题描述中添加 UDF 对我不利。编辑
    • 好的,明白了。 VBA 真的是我知道的唯一方法。抱歉,帮不上忙。
    【解决方案2】:

    这是一种纯粹使用 Excel 公式的方法。我不认为它可以完全使用 单个 Excel 公式来完成,但您至少可以隐藏包含您不希望用户看到的工作公式的列。

    • 在单元格C1中输入Working
    • 在单元格C2中输入=SUBSTITUTE(IF(B2=1,C1&","&A2,C1),C$1&", ","")
    • 尽可能向下拖动单元格 C2 以覆盖您可能拥有的最长数据列表。
    • 在单元格D5中输入=INDEX(C:C,MAX(IF(C2:C10000="",0,ROW(C2:C10000))))并按Ctrl+Shift+Enter将其输入为array formula
    • 如果需要,通过右键单击列标题并选择隐藏来隐藏列 C。这将阻止用户看到 C 列。(您可能希望采取其他保护措施,例如锁定工作表并只允许用户编辑 A 列和 B 列。)

    这是您的示例在“工作”列中的样子:

    UserId  Active  Working 
    26001        0  Working 
    26002        1  26002   
    26003        0  26002                Expected Output:
    26004        0  26002                26002, 26005, 26010
    26005        1  26002, 26005    
    26006        0  26002, 26005    
    26007        0  26002, 26005    
    26008        0  26002, 26005    
    26009        0  26002, 26005    
    26010        1  26002, 26005, 26010 
    

    这是您的示例在打开公式后的样子:

    UserId  Active  Working 
    26001        0  =SUBSTITUTE(IF(B2=1,C1&", "&A2,C1),C$1&", ","") 
    26002        1  =SUBSTITUTE(IF(B3=1,C2&", "&A3,C2),C$1&", ","") 
    26003        0  =SUBSTITUTE(IF(B4=1,C3&", "&A4,C3),C$1&", ","")    Expected Output:
    26004        0  =SUBSTITUTE(IF(B5=1,C4&", "&A5,C4),C$1&", ","")    =INDEX(C:C,MAX(IF(C2:C10000="",0,ROW(C2:C10000))))
    26005        1  =SUBSTITUTE(IF(B6=1,C5&", "&A6,C5),C$1&", ","") 
    26006        0  =SUBSTITUTE(IF(B7=1,C6&", "&A7,C6),C$1&", ","") 
    26007        0  =SUBSTITUTE(IF(B8=1,C7&", "&A8,C7),C$1&", ","") 
    26008        0  =SUBSTITUTE(IF(B9=1,C8&", "&A9,C8),C$1&", ","") 
    26009        0  =SUBSTITUTE(IF(B10=1,C9&", "&A10,C9),C$1&", ","")   
    26010        1  =SUBSTITUTE(IF(B11=1,C10&", "&A11,C10),C$1&", ","") 
    

    公式有什么作用?

    =SUBSTITUTE(IF(B2=1,C1&","&A2,C1),C$1&", ","") 检查 B 列中是否有 1。如果是,则使用上面的内容并添加逗号、空格和 UserId。如果没有,它只需要上面的内容。为了消除单词“Working”和额外的分隔符,“Working”被替换为一个空格。

    =INDEX(C:C,MAX(IF(C2:C10000="",0,ROW(C2:C10000)))) 搜索 C 列中包含空白的第一行(在本例中为 11),然后从 C 列(在本例中为 C11)获取该项目。

    【讨论】:

      猜你喜欢
      • 2022-06-23
      • 2021-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多