modificar codigo para resaltar en 3 celdas en linea

dragonfire33

Board Regular
Joined
Oct 7, 2021
Messages
90
Office Version
  1. 365
Platform
  1. Windows
hola buenas como puedo agregarle a este codigo para que se resalte la coincidencia en 3 celdas en linea tanto vertical como horizontal en todas las celdas del rango,
VBA Code:
Sub recorre2()'el arreglo seria en este codigo
Application.ScreenUpdating = False


Dim Rango As Range
Set Rango = Range("E1:" & UltimaColumna & UltimaFila)

For Each rg In Rango                      ' recorre el rango
 If rg <> "" Then
  For i = 1 To 4                          ' comprueba derecha
   If rg.Offset(0, i) <> "" Then          ' si la celda no esta vacia
    tinta = Comprueba(rg.Value, rg.Offset(0, i))
     If tinta <> 0 Then
      coloreacelda rg.Address, tinta            ' colorea la celda inicial
    coloreacelda rg.Offset(0, i).Address, tinta ' colorea la celda final
     End If
   End If
  Next
  
 For i = 1 To 4                           ' comprueba abajo
   If rg.Offset(i, 0) <> "" Then          ' si la celda no esta vacia
    
    tinta = Comprueba(rg.Value, rg.Offset(i, 0))
    If tinta <> 0 Then
    
     coloreacelda rg.Address, tinta             ' colorea la celda inicial
     coloreacelda rg.Offset(i, 0).Address, tinta ' colorea la celda final
    End If
    
   End If
  Next
  
 End If
Next

Application.ScreenUpdating = True
End Sub
Function Comprueba(Num1 As String, Num2 As String) As Integer
Dim n1(3) As Variant
Dim n2(3) As Variant


For i = 0 To 3                    ' llena los arrays numero a numero
 n1(i) = Mid(Num1, i + 1, 1)
 n2(i) = Mid(Num2, i + 1, 1)
Next

If n1(0) = n2(0) And n1(1) = n2(1) Then Comprueba = 1: Exit Function 'dos primeras
If n1(1) = n2(1) And n1(2) = n2(2) Then Comprueba = 2: Exit Function 'dos del centro
If n1(2) = n2(2) And n1(3) = n2(3) Then Comprueba = 3: Exit Function 'dos ultimas

If n1(1) = n2(1) And n1(3) = n2(3) Then Comprueba = 4: Exit Function 'segunda y cuarta
If n1(0) = n2(0) And n1(3) = n2(3) Then Comprueba = 5: Exit Function 'primera y cuarta
If n1(0) = n2(0) And n1(2) = n2(2) Then Comprueba = 6: Exit Function 'primera y tercera

Comprueba = 0

End Function
Sub coloreacelda(cl As String, color As Variant)
Dim celda As Range
Set celda = Range(cl)

'esta linea hace que mantenga el color asignado
'anteriormente en caso de duplicidad de coincidencia
If celda.Font.color <> vbBlack Then Exit Sub

Select Case color
Case 1
 pinta = RGB(126, 126, 23) 'amarillo
Case 2
 pinta = RGB(2, 80, 28)    'verde
Case 3
 pinta = RGB(160, 11, 97)  'morado
Case 4, 5, 6
 pinta = vbRed             'rojo

End Select

     celda.Font.color = pinta                         ' color del texto
     
     
     celda.Interior.color = RGB(208, 205, 258)        ' color interior de la celda
   
     
End Sub
Function UltimaColumna() ' busca la ultima columna, fila ocupada
    Dim rg As Range
    Set rg = Cells.Find(What:="*", _
        After:=Cells(1, 1), _
        LookAt:=xlPart, _
        LookIn:=xlFormulas, _
        SearchOrder:=xlByColumns, _
        SearchDirection:=xlPrevious, _
        MatchCase:=False)
   If Not rg Is Nothing Then
     UltimaColumna = Split(rg.Address, "$")(1)
   Else
     UltimaColumna = "z1"
   End If

End Function
Function UltimaFila()
    Dim rg As Range
    Set rg = Cells.Find(What:="*", _
        After:=Cells(1, 1), _
        LookAt:=xlPart, _
        LookIn:=xlFormulas, _
        SearchOrder:=xlByRows, _
        SearchDirection:=xlPrevious, _
        MatchCase:=False)
    
    If Not rg Is Nothing Then
     UltimaFila = rg.Row
    Else
     UltimaFila = 1
    End If
End Function
 

Excel Facts

Formula for Yesterday
Name Manager, New Name. Yesterday =TODAY()-1. OK. Then, use =YESTERDAY in any cell. Tomorrow could be =TODAY()+1.
Prueba lo siguiente para empezar, tal vez es lo que necesitas:

VBA Code:
Sub Colorea3Celdas()
  Dim r As Range, celda As Range
  Dim lr%, lc%, i%, j%
 
  Set celda = Range("E1")
  lr = Cells.Find("*", , xlValues, , xlByRows, xlPrevious).Row
  lc = Cells.Find("*", , xlValues, , xlByColumns, xlPrevious).Column
  Range(celda, Cells(lr, lc)).Interior.color = xlNone
 
  For i = celda.Row To lr
    For j = celda.Column To lc
      Set r = Cells(i, j)
      If r = r.Offset(0, 1) And r = r.Offset(0, 2) Then r.Resize(1, 3).Interior.color = vbYellow
      If r = r.Offset(1, 0) And r = r.Offset(2, 0) Then r.Resize(3, 1).Interior.color = vbRed
    Next
  Next
End Sub

Resultado:
Dante Amor
AEFGHIJKLMNO
188825559810
268691510795
31871456992
47397697961
56935555547
6349107610273
782101052101810
869310436331
964810455111
10610675891021
11
Hoja1


Pero...

Te falta definir cómo quedaría:
- Si en la misma línea (horizontal o vertical) tiene más de 3 números iguales.
- Si en el cruce de horizontal o vertical ya existe un color

;)
 
Upvote 0
Dante los números son de 4 cifras en cada celda y el código que tengo ejecuta la comparación de las seis coincidencias q existen dos primeras, dos últimas, dos del centro , etc..., Y resalta dichas coincidencias en un rango no mayor a 5 celdas tanto en vertical como en horizontal y lo que hay que agregarle es que si existe esa coincidencia de dos últimas en uno de los casos en línea vertical o horizontal tres veces o más se resalten esas celdas eso si cumpliendo la distancia no mayor a 5 celdas de celda a celda
 
Upvote 0
Puedes explicarlo con ejemplos.
Qué tienes y qué esperas de resultado después de ejecutar la macro.
 
Upvote 0
Dante sería algo como la imagen
 

Attachments

  • Screenshot_20240807-153850.png
    Screenshot_20240807-153850.png
    159.7 KB · Views: 14
Upvote 0
Y podrías explicar los ejemplos de la imagen, de esa manera será más fácil ayudarte.
Recuerda poner la imagen antes de la macro y también la imagen con el resultado esperado.

🧙‍♂️
 
Upvote 0
Maestro dante el código resalta aquellas celdas que tienen una coincidencia en comun como las dos primeras, dos últimas, dos centro, etc..y la idea es que se resalte las celdas como se muestra en la primera fila con color verde cuando esa coincidencia se repite 3 veces en una distancia no mayor a 5 celdas de celda a celda donte este esa coincidencia tanto en horizontal como en vertical

VBA Code:
        Sub recorre2()'el arreglo seria en este codigo
Application.ScreenUpdating = False


Dim Rango As Range
Set Rango = Range("E1:" & UltimaColumna & UltimaFila)

For Each rg In Rango                      ' recorre el rango
If rg <> "" Then
For i = 1 To 4                          ' comprueba derecha
If rg.Offset(0, i) <> "" Then          ' si la celda no esta vacia
tinta = Comprueba(rg.Value, rg.Offset(0, i))
If tinta <> 0 Then
coloreacelda rg.Address, tinta            ' colorea la celda inicial
coloreacelda rg.Offset(0, i).Address, tinta ' colorea la celda final
End If
End If
Next
 
For i = 1 To 4                           ' comprueba abajo
If rg.Offset(i, 0) <> "" Then          ' si la celda no esta vacia
 
tinta = Comprueba(rg.Value, rg.Offset(i, 0))
If tinta <> 0 Then
 
coloreacelda rg.Address, tinta             ' colorea la celda inicial
coloreacelda rg.Offset(i, 0).Address, tinta ' colorea la celda final
End If
 
End If
Next
 
End If
Next

Application.ScreenUpdating = True
End Sub
Function Comprueba(Num1 As String, Num2 As String) As Integer
Dim n1(3) As Variant
Dim n2(3) As Variant


For i = 0 To 3                    ' llena los arrays numero a numero
n1(i) = Mid(Num1, i + 1, 1)
n2(i) = Mid(Num2, i + 1, 1)
Next

If n1(0) = n2(0) And n1(1) = n2(1) Then Comprueba = 1: Exit Function 'dos primeras
If n1(1) = n2(1) And n1(2) = n2(2) Then Comprueba = 2: Exit Function 'dos del centro
If n1(2) = n2(2) And n1(3) = n2(3) Then Comprueba = 3: Exit Function 'dos ultimas

If n1(1) = n2(1) And n1(3) = n2(3) Then Comprueba = 4: Exit Function 'segunda y cuarta
If n1(0) = n2(0) And n1(3) = n2(3) Then Comprueba = 5: Exit Function 'primera y cuarta
If n1(0) = n2(0) And n1(2) = n2(2) Then Comprueba = 6: Exit Function 'primera y tercera

Comprueba = 0

End Function
Sub coloreacelda(cl As String, color As Variant)
Dim celda As Range
Set celda = Range(cl)

'esta linea hace que mantenga el color asignado
'anteriormente en caso de duplicidad de coincidencia
If celda.Font.color <> vbBlack Then Exit Sub

Select Case color
Case 1
pinta = RGB(126, 126, 23) 'amarillo
Case 2
pinta = RGB(2, 80, 28)    'verde
Case 3
pinta = RGB(160, 11, 97)  'morado
Case 4, 5, 6
pinta = vbRed             'rojo

End Select

celda.Font.color = pinta                         ' color del texto
   
   
celda.Interior.color = RGB(208, 205, 258)        ' color interior de la celda
 
   
End Sub
Function UltimaColumna() ' busca la ultima columna, fila ocupada
Dim rg As Range
Set rg = Cells.Find(What:="*", _
After:=Cells(1, 1), _
LookAt:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByColumns, _
SearchDirection:=xlPrevious, _
MatchCase:=False)
If Not rg Is Nothing Then
UltimaColumna = Split(rg.Address, "$")(1)
Else
UltimaColumna = "z1"
End If

End Function
Function UltimaFila()
Dim rg As Range
Set rg = Cells.Find(What:="*", _
After:=Cells(1, 1), _
LookAt:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, _
MatchCase:=False)
 
If Not rg Is Nothing Then
UltimaFila = rg.Row
Else
UltimaFila = 1
End If
End Function
 

Attachments

  • Screenshot_20240807-164714.png
    Screenshot_20240807-164714.png
    89.6 KB · Views: 29
Upvote 0
Maestro Dante envío imágenes del antes y después del código y libro explicando cómo debe ser el resultado gracias
 

Attachments

  • Screenshot_20240813-162026.png
    Screenshot_20240813-162026.png
    73.8 KB · Views: 15
  • Screenshot_20240813-162105.png
    Screenshot_20240813-162105.png
    76.2 KB · Views: 7
Upvote 0
Hola Dragon.
En esta ocasión no te podré ayudar, ya que sigo sin entender qué necesitas.

Tus ejemplos no coinciden con tu explicación, por ejemplo:
y la idea es que se resalte las celdas como se muestra en la primera fila con color verde cuando esa coincidencia se repite 3 veces en una distancia no mayor a 5 celdas de celda a celda
1723730619796.png


Entonces para entender, quieres comparar las posiciones 1-2, 1-3, 1-4, 2-3, 3-4 y 3-4, de manera vertical y horizontal.
Resaltar el fondo gris y el color del font siempre que existan 3 veces.

Duda: si existen más de 3 veces, también se aplica el formato?


Espero tus comentarios.
 
Upvote 0
Exacto experto Dante en vertical la distancia es de 6 y en horizontal de 4 celda a celda, solo se resaltarán 3 celdas en línea o más de 3 , el codigo anterior realiza el resalte pero comete el error de resaltar las dos celdas y así no me sirve
 
Upvote 0

Forum statistics

Threads
1,223,885
Messages
6,175,187
Members
452,616
Latest member
intern444

We've detected that you are using an adblocker.

We have a great community of people providing Excel help here, but the hosting costs are enormous. You can help keep this site running by allowing ads on MrExcel.com.
Allow Ads at MrExcel

Which adblocker are you using?

Disable AdBlock

Follow these easy steps to disable AdBlock

1)Click on the icon in the browser’s toolbar.
2)Click on the icon in the browser’s toolbar.
2)Click on the "Pause on this site" option.
Go back

Disable AdBlock Plus

Follow these easy steps to disable AdBlock Plus

1)Click on the icon in the browser’s toolbar.
2)Click on the toggle to disable it for "mrexcel.com".
Go back

Disable uBlock Origin

Follow these easy steps to disable uBlock Origin

1)Click on the icon in the browser’s toolbar.
2)Click on the "Power" button.
3)Click on the "Refresh" button.
Go back

Disable uBlock

Follow these easy steps to disable uBlock

1)Click on the icon in the browser’s toolbar.
2)Click on the "Power" button.
3)Click on the "Refresh" button.
Go back
Back
Top