Selección de celdas continuas aleatoriamente

Buen Día.
En un rango de celdas (A1 a G7) lo cual forma un cuadro de 7x7. El objetivo es seleccionar el punto de inicio y un punto de Fin y luego por medio de macros se seleccione otra celda aleatoriamente hasta llegar al punto Fin... Lo que necesito es que las celdas seleccionadas aleatoriamente estén continuas (Una de tras de la otra pero y en cualquier dirección) y que coloree la celda por la que pasó... La idea es crear una ruta aleatoria.
Espero me colaboren... Gracias.

1 respuesta

Respuesta
1
Me recordaste a mis tiempos estudiando programación en la escuela de ingeniería.
Te dejo una solución que desarrolle, funciona pero le faltaría colocarle condicionales para que no repita las celdas por las que ya paso.
Todas esas condicionales toman su tiempecito, pero creo que puedes hacerlo, si necesitas más ayuda me avisas.
Sub Macro2()
Dim inicio As Range
Dim fin As Range
Set inicio = Application.InputBox(prompt:="Selecccione celda partida", Type:=8)
Set fin = Application.InputBox(prompt:="Seleccione celda llegada", Type:=8)
inicio_fila = inicio.Row
inicio_columna = inicio.Column
fin_fila = fin.Row
fin_columna = fin.Column
i = inicio_fila
j = inicio_columna
Cells(i, j).Select
While (i <> fin_fila Or j <> fin_columna)
If Rnd() < 0.5 Then
If Rnd() < 0.5 Then
i = i - 1
Else
i = i + 1
End If
Else
If Rnd() < 0.5 Then
j = j - 1
Else
j = j + 1
End If
End If
If j >= 7 Then j = 7
If j = 0 Then j = 1
If i >= 7 Then i = 7
If i = 0 Then i = 1
Cells(i, j).Interior.ColorIndex = 6
Wend
MsgBox "listo"
End Sub
Muchas gracias... Me sirvió mucho, pero no he logrado hacer que no se repitan.
Amigo. Buen día. Logré hacer que no repita celda pero no se si sea la forma más adecuada. Voy a poner acá el código para que lo mires y lo pongas a correr. Lo único es determinarle el rango de celdas que va desde A1 hasta G7.
No se si sea la mejor forma, resulta que está seleccionando celdas que no las que continúan... Me explico. Si esta en la B2 debe tener solo las opciones A2, B1, C2, B3...
Con la validación que le creé queda así: Cuando a pasado por varias celdas y ya no tiene una celda siguiente que rellenar se salta a otra lejos de esta y eso es lo que no se puede, entonces como puedo hacer la validación y que llegue más rápido al punto de llegada pero en celdas continuas y que luego que termine me muestre las celdas por las que pasó.
Dim inicio As Range
Dim fin As Range
Dim i As Integer
Dim j As Integer
Dim inicio_fila As Integer
Dim inicio_columna As Integer
Dim f As Integer
Dim EnI As Integer
Dim fin_fila As Integer
Dim Fin_Columna
Sub Macro2()
Range("A1:G7").ClearContents
Range("A1:G7").Interior.ColorIndex = 20
EnI = 0
f = 0
Set inicio = Application.InputBox(prompt:="Seleccione la celda de partida", Type:=8)
inicio = "Ini"
Set fin = Application.InputBox(prompt:="Seleccione la celda de llegada", Type:=8)
fin = "Fin"
inicio_fila = inicio.Row
inicio_columna = inicio.Column
fin_fila = fin.Row
Fin_Columna = fin.Column
i = inicio_fila
j = inicio_columna
Cells(i, j).Select
Call ramdon
MsgBox "!!! LLegamos ¡¡¡"
d = Range("A8")
MsgBox "La hormiga pasó por " & d & " partes"
End Sub
Sub ramdon()
While (i <> fin_fila Or j <> Fin_Columna)
If Rnd() < 0.5 Then
If Rnd() < 0.5 Then
i = i - 1
Else
i = i + 1
End If
Else
If Rnd() < 0.5 Then
j = j - 1
Else
j = j + 1
End If
End If
If j >= 7 Then j = 7
If j = 0 Then j = 1
If i >= 7 Then i = 7
If i = 0 Then i = 1
If inicio_fila = i And inicio_columna = j Then
Call ramdon
Else
Cells(i, j).Select
If IsEmpty(ActiveCell) Then
ActiveCell.Interior.ColorIndex = 3
Else
If ActiveCell.Value = "Fin" Then
Call Final
Else
Call ramdon
End If
End If
If f <> 1 Then
EnI = EnI + 1
ActiveCell = EnI
End If
End If
Wend
End Sub
Sub Final()
f = 1
ActiveCell.Interior.ColorIndex = 30
Range("A8") = EnI
End Sub
Te quedo muy bien.
Le agregue unas lineas al sub ramdon para evitar que salte. Ahora si quieres que el recorrido sea totalmente aleatorio, muchas veces la "hormiguita" se va a quedar encerrada. Si no hay problema con eso creo que esta listo, si no podemos agregar algunas condiciones para mejorar el recorrido.
Saludos
Bacter
Sub ramdon()
Dim ii As Integer
Dim jj As Integer
While (i <> fin_fila Or j <> Fin_Columna)
ii = i
jj = j
If Rnd() < 0.5 Then
If Rnd() < 0.5 Then
i = i - 1
Else
i = i + 1
End If
Else
If Rnd() < 0.5 Then
j = j - 1
Else
j = j + 1
End If
End If
If j >= 7 Then j = 7
If j = 0 Then j = 1
If i >= 7 Then i = 7
If i = 0 Then i = 1
If inicio_fila = i And inicio_columna = j Then
Call ramdon
Else
Cells(i, j).Select
If IsEmpty(ActiveCell) Then
ActiveCell.Interior.ColorIndex = 3
Else
If ActiveCell.Value = "Fin" Then
Call Final
Else
i = ii
j = jj
Call ramdon
End If
End If
If f <> 1 Then
EnI = EnI + 1
ActiveCell = EnI
End If
End If
Wend
End Sub
Si, el problema es que debe llegar al punto de llegada.
Listo hermano, creo que di con una solución aceptable
pruba con esta función y me avisas.
Siempre llega a la solución.
Espero te funcione
el sub macro22 lo dejas igual.
Sub ramdon()
Dim ii As Integer
Dim jj As Integer
signo_fila = Sgn(fin_fila - inicio_fila)
signo_columna = Sgn(Fin_Columna - inicio_columna)
While (i <> fin_fila Or j <> Fin_Columna)
ii = i
jj = j
signo_fila = Sgn(fin_fila - i)
signo_columna = Sgn(Fin_Columna - j)
If Rnd() < 0.5 Then
i = i + signo_fila
Else
j = j + signo_columna
End If
If j >= 7 Then j = 7
If j = 0 Then j = 1
If i >= 7 Then i = 7
If i = 0 Then i = 1
If inicio_fila = i And inicio_columna = j Then
Call ramdon
Else
Cells(i, j).Select
If IsEmpty(ActiveCell) Then
ActiveCell.Interior.ColorIndex = 3
Else
If ActiveCell.Value = "Fin" Then
Call Final
Else
i = ii
j = jj
Call ramdon
End If
End If
If f <> 1 Then
EnI = EnI + 1
ActiveCell = EnI
End If
End If
Wend
End Sub
Quedó excelente. muy bien... Muchas gracias. Ya solo me falta que en una fila de la hoja ponga en celdas diferentes pero seguidas el nombre de las celdas por la que pasó la ruta, pero eso lo hago fácil... muchas gracias.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas