Excel公式:对于列中的每个值实例,获取同一行中另一列的值
我希望在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列始终是最左边的列。您可以使用附加的用户定义函数来实现
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
=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