Como "concatenar" datos de varias celdas en una celda con VBA?

Tengo un listado donde están varios proveedores con las familias de productos asignadas (Familia)

Como se puedes "concatenar" (no se si es el termino correcto) en una sola celda las Familias asignadas al Proveedor, que el resultado sea algo así:

Respuesta
2

Si tienes la versión 365 de excel, puedes utilizar la siguiente función:

Versión en español:

=UNIRCADENAS(", ";1;SI(C2:C10=I2;D2:D10;""))

Versión en inglés:

=TEXTJOIN(", ";1;IF(C2:C10=I2;D2:D10;""))

Resultado:


También te paso el código de una UDF

Function ConcatenarProv(separador As String, rango1 As Range, valor As Variant, rango2 As Range)
  Dim cad As String
  Dim c As Range
  For Each c In rango1
    If LCase(c.Value) = LCase(valor) Then
      cad = cad & rango2.Cells(c.Row, 1) & separador
    End If
  Next
  If cad <> "" Then ConcatenarProv = Left(cad, Len(cad) - 2)
End Function

Sigue las Instrucciones para una Función UDF

  1. Abre tu libro de excel
  2. Para abrir VBa y poder pegar la función, Presiona Alt + F11
  3. En el menú elige Insertar / Módulo
  4. En el panel del lado derecho copia la función
  5. En cualquier celda utiliza la función, como cualquier otra función de excel

Ejemplo:

=ConcatenarProv(", ";C2:C10;I2;D2:D10)


Comenta cualquier duda. No olvides valorar.

Nota: En mis ejemplos estoy utilizando punto y coma ( ; ) como separador de argumentos. Cambia a coma (, ) si es el que utilizas.

¡Gracias!  Dante

Saludos Dante, sabes porque en el caso de la función ConcatenarProv da como resultado la celda del lado derecho y abajo del proveedor correcto, en el ejemplo que hiciste da como resulta A98.

Gracias. 

Perdona, es un error mío.

La situación es que debí a empezar a contar donde empieza el rango y estaba contando desde la fila 1.

Prueba con el siguiente código

Function ConcatenarProv(separador As String, rango1 As Range, valor As Variant, rango2 As Range)
  Dim cad As String
  Dim c As Range
  Dim n, ini As Long
  ini = rango2.Cells(1).Row
  For Each c In rango1
    If LCase(c.Value) = LCase(valor) Then
      n = c.Row - ini + 1
      cad = cad & rango2.Cells(n, 1) & separador
    End If
  Next
  If cad <> "" Then ConcatenarProv = Left(cad, Len(cad) - 2)
End Function

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas