Saltar al contenido

Macro borra aleatoriamente segun varios criterios: selección columna, valores y sumatorio de otra co


West Mart

Recommended Posts

publicado

Estimados amigos:

En un archivo Excel tengo una tabla de datos bastanteextensa que importo de otra aplicación y genera un archivo con numerosas hojasy miles de registros.

A modo de ejemplo os adjunto un libro que ya contiene unamacro que me permite eliminar filas de manera aleatoria en función de un rangoseleccionado: desde fila, hasta fila y el número de líneas que se deseanborrar,pero necesitaría concretar más la macro y que haga también lo siguiente:Que para una hoja concreta, seleccionando una columna y un concepto existenteen celdas de esa columna, y un importe sumatorio de valores de otra columna quecumplan ese criterio, me borre aleatoriamente filas hasta obtener el importedeseado más cercano.

Tendría que tener la opción de seleccionar en textbox lacolumna, el contenido de la celda, la columna sobre la que hace el sumatorio yel importe de ese sumatorio.

A modo de ejemplo, de los datos de la hoja adjunta: Que dela fila C con celdas con contenido "Barcelona" borre aleatoriamente estasfilas hasta que el sumatorio total en la columna "R" para esaselección sea 40.000 euros o el importe más cercano.

Les agradecería mucho su colaboración porque mesimplificaría mucho el trabajo.

Muchas gracias.

Saludos.

ejemplo para macro que borre aleatoriamente segun columna y valor seleccionado.zip

publicado

Re: Macro borra aleatoriamente segun varios criterios: selección columna, valores y sumatorio de otra col

Buenas,

Creo que quizás el planteamiento que haces no sea el más adecuado en cuanto a la forma en que debe trabajar el código.

Me explico:

Tú no puedes ir eliminando filas en busca de un sumatorio total, hasta que previamente no sepas cuáles de ellas forman parte de ese sumatorio. Por eso, lo primero que debes buscar es cómo definir qué filas forman parte del mismo y una vez identificadas, eliminar el resto...

Para identificarlas se puede utilizar la herramienta "Solver" a través de una fórmula de SUMAPRODUCTO con los importes y una lista de "1" en la columna de al lado para que los utilice en forma binaria. De esta manera, calcula cuales son los valores que formarían la suma más aproximada al objetivo.

Mira a ver si te ayuda a plantearte la tarea...

Un saludo,

Tese

publicado

Re: Macro borra aleatoriamente segun varios criterios: selección columna, valores y sumatorio de otra col

Gracias por tu respuesta Tese1969.

Voy a probar como me indicas, pero a bote pronto, no sé cómo podré luego borrar filas de manera aleatoria que sumen un importe concreto.

Pero antes de nada voy a intentar hacer lo que me indicas.

Saludos.

publicado

Re: Macro borra aleatoriamente segun varios criterios: selección columna, valores y sumatorio de otra col

La clave, amigo West Mart, es que al localizar qué filas forman parte de ese sumatorio las marques de alguna manera (color, un texto en una columna contigua, etc....lo que se te ocurra)....después simplemente le pegas una pasada a la columna y eliminas las que no tengan esa marca....

Es una opción, pero seguro que hay otras....

Un saludo,

Tese

publicado

Re: Macro borra aleatoriamente segun varios criterios: selección columna, valores y sumatorio de otra col

Entiendo lo que me planteas, pero sólo quiero borrar aleatoriamente una parte de la selección, es decir, de las filas seleccionadas o marcadas que suman una cantidad X, sólo quiero borrar una parte de esas filas que suman la cantidad X-Y, y ese borrado es aleatorio.

Seguiré buscando alternativas.

gracias por tu atención.

saludos.

  • 2 weeks later...
publicado

Re: Macro borra aleatoriamente segun varios criterios: selección columna, valores y sumatorio de otra col

Buenas tardes:

He modificado la macro de manera que primero aplico un filtro y la macro debería ejecutarse sólo en las filas visibles (no ocultas en el filtro). Sin embargo se aplica borrando también las filas ocultas. ¿me podrían indicar qué es lo que está mal?

gracias.

Adjunto la macro

Sub Prueba_Borrado_de_filas_de_manera_aleatoria()

Dim fila_inicial As Double

Dim fila_final As Double

Dim Cantidad_Total_Filas As Double

Dim Cantidad_Filas_Borrar As Double

Dim fila_elegida As Double

Dim Fila_Borrar As String

Dim Filas_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

fila_inicial = InputBox("Ingrese la Fila Inicial", "Fila Inicial")

fila_final = InputBox("Ingrese la Fila Final", "Fila Final")

'Calcula la Cantidad Total de Filas

Cantidad_Total_Filas = (fila_final - fila_inicial + 1)

'indicar la columna que se selecciona y el texto que se quiere filtrar

'Columna_Criterio = InputBox("Indique el número de la columna que se filtra")

'Criterio_filtro = InputBox("Indique el texto que se quiere filtrar")

Selection.AutoFilter Field:=3, Criteria1:="BARCELONA"

'Cantidad de Filas a Borrar

Ingresa_Cantidad_Filas:

Cantidad_Filas_Borrar = InputBox("Ingrese la Cantidad de Filas que desea Borrar, la Cantidad debe ser menor o igual a " & Cantidad_Total_Filas, "Cantidad de Filas a Borrar")

If Cantidad_Filas_Borrar > Cantidad_Total_Filas Then

MsgBox "La Cantidad de Filas que desea borrar es mayor que la cantidad Total de Filas del rango, por favor intente Nuevamente", vbExclamation, "Error en Dato"

GoTo Ingresa_Cantidad_Filas

End If

'generamos el número de la fila al azar

Do While Cantidad_Filas_Borrar > 0

fila_elegida = Int((fila_final - fila_inicial + 1) * Rnd + fila_inicial)

'Guardo en una Variable la Fila Elegida

Fila_Borrar = fila_elegida

'Verifico que la Fila a Borrar no se repita

If InStr(1, Filas_Elegidas, Fila_Borrar) = 0 Then

'Guardo la Fila elegida a Borrar en una variable

Filas_Elegidas = Filas_Elegidas & "-" & fila_elegida & ""

'Nos situamos en la fila elegida

Rows(fila_elegida).ClearContents

'Decremento la variable Cantidad_filas_Borrar

Cantidad_Filas_Borrar = Cantidad_Filas_Borrar - 1

End If

Loop

End Sub

publicado

Re: Macro borra aleatoriamente segun varios criterios: selección columna, valores y sumatorio de otra col

Tengo 2 ejemplos para seleccionar celdas que sumen una determinada cantidad, uno muy sencillo que tiene limitacion en el numero de celdas resultantes, no en el numero total, el otro puede decirse que es ilimitado, no se cual prefieras.

Para borrar las filas lo mas practico es aplicar un filtro y eliminar las filas resultantes, es rapidismo.

Los codigos publicados en el foro deben ir envueltos en etiquetas segun las normas del foro.

Para ti debe ser obvio pero nos ayudaria que subas de nuevo el ejemplo con el codigo incluido y el resultado esperado.

publicado

Re: Macro borra aleatoriamente segun varios criterios: selección columna, valores y sumatorio de otra col

Buenas tardes Armando Montes:

En primer lugar quiero disculparme por no haber incluido la etiqueta en el código HTML enviado.

Por otra parte, en esta respuesta adjunto el archivo con la macro que envié ayer, así como el archivo de ejemplo.

En cuanto a los ejemplos que mencionas, ¿dónde puedo localizarlos?

Gracias.

Saludos.

ejemplo para macro que borre aleatoriamente segun columna y valor seleccionado.zip

  • 1 month later...
publicado

Hola Armando:

Saludandote desde Mexico, D.F. en relacion a los ejemplos que mencionas me gustaria en la medida de lo posible si pudieras compartir el ilimitado ya que tengo un caso similar al de West Mart pero requiero de un mayor numero de registros.

Esperando tu valioso apoyo me despido, gracias

Salu2

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

  • 109 ¿Te parecen útiles los tips de las funciones? (ver tema completo)

    1. 1. ¿Te parecen útiles los tips de las funciones?


      • No
      • Ni me he fijado en ellos

  • Current Donation Goals

    • Raised 0.00 EUR of 130.00 EUR target
  • Archivos

  • Estadísticas de descargas

    • Archivos
      187
    • Comentarios
      97
    • Revisiones
      29

    Más información sobre "Un juego del Rabino en Excel"
    Última descarga
    Por pegones1

    2    1

  • Crear macros Excel

  • Mensajes

    • Que tal nuevamente,  adjunto una solución alternativa: =MAX(A:.A)-BYROW(F4:.AK20,LAMBDA(r,BUSCAR(2,1/(r=0),F3:.AK3))) Cabe mencionar que esta solución requiere funciones nuevas como RECORTAR.RANGO. CONTADOR FINAL (Solucion).xlsb
    • Buenos días,  espero se encuentren bien de salud compañeros, Favor me podrían ayuda con lo siguientes como se podría hacer cuando tengo una tabla dinámica que  amedida que se aumente las columnas fechas con data un formula que se coloco al final busque o analice siempre la ultima fila y columna de la fecha. Coloco un ejemplo
    • @JSDJSD Excelentes, GRACIAS POR TU SOPORTE , me ayudo demasiado es exactamente lo que quería. 5 ESTRELLAS
    • 'Opción 1 Sub FiltrarSKUPorFecha(): Application.ScreenUpdating = False Dim ultimaFila As Long, fila As Long Dim diccionarioSKU As Object Dim listaEliminar As Object Dim fechaActual As String, fechaSiguiente As String Dim f As Variant With Sheets("Consolidado") ultimaFila = .Cells(.Rows.Count, 1).End(xlUp).Row ' Crear diccionarios para comparar SKU y almacenar filas a eliminar Set diccionarioSKU = CreateObject("Scripting.Dictionary") Set listaEliminar = CreateObject("Scripting.Dictionary") ' Recorrer desde la primera fila hasta la penúltima For fila = 2 To ultimaFila - 1 fechaActual = .Cells(fila, 1).Value fechaSiguiente = .Cells(fila + 1, 1).Value ' Solo comparar la fecha actual con la siguiente (inmediatamente superior) If fechaActual <> fechaSiguiente Then diccionarioSKU.RemoveAll ' Limpiar el diccionario antes de llenarlo ' Guardar los SKU de la fecha siguiente (solo de la siguiente) For f = fila + 1 To ultimaFila If .Cells(f, 1).Value <> fechaSiguiente Then Exit For diccionarioSKU(.Cells(f, 2).Value) = 1 Next f ' Revisar los SKU de la fecha actual y marcar los que deben eliminarse For f = fila To 2 Step -1 If .Cells(f, 1).Value <> fechaActual Then Exit For ' Solo eliminar si el SKU no está en la fecha siguiente If Not diccionarioSKU.exists(.Cells(f, 2).Value) Then listaEliminar(f) = 1 ' Marcar fila para eliminar después End If Next f ' Ya no es necesario seguir buscando después de comparar la primera y la siguiente fecha Exit For End If Next fila ' Eliminar las filas marcadas sin afectar el bucle principal For Each f In listaEliminar.keys .Rows(f).Delete Next End With MsgBox "Completado correctamente.", vbInformation End Sub 'Opción 2 Sub FiltrarSKUPorFecha1(): Application.ScreenUpdating = False Dim ultimaFila As Long, fila As Long Dim listaEliminar As Collection Dim fechaActual As String, fechaSiguiente As String Dim f As Variant, i As Long Dim SKUExiste As Boolean With Sheets("Consolidado") ultimaFila = .Cells(.Rows.Count, 1).End(xlUp).Row ' Inicializar la colección para marcar las filas a eliminar Set listaEliminar = New Collection ' Recorrer desde la primera fila hasta la penúltima For fila = 2 To ultimaFila - 1 fechaActual = .Cells(fila, 1).Value fechaSiguiente = .Cells(fila + 1, 1).Value ' Solo comparar la fecha actual con la siguiente (inmediatamente superior) If fechaActual <> fechaSiguiente Then ' Revisar los SKU de la fecha actual y marcar los que deben eliminarse For f = fila To 2 Step -1 If .Cells(f, 1).Value <> fechaActual Then Exit For ' Comprobar si el SKU está en la fecha siguiente SKUExiste = False For i = fila + 1 To ultimaFila If .Cells(i, 1).Value <> fechaSiguiente Then Exit For If .Cells(i, 2).Value = .Cells(f, 2).Value Then SKUExiste = True Exit For End If Next i ' Si el SKU no se encuentra en la fecha siguiente, marcar para eliminar If Not SKUExiste Then listaEliminar.Add f ' Marcar fila para eliminar después End If Next f ' Ya no es necesario seguir buscando después de comparar la primera y la siguiente fecha Exit For End If Next fila ' Eliminar las filas marcadas sin afectar el bucle principal For Each f In listaEliminar .Rows(f).Delete Next f End With MsgBox "Completado correctamente.", vbInformation End Sub   TABLA ELIMINAR.xlsm
  • Visualizado recientemente

    • No hay usuarios registrado para ver esta página.
×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.