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

时间:2012-09-25 16:57:58

标签: 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列总是最左边的列。

2 个答案:

答案 0 :(得分:1)

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

= 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
    

答案 1 :(得分:0)

我想说这是excel的最基本功能但是由于你假设人为限制你不能决定你的列将如何订购 - 那么它需要你使用像HLOOKUP这样的东西(假设你可以在最少确定你的标题):

=IF(AND(HLOOKUP("Key",$A$1:$C$5,ROW(),FALSE)=10,HLOOKUP("VALUE",$A$1:$C$5,ROW(),FALSE)=20),HLOOKUP("ID",$A$1:$C$5,ROW(),FALSE),"")

HLOOKUP_EXAMPLE

祝你好运。

修改/ ADDITION:

使用来自http://www.mcgimpsey.com/excel/udfs/multicat.html

的多项功能

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