Realizar pintado a combinaciones numéricas en hoja excel
Para dante:
Como puedo realizar en el código el pintado de las combinaciones numéricas 123, 321, 132, 312, etc.
1 respuesta
Te paso la macro actualizada para poner todas las combinaciones de 3 números.
Sub colorearnumeros_4() '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 m As Long, n As Long, x As Long, y As Long, cTot As Long Dim cad As String, coordenada As String Dim dic1 As Object, dic2 As Object Dim rng As Range, rngAma As Range, rngRoj As Range ' lr = Range("C:AD").Find("*", , xlValues, xlPart, xlByRows, xlPrevious).Row Set rng = Range("C1:AD" & lr) Set dic1 = CreateObject("Scripting.Dictionary") Set dic2 = CreateObject("Scripting.Dictionary") Set rngAma = Cells(1, 3) Set rngRoj = Cells(1, 3) 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 + 0) > 10 Then Set rngRoj = Union(rngRoj, Cells(i + 1, j + 2 + 0)) If a(i + 1, j + 1) > 10 Then Set rngRoj = Union(rngRoj, Cells(i + 1, j + 2 + 1)) If a(i + 1, j + 2) > 10 Then Set rngRoj = Union(rngRoj, Cells(i + 1, j + 2 + 2)) ' If a(i, j) <> "" Then For w = 1 To 6 'combinaciones de 3 números Select Case w Case 1: cad = a(i, j + 0) & "|" & a(i, j + 1) & "|" & a(i, j + 2) Case 2: cad = a(i, j + 0) & "|" & a(i, j + 2) & "|" & a(i, j + 1) Case 3: cad = a(i, j + 1) & "|" & a(i, j + 0) & "|" & a(i, j + 2) Case 4: cad = a(i, j + 1) & "|" & a(i, j + 2) & "|" & a(i, j + 0) Case 5: cad = a(i, j + 2) & "|" & a(i, j + 0) & "|" & a(i, j + 1) Case 6: cad = a(i, j + 2) & "|" & a(i, j + 1) & "|" & a(i, j + 0) End Select ' coordenada = i & "|" & j If Not dic1.exists(cad) Then y = y + 1 dic1(cad) = 1 & "|" & y & "|" & 1 dic2(coordenada) = Empty Else If Not dic2.exists(coordenada) Then x = Split(dic1(cad), "|")(0) n = Split(dic1(cad), "|")(1) m = Split(dic1(cad), "|")(2) x = x + 1 dic1(cad) = x & "|" & n & "|" & m End If End If x = Split(dic1(cad), "|")(0) n = Split(dic1(cad), "|")(1) m = Split(dic1(cad), "|")(2) 'Alamcena en la matriz 'b' todas las coordenas (fila, columna) de los números b(n, m) = coordenada m = m + 1 dic1(cad) = x & "|" & n & "|" & m Next End If Next Next ' 'Revisa cuáles números (de 3) tienen duplicados For Each ky In dic1.keys x = Split(dic1(ky), "|")(0) If x > 1 Then 'si tiene duplicado, obtiene los datos del diccionario n = Split(dic1(ky), "|")(1) m = Split(dic1(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 Set rngAma = Union(rngAma, Cells(i, j).Resize(1, 3)) Next End If Next 'colorea las celdas rngAma.Interior.Color = vbYellow rngRoj.Interior.Color = vbRed Cells(1, 3).Interior.Color = xlNone End Sub
b(n, m) = coordenada
Ayudaría mucho si, cuando te aparece un mensaje de error, comentas:
- En cuál línea se detiene la macro,
- Qué dice el mensaje de error
- Si acercas el mouse a las variables y puedes ver qué valor tiene cada variable y escribes aquí, por ejemplo, qué valor tiene la variable n, qué valor tiene la variable m, qué valor tiene la variable coordenada.
- La variable coordenada está compuesta por la variable i y la variable j, qué valor tiene i y qué valor tiene j
- Qué dato tienes en la celda de fila i y columna j
Solamente es un ejemplo de lo que necesito para rastrear el problema y encontrar una solución.
Hice un par de ajustes a la macro colorearnumeros_5, para considerar si el último registro termina en una fila par o una fila non.
Sub colorearnumeros_5() '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, w As Long Dim m As Long, n As Long, x As Long, y As Long, cTot As Long Dim cad As String, coordenada As String Dim dic1 As Object, dic2 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 dic1 = CreateObject("Scripting.Dictionary") Set dic2 = CreateObject("Scripting.Dictionary") Set rngAma = Cells(1, 3) Set rngRoj = Cells(1, 3) 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 + 0) > 10 Then Set rngRoj = Union(rngRoj, Cells(i + 1, j + 2 + 0)) If a(i + 1, j + 1) > 10 Then Set rngRoj = Union(rngRoj, Cells(i + 1, j + 2 + 1)) If a(i + 1, j + 2) > 10 Then Set rngRoj = Union(rngRoj, Cells(i + 1, j + 2 + 2)) ' If a(i, j) <> "" Then For w = 1 To 6 'combinaciones de 3 números Select Case w Case 1: cad = a(i, j + 0) & "|" & a(i, j + 1) & "|" & a(i, j + 2) Case 2: cad = a(i, j + 0) & "|" & a(i, j + 2) & "|" & a(i, j + 1) Case 3: cad = a(i, j + 1) & "|" & a(i, j + 0) & "|" & a(i, j + 2) Case 4: cad = a(i, j + 1) & "|" & a(i, j + 2) & "|" & a(i, j + 0) Case 5: cad = a(i, j + 2) & "|" & a(i, j + 0) & "|" & a(i, j + 1) Case 6: cad = a(i, j + 2) & "|" & a(i, j + 1) & "|" & a(i, j + 0) End Select ' coordenada = i & "|" & j If Not dic1.exists(cad) Then y = y + 1 dic1(cad) = 1 & "|" & y & "|" & 1 dic2(coordenada) = Empty Else If Not dic2.exists(coordenada) Then x = Split(dic1(cad), "|")(0) n = Split(dic1(cad), "|")(1) m = Split(dic1(cad), "|")(2) x = x + 1 dic1(cad) = x & "|" & n & "|" & m End If End If x = Split(dic1(cad), "|")(0) n = Split(dic1(cad), "|")(1) m = Split(dic1(cad), "|")(2) 'Alamcena en la matriz 'b' todas las coordenas (fila, columna) de los números b(n, m) = coordenada m = m + 1 dic1(cad) = x & "|" & n & "|" & m Next End If Next Next ' 'Revisa cuáles números (de 3) tienen duplicados For Each ky In dic1.keys x = Split(dic1(ky), "|")(0) If x > 1 Then 'si tiene duplicado, obtiene los datos del diccionario n = Split(dic1(ky), "|")(1) m = Split(dic1(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 Set rngAma = Union(rngAma, Cells(i, j).Resize(1, 3)) Next End If Next 'colorea las celdas rngAma.Interior.Color = vbYellow rngRoj.Interior.Color = vbRed Cells(1, 3).Interior.Color = xlNone End Sub
Prueba y me comentas. Y si aparece un error, ya sabes que debes poner la mayor cantidad de información posible.
- Compartir respuesta