Borrar aleatoriamente el contenido de n celdas.

¿Cuál sería el código para que una macro borre el contenido de "n" celdas aleatoriamente dentro de un rango? No necesito todo el código porque ya tengo el que las borra de una en una, solo la línea necesaria para yo indicarle el número de celdas (me refiero al contenido) que quiero borrar.

1 Respuesta

Respuesta
2
Para Borrar celdas de forma aleatoria utilizael siguiente ejemplo:
Range("A1,B2,C3,D4,E5,F6,G7").Select
Selection. ClearContents
Quizá no me he explicado bien, porque si quiero borrar de un solo golpe el contenido de 30 celdas y de manera aleatoria, ¿cómo lo sabe tu código? ¿Y si quiero que me borre 50... o 100? ¿Me he explico?
Gracias.
Solo debes pasarle como parámetro las celdas a Borrar y colocarlo en una variable
Celda_Borrar = Textbox1.text 'Por ejemplo la celdas a borrar provienen de un textbox que ha llenado el usuario.
Range(Celda_Borrar).Select
Selection.ClearContents
Si es un rango:
Inicio_Celda_Borrar = Textbox1.text
Fin_Celda_Borrar = Textbox2.text
ha llenado el usuario.
Range(Inicio_Celda_Borrar & ":" & Fin_Celda_Borrar).Select
Selection. ClearContents
Mira, te aclaro que yo no sé nada de macros, aunque intento buscar información en internet sobre ellas. Por eso, te envío el código que borra una sola celda aleatoriamente para que me digas, por favor, dónde tengo que meter tu código o qué le falta al tuyo para que yo al pegarlo en VBA me funcione. Te lo agradecería mucho.
Sub celda_aleatoria()
'Iniciamos randomize para que funcione el Rnd
Randomize
'obtenemos un registro al azar, para lo cual,
'informamos primero de la fila inicial y final
'(para Excel 2007, cambiar estos datos)
fila_inicial = 1
fila_final = 65536
'lo mismo para las columnas
columna_inicial = 1
columna_final = 256
'generamos el número de la fila al azar
fila_elegida = Int((fila_final - fila_inicial + 1) * Rnd + fila_inicial)
'lo mismo para la columna
columna_elegida = Int((columna_final - columna_inicial + 1) * Rnd + columna_inicial)
'Nos situamos en la celda elegida
Cells(fila_elegida, columna_elegida).ClearContents
End Sub
He colocado unos InputBox para que proporciones los datos de fila y Columna deseados.
Sub celda_aleatoria()
'Iniciamos randomize para que funcione el Rnd
Randomize
'obtenemos un registro al azar, para lo cual,
'informamos primero de la fila inicial y final
'(para Excel 2007, cambiar estos datos)
fila_inicial = InputBox("Ingrese la Fila Inicial", "Fila Inicial")
fila_final = InputBox("Ingrese la Fila Final", "Fila Final")
'lo mismo para las columnas
columna_inicial = InputBox("Ingrese la Columna Inicial", "Columna Inicial")
columna_final = InputBox("Ingrese la Columna Final", "Columna Final")
'generamos el número de la fila al azar
fila_elegida = Int((fila_final - fila_inicial + 1) * Rnd + fila_inicial)
'lo mismo para la columna
columna_elegida = Int((columna_final - columna_inicial + 1) * Rnd + columna_inicial)
'Nos situamos en la celda elegida
Cells(fila_elegida, columna_elegida).ClearContents
End Sub
Pruébalo y me avisas
Está muy bien. Pero me falta lo fundamental que no sé si se podrá hacer, y es que me borre más de una celda a la vez y una sola, ¿me explico?
He añadido otro InputBox para Preguntar la cantidad de celdas que se desean borrar de manera aleatoria.
Sub celda_aleatoria()
'Iniciamos randomize para que funcione el Rnd
Randomize
'obtenemos un registro al azar, para lo cual,
'informamos primero de la fila inicial y final
'(para Excel 2007, cambiar estos datos)
fila_inicial = InputBox("Ingrese la Fila Inicial", "Fila Inicial")
fila_final = InputBox("Ingrese la Fila Final", "Fila Final")
'lo mismo para las columnas
columna_inicial = InputBox("Ingrese la Columna Inicial", "Columna Inicial")
columna_final = InputBox("Ingrese la Columna Final", "Columna Final")
'Cantidad de Celdas a Borrar
Cantidad_Celdas_Borrar = InputBox("Ingrese la Cantidad de Celdas que desea Borrar", "Cantidad de Celdas a Borrar")
'generamos el número de la fila al azar
Do While Cantidad_Celdas_Borrar > 0
fila_elegida = Int((fila_final - fila_inicial + 1) * Rnd + fila_inicial)
'lo mismo para la columna
columna_elegida = Int((columna_final - columna_inicial + 1) * Rnd + columna_inicial)
'Nos situamos en la celda elegida
Cells(fila_elegida, columna_elegida).ClearContents
'Decremento la variable Cantidad_Celdas_Borrar
Cantidad_Celdas_Borrar = Cantidad_Celdas_Borrar - 1
Loop
End Sub
Excelente! Funciona a las mil maravillas! Muchísimas gracias. Sigue así.
Un saludo.
(No te he podido finalizar porque no veo ningún botón donde "aceptar" o "enviar" una vez que escribo el comentario y señalo "excelente";... y eso que lo he hecho alguna vez que otra)
Hola. Mira, probando la macro me he dado cuenta de que unas veces sí y otras no, no borra el número exacto de celdas que le indico.
Por ejemplo en una matriz de 10x8 le digo que me borre 10 y unas veces borra 10 y otras 9 (por su puesto rellenando de nuevo las celdas cada vez que repito el experimento). Si le digo que 20, borra 19 ó 18 pero nunca 20. ¿A qué se puede deber, al tamaño relativo del número de celdas que quiero borrar respecto al rango que le indico?
De todas formas está muy bien, pero si se pudiera perfeccionar quedaría mucho mejor.
Gracias.
Ahora si quedo mejor que original.
He validado dos cosas:
1.- La cantidad Introducida de celdas a borrar debe ser menor o igual a la cantidad de celdas del rango.
2.- Si una celda aleatoria se repite para borrar se elegirá otra aletoriamente, así hasta completar la cantidad que se desea borrar.
Sub celda_aleatoria()
Dim fila_inicial As Double
Dim fila_final As Double
Dim columna_inicial As Double
Dim columna_final As Double
Dim Cantidad_Total_Celdas As Double
Dim Cantidad_Celdas_Borrar As Double
Dim fila_elegida As Double
Dim columna_elegida As Double
Dim Celda_Borrar As String
Dim Celdas_Elegidas As String
'Iniciamos randomize para que funcione el Rnd
Randomize
'obtenemos un registro al azar, para lo cual,
'informamos primero de la fila inicial y final
'(para Excel 2007, cambiar estos datos)
fila_inicial = InputBox("Ingrese la Fila Inicial", "Fila Inicial")
fila_final = InputBox("Ingrese la Fila Final", "Fila Final")
'lo mismo para las columnas
columna_inicial = InputBox("Ingrese la Columna Inicial", "Columna Inicial")
columna_final = InputBox("Ingrese la Columna Final", "Columna Final")
'Calcula la Cantidad Total de Celdas
Cantidad_Total_Celdas = (fila_final - fila_inicial + 1) * (columna_final - columna_inicial + 1)
'Cantidad de Celdas a Borrar
Ingresa_Cantidad_Celdas:
Cantidad_Celdas_Borrar = InputBox("Ingrese la Cantidad de Celdas que desea Borrar, la Cantidad debe ser menor o igual a " & Cantidad_Total_Celdas, "Cantidad de Celdas a Borrar")
If Cantidad_Celdas_Borrar > Cantidad_Total_Celdas Then
MsgBox "La Cantidad de Celdas que desea borrar es mayor que la cantidad Total de Celdas del rango, por favor intente Nuevamente", vbExclamation, "Error en Dato"
GoTo Ingresa_Cantidad_Celdas
End If
'generamos el número de la fila al azar
Do While Cantidad_Celdas_Borrar > 0
fila_elegida = Int((fila_final - fila_inicial + 1) * Rnd + fila_inicial)
'lo mismo para la columna
columna_elegida = Int((columna_final - columna_inicial + 1) * Rnd + columna_inicial)
'Guardo en una Variable la Celda a Elegida
Celda_Borrar = fila_elegida & "," & columna_elegida
'Verifico que la Celda a Borrar no se repita
If InStr(1, Celdas_Elegidas, Celda_Borrar) = 0 Then
'Guardo la celda elegida a Borrar en una variable
Celdas_Elegidas = Celdas_Elegidas & "-" & fila_elegida & "," & columna_elegida
'Nos situamos en la celda elegida
Cells(fila_elegida, columna_elegida).ClearContents
'Decremento la variable Cantidad_Celdas_Borrar
Cantidad_Celdas_Borrar = Cantidad_Celdas_Borrar - 1
End If
Loop
End Sub
Cuánto trabajo te he dado. ¡Muchísimas gracias! Ahora sí que va a la perfección. Menos mal que hay gente tan amable que llega hasta el final.
¡Excelentísimo!
Un saludo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas