excel vlookup将多个行合并到一个单元格

时间:2019-09-14 07:33:41

标签: excel vba excel-formula

我想基于查找,将数据从一张工作表sheet1的多行获取到另一张工作表sheet2的单个单元格中。

例如,一张纸上有数据:

sheet1

我想基于id查找数据,并将所有相关行返回到一个像这样的单元格中:

sheet2

使用Excel公式可以解决吗,还是只能使用VBA解决?

谢谢您的帮助。

我找到了一个接近解决方案但无法正常工作的vba。我看过“索引,匹配”功能和“小”功能,但是可以找到一种将数据放入单个单元格的解决方案...

这是我发现的接近解决方案的vba代码:

'Function SingleCellExtract(Lookupvalue As String, LookupRange As Range, ColumnNumber As Integer)
  Dim i As Long
  Dim Result As String
  For i = 1 To LookupRange.Columns(1).Cells.Count
  If LookupRange.Cells(i, 1) = Lookupvalue Then
  Result = Result & " " & LookupRange.Cells(i, ColumnNumber) & ","
  End If
  Next i
  SingleCellExtract = Left(Result, Len(Result) – 1)
  End Function'

vba抛出了值或编译错误。看起来好像它只从一个垂直列返回值

1 个答案:

答案 0 :(得分:2)

  

“ excel公式可能可行吗,还是只能用VBA解决?”

通过公式当然可以实现,但是您必须有权使用TEXTJOIN函数:

enter image description here

H2中的公式:

=TEXTJOIN(CHAR(10),TRUE,IF($A$2:$A$11=G2,$B$2:$B$11&", "&$C$2:$C$11&", "&$D$2:$D$11&", "&$E$2:$E$11,""))
  

注意: 这是一个数组公式,需要通过 Ctrl Shift 输入

向下拖动公式,并确保在H列上选择了自动换行。

无法访问TEXTJOIN?您始终可以创建自己的示例,例如:

Function TEXTJOIN(rng As Range, id As Long) As String

For Each cl In rng
    If cl.Value = id Then
        If TEXTJOIN = "" Then
            TEXTJOIN = cl.Offset(0, 1) & ", " & cl.Offset(0, 2) & ", " & cl.Offset(0, 3) & ", " & cl.Offset(0, 4)
        Else
            TEXTJOIN = TEXTJOIN & Chr(10) & cl.Offset(0, 1) & ", " & cl.Offset(0, 2) & ", " & cl.Offset(0, 3) & ", " & cl.Offset(0, 4)
        End If
    End If
Next cl

End Function

在单元格H2中,您可以通过=TEXTJOINS($A$2:$A$11,G2)调用UDF并向下拖动。再次,确保选中了textwrapping列。

编辑:

根据OP的评论,这就是我如何正确显示数据的方式:

  • 选择列H,然后单击textwrap +顶部对齐,如以下屏幕截图所示:

enter image description here

  • 接下来,如果结果不正确,请选择所有单元格:

enter image description here

  • 双击列和行之间的线以将它们隔开以适合数据