excel - Concatenar datos de celda en otros datos si los valores coinciden
vba excel-vba (3)
Tengo dos
columns A and B
en la misma hoja de Excel.
Estoy intentando que si en la
Column B
coinciden dos valores, debería copiar el valor relacionado
A
en la misma fila.
Por ej.
Mesa
Column A Column B
xyz 1
abc 1
pqr 1
eee 2
qqq 3
www 4
oop 5
Salida deseada
column A Column B
xyz,abc,pqr 1
eee 2
qqq 3
www 4
oop 5
Probablemente podría usar una función definida por el usuario (también conocida como UDF) para esto. Pon esto en una hoja de módulo.
Public Function conditional_concat_strs(rSTRs As Range, rCRITs As Range, rCRIT As Range, Optional sDELIM As String = ", ")
Dim c As Long, sTMP As String
Set rSTRs = rSTRs.Cells(1, 1).Resize(rCRITs.Rows.Count, rCRITs.Columns.Count)
For c = 1 To rCRITs.Cells.Count
If rCRITs(c).Value2 = rCRIT Then _
sTMP = sTMP & rSTRs(c).Value & sDELIM
Next c
conditional_concat_strs = Left(sTMP, Application.Max(Len(sTMP) - Len(sDELIM), 0))
End Function
Usar como cualquier función de hoja de trabajo nativa.
También hay una solución de fórmula para esto (con columnas auxiliares):
Suponiendo que los datos son la columna A: B ...
-
En C1 escriba esta fórmula:
=IF(A1<>A2,B2,D1&","&B2)
-
En D1 escriba esta fórmula:
=IF(A2<>A3,A2,"")
- Filtre en la columna D los espacios en blanco y luego elimine las celdas visibles.
También puedes usar este:
Public Sub combine()
Dim row, result, lastRow As Integer
Dim isExist As Boolean
With Sheets("sheetname")
''get the last use row
lastRow = .Range("A1").SpecialCells(xlCellTypeLastCell).row
''Loop from row 1 to last row
For row = 1 To lastRow Step 1
''set the start row for result.
result = 1
''Reset flag
isExist = False
''Loop result count column until blank
Do While .Range("F" & result) <> ""
''check count
If .Range("B" & row) = .Range("F" & result) Then
isExist = True
''If old, combine
.Range("E" & result) = .Range("E" & result) & "," & .Range("A" & row)
Exit Do
End If
''increase row
result = result + 1
Loop
''If new, add new record
If Not isExist Then
.Range("E" & result) = .Range("A" & row)
.Range("F" & result) = .Range("B" & row)
End If
Next row
End With
End Sub
Aquí, pruebas de prueba para mi código:
Usé la
column A & B
como entrada y la
column E & F
como salida.
Si hay algún problema, avíseme.