Excel公式:对于列中的每个值实例,获取同一行中另一列的值

Excel公式:对于列中的每个值实例,获取同一行中另一列的值,excel,Excel,我希望在Excel中解决以下问题: ID Key Value 1 10 20 2 5 30 3 10 20 4 10 20 如果key==10,Value==20,则获取ID 所以,我需要这个来生成下面的列表:“1,3,4” 本质上,我想看看一个值是否在给定的范围内,另一个值是否在另一个范围内,给我另一个范围内的对应值(同一行) 我不能假定ID列始终是最左边的列。您可以使用附加的用户定义函数来实现

我希望在Excel中解决以下问题:

ID     Key     Value
1      10      20
2       5      30
3      10      20
4      10      20
如果key==10,Value==20,则获取ID

所以,我需要这个来生成下面的列表:“1,3,4”

本质上,我想看看一个值是否在给定的范围内,另一个值是否在另一个范围内,给我另一个范围内的对应值(同一行)


我不能假定ID列始终是最左边的列。

您可以使用附加的用户定义函数来实现此目的。从工作表中调用它,如下所示:

=concatPlusIfs(A1:A4,“,”,1,10,2,20)

在哪里

  • A1:A4是ID列表
  • “,”是分隔符
  • 1是id列和键列之间的偏移量(-1表示左侧的1列)
  • 10是您的密钥的标准
  • 2是id列和值列之间的偏移量
  • 20是衡量你价值的标准

    Public Function concatPlusIfs(rng As Range, sep As String, lgCritOffset1 As Long, varCrit1 As Variant, lgCritOffset2 As Long, varCrit2 As Variant, Optional noDup As Boolean = False, Optional skipEmpty As Boolean = False) As String
    
    Dim cl As Range, strTemp As String
    
    If noDup Then 'remove duplicates, use collection to avoid them
    
    Dim newCol As New Collection
    
    On Error Resume Next
    
    For Each cl In rng.Cells
        If skipEmpty = False Or Len(Trim(cl.Text)) > 0 Then
            If cl.Offset(, lgCritOffset1) = varCrit1 And cl.Offset(, lgCritOffset2) = varCrit2 Then newCol.Add cl.Text, cl.Text
        End If
    Next
    
    For i = 0 To newCol.Count
        strTemp = strTemp & newCol(i) & sep
    Next
    
    Else
    
    For Each cl In rng.Cells
        If skipEmpty = False Or Len(Trim(cl.Text)) > 0 Then
            If cl.Offset(, lgCritOffset1) = varCrit1 And cl.Offset(, lgCritOffset2) = varCrit2 Then strTemp = strTemp & cl.Text & sep
        End If
    Next
    
    End If
    
    concatPlusIfs = Left(strTemp, Len(strTemp) - Len(sep))
    
    End Function
    

我想说这是excel最基本的功能,但由于您假设人工限制无法决定列的排序方式,因此它要求您使用类似HLOOKUP的功能(假设您至少可以确定标题):

祝你好运

编辑/添加:

从以下位置使用multicat功能:

e、 g。 对表格进行排序以消除空格,然后:

=multicat(C2:C5,",")
或者,如果排序对您来说工作量太大,您可以使用此修改版的mcgimpsey函数来清除空白单元格:

  Public Function MultiCat( _
        ByRef rRng As Excel.Range, _
        Optional ByVal sDelim As String = "") _
             As String
     Dim rCell As Range
     For Each rCell In rRng
        If rCell.Value <> "" Then
         MultiCat = MultiCat & sDelim & rCell.Text
         End If
     Next rCell
     MultiCat = Mid(MultiCat, Len(sDelim) + 1)
  End Function
MultiCat公共功能(_
ByRef rRng作为Excel.Range_
可选ByVal sDelim As String=“”)_
作为字符串
变暗rCell As范围
对于rRng中的每个rCell
如果rCell.Value为“”,则
MultiCat=MultiCat&sDelim&rCell.Text
如果结束
下一个rCell
MultiCat=Mid(MultiCat,Len(sDelim)+1)
端函数

即使这3列不是前3列,它们是否总是以相同的顺序彼此相邻?结果列表在哪里?它们的键列和值列将彼此相邻,这是有保证的。ID可能是第一列,但不能保证。结果列表将作为文本放在工作表其他位置的特定单元格中。每张工作表是否只有一个ID列?这假设一次得到1个值,对吗?我需要将所有三个结果作为文本放在一个字段中。我将执行这个操作25次,所以不幸的是,我不能像你的截图所显示的那样,在不同的栏中单独显示结果。因此,这是在原始问题中提供的有用信息。查看我的编辑。希望避免使用VBScript,但这正是我所需要的。谢谢您已经避免使用VBScript,这实际上是VBA:)还有一个问题。是否有一种方法可以在有人添加新id、键和值时自动更新包含函数调用的单元格?因此,在我上面的示例中,如果我添加id=5,key=10,value=20,单元格将更新为“1,3,4,5”。如果插入一行,它将自动更新,因为您已经更新了公式所查看的范围。如果没有,则可以将范围转换为表格,并在公式中使用表格引用。当您在底部插入新行时,该表将自动拾取新行。以前没有,但我修改为将ID的范围指定为单元格值(通常不是最好的,但适用于我的用例),我使用间接()引用它,现在它会自动更新。:)
  Public Function MultiCat( _
        ByRef rRng As Excel.Range, _
        Optional ByVal sDelim As String = "") _
             As String
     Dim rCell As Range
     For Each rCell In rRng
        If rCell.Value <> "" Then
         MultiCat = MultiCat & sDelim & rCell.Text
         End If
     Next rCell
     MultiCat = Mid(MultiCat, Len(sDelim) + 1)
  End Function