Home » excel » vba – excel vlookup multiple rows into one cell

vba – excel vlookup multiple rows into one cell

Posted by: admin May 14, 2020 Leave a comment

Questions:

I would like to get the data from several rows from one sheet sheet1 into a single cell on another sheet sheet2 based on a lookup.

For example there is data on one sheet :

sheet1

And I would like to lookup data based on id and return all the concerning rows into one cell like this:

sheet2

Is that possible with an excel formula or is this only solvable with VBA?

Thank you for your help in advance.

I found a vba that came close to a solution but didn’t work. I’ve looked at “index, match” functions “small” functions but could find a solution that puts data into a single cell…

This is the vba code I found that came close to solution:

'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'

the vba threw value or compile errors.. it looks like it only returns values from one vertical column

How to&Answers:

“Is that possible with an excel formula or is this only solvable with VBA?”

It sure is possible through formula, but you’ll have to have access to the TEXTJOIN function:

enter image description here

Formula in 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,""))

Note: It’s an array formula and need to be confirmed through CtrlShiftEnter

Drag the formula down and make sure you got textwrap selected on column H.

No access to TEXTJOIN? You can always create your own, for example:

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

In cell H2 you can call the UDF through =TEXTJOINS($A$2:$A$11,G2) and drag down. Again, make sure textwrapping is checked for the column.

EDIT:

As per OP’s comment, this is how I got the data to show correctly:

  • Select column H and click textwrap + top alignment as shown in this screenshot:

enter image description here

  • Next, select all cells if result is not correct yet:

enter image description here

  • Double-click the line between columns and rows to space them to fit the data