/ / Comparar columnas usando la macro de VBA - excel, vba, excel-vba

Compare columnas usando VBA Macro - Excel, vba, excel-vba

Quiero insertar el correspondiente Column C valores en Column D cuando la columna A y el valor de la columna B coinciden.

Por ejemplo:

La columna A2 es igual a la columna B2, ahora el valor de la columna C2 se publica en la columna D2

O

La columna A7 es igual a la columna B3, luego el valor de la columna C3 se publica en la columna D3

Para más detalles, vea la captura de pantalla para que tenga una idea de lo que estoy tratando de hacer.

[Por favor, haga clic para ver la captura de pantalla] [1]

El código que estoy intentando está debajo pero no funciona correctamente, solo da un valor de celda:

Private Sub ForComparing_Click()

Dim ws As Worksheet
Dim cel As Range
Dim lastRowA As Long, lastRowB As Long, lastRowC As Long

Set ws = ThisWorkbook.Sheets("Sheet1")

With ws
lastRowA = .Cells(.Rows.Count, "A").End(xlUp).Row "last row of column A
lastRowB = .Cells(.Rows.Count, "B").End(xlUp).Row "last row of column B
lastRowC = .Cells(.Rows.Count, "C").End(xlUp).Row "last row of column C
For Each cel In .Range("A2:A" & lastRowA)   "loop through column A
"check if cell in column A exists in column B
If WorksheetFunction.CountIf(.Range("B2:B" & lastRowB), cel) = 0 Then
.Range("D" & cel.Row) = "No Match"
Else
.Range("D" & cel.Row) = .Range("C" & cel.Row)
End If
Next
End With

End Sub

Editado 1:

Por favor vea la salida de este código a continuación: Haga clic aquí para ver la captura de pantalla

Column A3 debería comparar con Column B5 porque el valor D es igual en este caso, y luego debería imprimir Column C5 valor para Column D3

Además, debe dar valor en Column D por cada valor de Column A pero se detiene después de los primeros 4 valores.

Gracias por tu tiempo.

Editado 2:

Por favor, vea la captura de pantalla

Lo que acaba de editar está perfectamente correcto, pero quiero hacer esto para cada uno Column A valor.

Quiero comparar cada Column A valor con Column B y luego correspondiente Column C el valor se copia en Column D.

Respuestas

3 para la respuesta № 1

Prueba esto

Option Explicit

Sub Demo()
Dim ws As Worksheet
Dim cel As Range
Dim lastRowA As Long, lastRowB As Long

Set ws = ThisWorkbook.Sheets("Sheet2")

With ws
lastRowA = .Cells(.Rows.Count, "A").End(xlUp).Row "last row of column A
lastRowB = .Cells(.Rows.Count, "B").End(xlUp).Row "last row of column B
For Each cel In .Range("A1:A" & lastRowA)   "loop through column A
"check if cell in column A exists in column B
If WorksheetFunction.CountIf(.Range("B1:B" & lastRowB), cel) = 0 Then
.Range("C" & cel.Row) = "No Match"
Else
.Range("C" & cel.Row) = cel & " has match in column B"
End If
Next
End With
End Sub

EDITAR:

Option Explicit

Sub Demo()
Dim ws As Worksheet
Dim cel As Range, rngC As Range, rngB As Range
Dim lastRowA As Long, lastRowB As Long

Set ws = ThisWorkbook.Sheets("Sheet1")

With ws
lastRowA = .Cells(.Rows.Count, "A").End(xlUp).Row "last row of column A
lastRowB = .Cells(.Rows.Count, "B").End(xlUp).Row "last row of column B
For Each cel In .Range("A2:A" & lastRowB)   "loop through column B
"check if cell in column A exists in column B
If WorksheetFunction.CountIf(.Range("A2:A" & lastRowB), cel) = 0 Then
.Range("D" & cel.Row) = "No Match"
Else
.Range("D" & cel.Row) = Application.WorksheetFunction.Index(.Range("C2:C" & lastRowB), Application.WorksheetFunction.Match(cel, .Range("B2:B" & lastRowB), 0), 1)
End If
Next
End With
End Sub

Ver imagen para referencia.

enter image description here

Sin embargo, todavía tengo dudas sobre lo que estás intentando lograr. Estás comparando solo los primeros 4 valores de la columna A, como lo mencionaste en la pregunta "pero se detiene después de los primeros 4 valores". Sin embargo, según mi solución coincidirá con 4 filas de Column A a Column B y si coincide entonces correspondiente Column C los valores se mostrarán en Column D. Si no hay partido entonces Column D mostrará No Match.


0 para la respuesta № 2
Sub compare()
Dim i As Integer
i = 1

Do While Cells(i, "A").Value <> ""
If Cells(i, "A").Value <> Cells(i, "B").Value Then
Cells(i, "C").Value = "No Match"
Else
Cells(i, "C").Value = "Match"
End If


i = i + 1
Loop

End Sub

Declarar un contador (i) y luego establezca un bucle para iterar a través de la Columna A. El bucle continuará hasta que se encuentre una celda en la columna A que está en blanco.

Dentro del bucle, para cada fila, compara las 2 celdas respectivas y cambias el valor de la celda en la Columna C. Finalmente agregas 1 a i en cada iteración del bucle para que pase por cada fila.

Un enfoque más fácil es sin VBA usando la siguiente fórmula:

=IF(A1=B1,"Match", "No Match")