excel vba excel-vba

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.