• Empleos
  • Sobre nosotros
  • profesionales
    • Inicio
    • Empleos
    • Cursos y retos
    • Preguntas
    • Profesores
  • empresas
    • Inicio
    • Publicar vacante
    • Nuestro proceso
    • Precios
    • Pruebas Online
    • Nómina
    • Blog
    • Comercial
    • Calculadora de salario

0

153
Vistas
Compara dos celdas y muestra los cambios en otra celda

Estoy tratando de comparar dos oraciones en diferentes celdas y mostrar la diferencia en rojo.

Mi código está comparando la posición de cada letra. Cuando encuentra una diferencia, la muestra en rojo, lo cual está bien.

El problema es que si se cambia una palabra por otra con diferente número de letras, el resto de la frase también aparece en rojo.

Como ejemplo:

ingrese la descripción de la imagen aquí

En esta imagen puedes ver que después de encontrar una palabra, el resto de las palabras también aparecen como diferentes aunque sean iguales.

Este es el código que estoy usando actualmente:

 Sub Compare() For i = 1 To Len(ActiveSheet.Range("F1").Value) If (ActiveSheet.Range("F1").Characters(i, 1).Text <> ActiveSheet.Range("G1").Characters(i, 1).Text) Then ActiveSheet.Range("F1").Characters(i, 1).Font.Color = RGB(255, 0, 0) End If Next i End Sub

Además, este código solo funciona en la celda seleccionada. ¿Cómo puedo hacer que funcione con toda la columna (F y G)?

almost 3 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Comparar palabras en dos celdas

  • Apenas probado.
 Option Explicit Sub CompareTwoCellsTEST() Dim ws As Worksheet: Set ws = ActiveSheet ' improve! CompareTwoCells ws.Range("A1"), ws.Range("B1") End Sub Sub CompareTwoCells(ByVal ChangeCell As Range, ByVal CompareCell As Range) Dim Change() As String: Change = Split(CStr(ChangeCell.Value)) Dim Compare() As String: Compare = Split(CStr(CompareCell.Value)) Dim n As Long Dim Pos As Long Dim ch As Long Dim ErrNum As Long Dim sChange As String Dim sCompare As String For n = 0 To UBound(Change) sChange = Change(n) On Error Resume Next sCompare = Compare(n) On Error GoTo 0 If Len(sCompare) > 0 Then If StrComp(sChange, sCompare, vbBinaryCompare) <> 0 Then For ch = 1 To Len(sChange) If ErrNum = 0 Then On Error Resume Next If Mid(sChange, ch, 1) <> Mid(sCompare, ch, 1) Then ChangeCell.Characters(Pos + ch, 1) _ .Font.Color = vbRed End If ErrNum = Err.Number On Error GoTo 0 Else ChangeCell.Characters(Pos + ch, 1).Font.Color = vbRed End If Next ch ErrNum = 0 End If sCompare = vbNullString End If Pos = Pos + Len(sChange) + 1 Next n End Sub
almost 3 years ago · Santiago Trujillo Denunciar

0

Como se sugiere en los comentarios, la función Split aquí es tu amiga:

función dividida

prueba este código:

 Sub test() Dim ControlActual As Variant Dim ControlAntiguo As Variant Dim i As Long Dim j As Long Dim k As Long Dim AcumuladoControlActual As Long Dim AcumuladoControlAntiguo As Long i = 4 'starting row of data Do Until Range("A" & i).Value = "" ControlActual = Split(Range("A" & i).Value, " ") ControlAntiguo = Split(Range("B" & i).Value, " ") AcumuladoControlActual = 0 AcumuladoControlAntiguo = 0 For j = LBound(ControlActual) To UBound(ControlActual) Step 1 k = 1 Do Until k > Len(ControlActual(j)) And k > Len(ControlAntiguo(j)) If Mid(ControlActual(j), k, 1) <> Mid(ControlAntiguo(j), k, 1) Then If k <= Len(ControlActual(j)) Then Range("A" & i).Characters(AcumuladoControlActual + k, 1).Font.Color = RGB(255, 0, 0) If k <= Len(ControlAntiguo(j)) Then Range("B" & i).Characters(AcumuladoControlAntiguo + k, 1).Font.Color = RGB(255, 0, 0) End If k = k + 1 Loop AcumuladoControlActual = AcumuladoControlActual + Len(ControlActual(j)) + 1 AcumuladoControlAntiguo = AcumuladoControlAntiguo + Len(ControlAntiguo(j)) + 1 Next j i = i + 1 Loop End Sub

ingrese la descripción de la imagen aquí

De todos modos, esto funcionará correctamente solo si ambas frases tienen la misma cantidad de palabras y en el mismo orden esperado. Frases totalmente diferentes pueden producir resultados extraños.

almost 3 years ago · Santiago Trujillo Denunciar

0

Este código más o menos hace el truco. Muestra dónde las palabras son iguales encadenando su color al verde. De esta manera puedes diferenciar entre las palabras que son iguales (color verde) y las que son diferentes (color estándar).

Espero que esto ayude a cualquiera que haya tenido el mismo problema que el mío.

 Sub find_differences() Dim xStr() As String Dim i As Long Dim x As Long, y As Long With ActiveSheet For i = 3 To .Cells(.Rows.Count, "G").End(xlUp).Row xStr = Split(.Cells(i, "G").Value, " ") xStrH = Split(.Cells(i, "H").Value, " ") With .Cells(i, "H") .Font.ColorIndex = 1 For x = LBound(xStr()) To UBound(xStr()) For y = 1 To Len(.Text) If Mid(.Text, y, Len(xStr(x))) = xStr(x) Then .Characters(y, Len(xStr(x))).Font.ColorIndex = 4 End If Next y Next x End With Next i End With End Sub
almost 3 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Nuestro proceso Comercial
Legal
Términos y condiciones Política de privacidad
© 2025 PeakU Inc. All Rights Reserved.

Andres GPT

Recomiéndame algunas ofertas
Necesito ayuda