Como realizar coloreo a números repetidos en secuencia
Como puedo colorear aquellos números que están repetidos en línea y además pintar en rojo aquellos números mayores de 10 en color rojo
1 Respuesta
Si aplicas el siguiente formato condicional, puedes colorear de rojo los valores mayores a 10.
Selecciona las celdas donde quieres aplicar el formato condicional y pon la siguiente fórmula:
=A1>10
Así se aprecia:
¿Para el color amarillo lo quieres en formato condicional o puede ser con macro?
Los números pintado en amarillo debe ser repetido pero en inversa digamos pintar el 324 o 423 o 432 el mismo numero pero invertido gracias
Te paso la macro para colorear los amarillos y también los rojos.
Entendiendo que los datos empiezan en la celda C1 y terminan en la columna AD. Que los datos de 3 números están en 3 columnas, separados por 2 columnas, luego 3 columnas y así sucesivamente, como se puede apreciar en la siguiente imagen:
Pueden crecer los datos hacia abajo. También pueden crecer los datos hacia la derecha, solamente ajusta la última columna en estas líneas:
lr = Range("C:AD").Find("*", , xlValues, xlPart, xlByRows, xlPrevious).Row Set rng = Range("C1:AD" & lr)
Pero si cambias de posición el dato inicial C1, entonces hay que realizar algunos ajustes en la macro.
Prueba y me comentas:
Sub colorearnumeros_2() 'Por Dante Amor Dim a As Variant, b As Variant, ky As Variant Dim i As Long, j As Long, k As Long, lr As Long Dim n As Long, m As Long, x As Long, y As Long Dim coltot As Long, fil As Long, col As Long Dim cad As String, coordenada As String Dim dic As Object Dim rng As Range, rngAma As Range, rngRojo As Range ' lr = Range("C:AD").Find("*", , xlValues, xlPart, xlByRows, xlPrevious).Row Set rng = Range("C1:AD" & lr) Set dic = CreateObject("Scripting.Dictionary") rng.Interior.Color = xlNone a = rng.Value coltot = Int(rng.Columns.Count / 5) + 1 ' ReDim b(1 To UBound(a, 1) * coltot, 1 To UBound(a, 2) * coltot) ' 'Almacena en un diccionario todos los números de tres en tres For j = 1 To UBound(a, 2) Step 5 For i = 1 To UBound(a, 1) If a(i, j) <> "" Then If a(i, j) > 10 Then _ If rngRojo Is Nothing Then Set rngRojo = Cells(i, j + 2) Else Set rngRojo = Union(rngRojo, Cells(i, j + 2)) If a(i, j + 1) > 10 Then _ If rngRojo Is Nothing Then Set rngRojo = Cells(i, j + 2 + 1) Else Set rngRojo = Union(rngRojo, Cells(i, j + 2 + 1)) If a(i, j + 2) > 10 Then _ If rngRojo Is Nothing Then Set rngRojo = Cells(i, j + 2 + 2) Else Set rngRojo = Union(rngRojo, Cells(i, j + 2 + 2)) ' cad = a(i, j) & "|" & a(i, j + 1) & "|" & a(i, j + 2) If Not dic.exists(cad) Then y = y + 1 dic(cad) = 1 & "|" & y & "|" & 1 Else x = Split(dic(cad), "|")(0) n = Split(dic(cad), "|")(1) m = Split(dic(cad), "|")(2) x = x + 1 dic(cad) = x & "|" & n & "|" & m End If x = Split(dic(cad), "|")(0) n = Split(dic(cad), "|")(1) m = Split(dic(cad), "|")(2) 'Alamcena en la matriz 'b' todas las coordenas (fila, columna) de los números b(n, m) = i & "|" & j m = m + 1 dic(cad) = x & "|" & n & "|" & m End If Next Next ' 'Revisa cuáles números (de 3) tienen duplicados For Each ky In dic.keys x = Split(dic(ky), "|")(0) If x > 1 Then 'si tiene duplicado, obtiene los datos del diccionario n = Split(dic(ky), "|")(1) m = Split(dic(ky), "|")(2) - 1 For j = 1 To m 'obtiene las coordenas de la matriz 'b' de las celdas a colorear coordenada = b(n, j) fil = Split(coordenada, "|")(0) col = Split(coordenada, "|")(1) + 2 If rngAma Is Nothing Then Set rngAma = Cells(fil, col).Resize(1, 3) Else Set rngAma = Union(rngAma, Cells(fil, col).Resize(1, 3)) End If Next End If Next 'colorea las celdas If Not rngAma Is Nothing Then rngAma.Interior.Color = vbYellow If Not rngRojo Is Nothing Then rngRojo.Interior.Color = vbRed End Sub
Los números pintado en amarillo debe ser repetido pero en inversa digamos pintar el 324 o 423 o 432 el mismo numero pero invertido gracias
Estas son nuevas reglas. Además la posición de los números en la segunda imagen no coincide con la posición de la primera imagen.
Tendrá que ser otra macro, ya que las reglas cambiaron.
Dante el código funciona perfectamente(el rango del código es el indicado) pero como puedo para que se ejecute en filas intermedias digamos que se ejecute en la fila 2, 4,6,8, hata la fila 200
Dante como puedo modificar el código para que se ejecute en filas intermedias
O sea desde la fila 2 a la fila 200 con la condición de numero invertido en amarillo y en la fila 3,5,7 hasta fila 201 con la condición de numero mayor que 10 en color rojo
Para que empiece en la fila 2, 4, 6 etc, hasta la última fila, cambia esta línea:
For i = 1 To UBound(a, 1)
Por esta:
For i = 2 To UBound(a, 1) step 2
Lo del color Rojo ya lo hace.
Lo del número invertido, quieres todas las combinaciones de 3 números:
1,2,3
1,3,2
2,1,3
2,3,1
3,1,2
3,2,1
Comentas...
Perfecto la condición del numero invertido, ahora solo falta colorear en rojo los números mayores de 10 en fila 3, 5,7,9, hasta 201
Que línea elimino para que no se marque la condición de color máximo en rojo del código y modificar este código para ejecutarlo aparte
sub color
dim celda as range
for each celda in sheets("hoja1").usedrange
if celda.value >10 then celda.interior.color = vbred
next celda
end sub
Más despacio, porque no te estoy entendiendo.
¿Los colores rojos solamente deben revisarse en las filas 3,5,7 etc?
¿Cuáles son los números invertidos que se deben revisar?
Exacto los colores rojos en fila 3,5 7, hasta 201 valores mayores a 10
El código de invertido funciona muy bien solo hacerle esa modificación
El código de invertido funciona muy bien solo hacerle esa modificación
No entiendo a qué te refieres con "código invertido"
¿Qué modificación necesitas?
Te expliqué, pero me parece que hay una confusión.
La combinación de 3 dígitos, por ejemplo: 1,2 y 3 tiene como resultado 6 combinaciones:
1,2,3
1,3,2
2,1,3
2,3,1
3,1,2
3,2,1
¿Quieres que la macro revise todas las combinaciones posibles de cada código?
Eso no estaba en tu pregunta original.
Te anexo el código para pintar el color rojo.
Sub colorearnumeros_2() 'Por Dante Amor Dim a As Variant, b As Variant, ky As Variant Dim i As Long, j As Long, k As Long, lr As Long Dim n As Long, m As Long, x As Long, y As Long, cTot As Long Dim cad As String, coordenada As String Dim dic As Object Dim rng As Range, rngAma As Range, rngRoj As Range ' lr = Range("C:AD").Find("*", , xlValues, xlPart, xlByRows, xlPrevious).Row + 1 Set rng = Range("C1:AD" & lr) Set dic = CreateObject("Scripting.Dictionary") rng.Interior.Color = xlNone a = rng.Value cTot = Int(rng.Columns.Count / 5) + 1 ' ReDim b(1 To UBound(a, 1) * cTot, 1 To UBound(a, 2) * cTot) ' 'Almacena en un diccionario todos los números de tres en tres For j = 1 To UBound(a, 2) Step 5 For i = 2 To UBound(a, 1) Step 2 'Revisar celdas mayor a 10 If a(i + 1, j) > 10 Then _ If rngRoj Is Nothing Then Set rngRoj = Cells(i + 1, j + 2) Else Set rngRoj = Union(rngRoj, Cells(i + 1, j + 2)) If a(i + 1, j + 1) > 10 Then _ If rngRoj Is Nothing Then Set rngRoj = Cells(i + 1, j + 2 + 1) Else Set rngRoj = Union(rngRoj, Cells(i + 1, j + 2 + 1)) If a(i + 1, j + 2) > 10 Then _ If rngRoj Is Nothing Then Set rngRoj = Cells(i + 1, j + 2 + 2) Else Set rngRoj = Union(rngRoj, Cells(i + 1, j + 2 + 2)) ' If a(i, j) <> "" Then cad = a(i, j) & "|" & a(i, j + 1) & "|" & a(i, j + 2) If Not dic.exists(cad) Then y = y + 1 dic(cad) = 1 & "|" & y & "|" & 1 Else x = Split(dic(cad), "|")(0) n = Split(dic(cad), "|")(1) m = Split(dic(cad), "|")(2) x = x + 1 dic(cad) = x & "|" & n & "|" & m End If x = Split(dic(cad), "|")(0) n = Split(dic(cad), "|")(1) m = Split(dic(cad), "|")(2) 'Alamcena en la matriz 'b' todas las coordenas (fila, columna) de los números b(n, m) = i & "|" & j m = m + 1 dic(cad) = x & "|" & n & "|" & m End If Next Next ' 'Revisa cuáles números (de 3) tienen duplicados For Each ky In dic.keys x = Split(dic(ky), "|")(0) If x > 1 Then 'si tiene duplicado, obtiene los datos del diccionario n = Split(dic(ky), "|")(1) m = Split(dic(ky), "|")(2) - 1 For k = 1 To m 'obtiene las coordenas de la matriz 'b' de las celdas a colorear coordenada = b(n, k) i = Split(coordenada, "|")(0) j = Split(coordenada, "|")(1) + 2 If rngAma Is Nothing Then _ Set rngAma = Cells(i, j).Resize(1, 3) Else Set rngAma = Union(rngAma, Cells(i, j).Resize(1, 3)) Next End If Next 'colorea las celdas If Not rngAma Is Nothing Then rngAma.Interior.Color = vbYellow If Not rngRoj Is Nothing Then rngRoj.Interior.Color = vbRed End Sub
Solo quiero que se ejecute el proceso de celda amarilla y eliminar el proceso de la celda roja (números >10)
Exacto los colores rojos en fila 3,5 7, hasta 201 valores mayores a 10
La macro ya pone los rojos para las filas: 3,5,7... tal y como lo indicaste.
Pero si ya no quieres los rojos, entonces simplemente elimina esta línea de la macro:
If Not rngRoj Is Nothing Then rngRoj.Interior.Color = vbRed
Listo dante elimine esta línea de código y queda perfecta la condición amarilla
If Not rngRoj Is Nothing Then rngRoj.Interior.Color = vbRed
pero ahora como coloreo las filas 3,5,7 hasta 201 de los colores mayores que 10
Cambia esta línea:
If a(i + 1, j) > 10 Then
Por esta:
For i = 2 To UBound(a, 1) - 1 Step 2
Regresa la línea:
If Not rngRoj Is Nothing Then rngRoj.Interior.Color = vbRed
Esa línea es para colorear el rojo
La macro pone rojos y amarillos.
Sub colorearnumeros_2() 'Por Dante Amor Dim a As Variant, b As Variant, ky As Variant Dim i As Long, j As Long, k As Long, lr As Long Dim n As Long, m As Long, x As Long, y As Long, cTot As Long Dim cad As String, coordenada As String Dim dic As Object Dim rng As Range, rngAma As Range, rngRoj As Range ' lr = Range("C:AD").Find("*", , xlValues, xlPart, xlByRows, xlPrevious).Row + 1 Set rng = Range("C1:AD" & lr) Set dic = CreateObject("Scripting.Dictionary") rng.Interior.Color = xlNone a = rng.Value cTot = Int(rng.Columns.Count / 5) + 1 ' ReDim b(1 To UBound(a, 1) * cTot, 1 To UBound(a, 2) * cTot) ' 'Almacena en un diccionario todos los números de tres en tres For j = 1 To UBound(a, 2) Step 5 For i = 2 To UBound(a, 1) - 1 Step 2 'Revisar celdas mayor a 10 If a(i + 1, j) > 10 Then _ If rngRoj Is Nothing Then Set rngRoj = Cells(i + 1, j + 2) Else Set rngRoj = Union(rngRoj, Cells(i + 1, j + 2)) If a(i + 1, j + 1) > 10 Then _ If rngRoj Is Nothing Then Set rngRoj = Cells(i + 1, j + 2 + 1) Else Set rngRoj = Union(rngRoj, Cells(i + 1, j + 2 + 1)) If a(i + 1, j + 2) > 10 Then _ If rngRoj Is Nothing Then Set rngRoj = Cells(i + 1, j + 2 + 2) Else Set rngRoj = Union(rngRoj, Cells(i + 1, j + 2 + 2)) ' If a(i, j) <> "" Then cad = a(i, j) & "|" & a(i, j + 1) & "|" & a(i, j + 2) If Not dic.exists(cad) Then y = y + 1 dic(cad) = 1 & "|" & y & "|" & 1 Else x = Split(dic(cad), "|")(0) n = Split(dic(cad), "|")(1) m = Split(dic(cad), "|")(2) x = x + 1 dic(cad) = x & "|" & n & "|" & m End If x = Split(dic(cad), "|")(0) n = Split(dic(cad), "|")(1) m = Split(dic(cad), "|")(2) 'Alamcena en la matriz 'b' todas las coordenas (fila, columna) de los números b(n, m) = i & "|" & j m = m + 1 dic(cad) = x & "|" & n & "|" & m End If Next Next ' 'Revisa cuáles números (de 3) tienen duplicados For Each ky In dic.keys x = Split(dic(ky), "|")(0) If x > 1 Then 'si tiene duplicado, obtiene los datos del diccionario n = Split(dic(ky), "|")(1) m = Split(dic(ky), "|")(2) - 1 For k = 1 To m 'obtiene las coordenas de la matriz 'b' de las celdas a colorear coordenada = b(n, k) i = Split(coordenada, "|")(0) j = Split(coordenada, "|")(1) + 2 If rngAma Is Nothing Then _ Set rngAma = Cells(i, j).Resize(1, 3) Else Set rngAma = Union(rngAma, Cells(i, j).Resize(1, 3)) Next End If Next 'colorea las celdas If Not rngAma Is Nothing Then rngAma.Interior.Color = vbYellow If Not rngRoj Is Nothing Then rngRoj.Interior.Color = vbRed End Sub
¿O cuál es el problema con los rojos?
Si me ayudas con una imagen y me aclaras cuál es el problema con los rojos.
- Compartir respuesta