Saltar al contenido

Código muy lento para eliminar repetidos


Recommended Posts

Buenos días a todos,

En la empresa tenemos una "Base de datos" con registros de personal, contratos, etc que se gestiona desde un formulario y funciona muy bien todo menos el botón EliminarBD que ejecuta el siguiente código.

 

Private Sub btn_Eliminar_Click()

    Dim Ufila, ufilaD, i, j As Long
    Dim ht As Worksheet
    Dim hd As Worksheet
    
    Set ht = Hoja3
    Set hd = Hoja8
    
    If Me.txt_nic = "" Then Exit Sub
    
    If MsgBox("Seguro de eliminar TODOS los registros del item seleccionado?", vbQuestion + vbYesNo, "Borrar") = vbNo Then
        Exit Sub
    End If
    
    Ufila = ht.Range("A" & Rows.Count).End(xlUp).Row
    
    For i = 2 To Ufila

     ufilaD = hd.Range("A" & Rows.Count).End(xlUp).Row + 1
     
            If Me.txt_nic = ht.Range("A" & i) Then
                      
                hd.Cells(ufilaD, 1) = ht.Cells(i, 1)
                hd.Cells(ufilaD, 2) = ht.Cells(i, 2)
                hd.Cells(ufilaD, 3) = ht.Cells(i, 3)
                hd.Cells(ufilaD, 4) = ht.Cells(i, 4)
                hd.Cells(ufilaD, 5) = ht.Cells(i, 5)
                hd.Cells(ufilaD, 6) = ht.Cells(i, 6)
                hd.Cells(ufilaD, 7) = ht.Cells(i, 7)
                hd.Cells(ufilaD, ? = ht.Cells(i, ?
                hd.Cells(ufilaD, 9) = ht.Cells(i, 9)
                hd.Cells(ufilaD, 10) = ht.Cells(i, 10)
                        
            End If
                    
    Next i
    
    For j = 2 To Ufila
        
        Do While Me.txt_nic = ht.Range("A" & j)
            ht.Range("A" & j).EntireRow.Delete
        Loop
    Next j


    Me.ltb_ListaBD.Clear
    Unload Me
    MsgBox "Registros eliminados satisfactoriamente...", vbInformation, "Listo"
    
End Sub

Me gustaría aclarar que lo normal es subir el archivo para su gestión y prueba pero el departamento correspondiente no me lo puede facilitar por contener datos calientes, es como lo denominan ellos.

Este código tarda de 16 a 25 minutos en terminar su función cada vez que se presiona. La BD consta de unos 46000 registros y están desesperados ya que cada vez que lo ejecutan es un desespero.

Mi pregunta es si existe alguna función, añadido o forma de cambiar el código que haga que se ejecute más rápidamente. 

 

Gracias, un saludo.

Enlace a comentario
Compartir con otras webs

Hace 2 horas, YianTheJOP dijo:

Me gustaría aclarar que lo normal es subir el archivo para su gestión y prueba pero el departamento correspondiente no me lo puede facilitar por contener datos calientes, es como lo denominan ellos.

Este código tarda de 16 a 25 minutos en terminar su función cada vez que se presiona. La BD consta de unos 46000 registros y están desesperados ya que cada vez que lo ejecutan es un desespero.

Mi pregunta es si existe alguna función, añadido o forma de cambiar el código que haga que se ejecute más rápidamente. 

Sube una muestra con datos ficticios 

46mil registros a procesar no debe representar 25 minutos para eliminar filas, es mucho tiempo

Si hay métodos para que el proceso sea mas rápido , además de incluir otras líneas que sirven para agilizar los procesos, especialmente si ese libro contiene mucho recalculo 

Lo que se entiende de ese código, es que antes de eliminar los elementos que coinciden, los almacenas en otra hoja y luego vuelves a recorrer los mismos para eliminarlos 

 

Saludos

Enlace a comentario
Compartir con otras webs

Gracias @Gerson Pinedapor molestarte. Respecto a lo de subir el archivo sé por otras ocasiones que he preguntado qué es lo correcto y hoy les he pedido una copia sin los datos y me la han negado con buenas palabras y los entiendo ya que está "toda la vida" del personal ahí dentro. Mañana les haré entender que para estudiar el código necesito una copia a ver si hay suerte. 

Y tienes razón en que lo que realiza es buscar en la BD información, la encuentra, Alcorta y la pega en otra hoja y después sigue buscando y sigue realizando lo mismo. Me deja un poco parado lo que me comentas de que vuelve a empezar a buscar y localizar, yo pensaba en que continuaba donde lo había dejado. 

respecto a lo de 25 minutos es cierto, hoy me han dicho que podía tardar 16 minutos y han hecho una prueba delante mío y el resultado han sido 25 minutos de reloj!!!! Una locura. 

 

Enlace a comentario
Compartir con otras webs

Buenos días a todos,

@Gerson Pineda @Janlui adjunto el archivo Excel sin datos de personal y eliminado los logos, etc de toda referencia a la empresa, o eso creo, espero no meterme en un jaleo.

He tenido que sobornar a un compañero para conseguirlo :)

Añado estas capturas también.

1.thumb.jpg.0fe32871102bf78fa3356853aa730824.jpg

2.thumb.jpg.30271384084041f3099a048e2b1aa4f7.jpg

A ver si me podéis ayudar.

Gracias.

 

Gestión FECHAS empleados COPIA.xlsm

Enlace a comentario
Compartir con otras webs

Si y no. A ver si te lo explico bien. 

Cada trabajador tiene un único código en la empresa pero..... Tiene en la BD unas 60 o 70 entradas diferentes. Para que la BD pueda trabajar bien y con un registro único, al final de la fila réplica su código de empleado + 1, código empleado +2, código empleado+3 y así repetidamente. El número añadido detrás de su número de empleado es su primer contrato o entrada, segundo contrato o entrada, tercera entrada,etc. 

Con este fichero gestionan los contratos de personal eventual y cada semana les hacen un contrato nuevo, políticas de empresa. 

Enlace a comentario
Compartir con otras webs

  • Gerson Pineda changed the title to Código muy lento para eliminar repetidos
Hace 2 horas, YianTheJOP dijo:

Ok. Mañana intento meter datos ficticios. 

He visto tu archivo y según tu duda con el código inicial, es eliminar según lo escogido en el Textbox

Aclara si deseas eliminarlos /moverlos todos o que quede solo uno en la BD

 

 

Saludos 

Enlace a comentario
Compartir con otras webs

Hola @Gerson Pineda lo que se busca es lo que hace pero más rápido. 

Te resumo,,,, eliminar los datos que salen en el textbox de la hoja BD "todos" ya que se supone que ese trabajador no trabajara más con nosotros. Pero...... Que realice una copia de todo lo eliminado de la BD en la hoja KO o algo así se llama, que ahora no puedo mirarlo, por si alguna vez decide venir a trabajar otra vez o simplemente para consultar posteriormente. 

La función que realiza el botón es totalmente correcta actualmente pero es eternamente lenta. 25 minutos para eliminar a una persona de la BD y realizar copia en hoja KO. Una locura!!!!?

Enlace a comentario
Compartir con otras webs

Te dejo un archivo como de 50,500  registros de Empleados, Tarda menos de 5 seg. para eliminar todos los registros correspondientes al mismo empleado.

Solo adáptalo a tu BD.

Coloca en la Celda M3 el numero de empleado y da clic en el Botón de eliminar

 

Baja de Empleados.xlsm

Enlace a comentario
Compartir con otras webs

Lo miro mañana que no tengo acceso ahora al ordenador. @Janlui gracias por molestarte. Un saludo. 

Otra cosa..... Si creéis que este archivo es digno después de mejoras publicarse aquí podéis cualquiera colgarlo en otro sitio del foro para que sea útil a cualquiera. Es un poco "complejo" pero es útil para un departamento de RH. Habréis visto que tiene calculadora entre fechas, avisos directos en Outlook, alertas,etc para gestionar contratos. Yo no tengo tiempo de publicarlo, solo pido que se mire bien y se borre todo rastro de referencias a mí empresa y ya está. Ojalá le sea útil a alguien. 

Gracias. 

Enlace a comentario
Compartir con otras webs

Tu archivo  esta cargadito y es lo que precisamente imagine, pues esto tiene impacto directo con el rendimiento de cada proceso  que corres

Es decir no es lo mismo realizar un procedimiento en un libro relativamente limpio que sobre el tuyo, esa es la razón principal por la lentitud de este y todos los procesos que llevas a cabo

Si es mejorable y se debe revisar cada hoja, pe: a la hoja BD TRABAJADORES y BD_DELETE yo les elimino las macros de evento que tienes en cada una [estas macros, impactan directamente pues cada que seleccionas una celda se activa y eso es un crimen jaja al ejecutar la eliminación y copia de registros] y podrías agregar una que haga lo mismo pero al seleccionar/activar la hoja

Private Sub Worksheet_Activate()

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

    Range("A:J").EntireColumn.AutoFit

Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

End Sub

Aunque ya he visto que has recibidos aportes de Jsd y Janlui, pero de todas maneras te dejo mi versión, para que puedas probar y de paso nos comentas

Ojo desde ya te adelanto que su tiempo de proceso es aceptable, pero al adaptarla en tu archivo, no será igual, y también estará relacionado a cuantos registros existen para eliminar, es decir no es lo mismo eliminar 15 registros de 50mil, que 500 de 50mil o 100mil o 500mil

 

Saludos!

Eliminar registros_GP.xlsm

Enlace a comentario
Compartir con otras webs

Estoy mirando e intentando entender y...... es una pasada!!!!! :) Está perfecto tanto el aporte de @Janlui como el añadido de @JSDJSD como la versión de @Gerson Pineda.

Ahora solo me falta implementarlo en el archivo Excel y darle un par de vueltas, mi intención es realizar 2 archivos con las 2 ideas y ver cual funciona más rápido funcionando en un escenario real. 

Intentaré el lunes, martes tenerlo listo "con todos los datos reales de los empleados" y ver como reacciona y cual deciden quedarse.

Por supuesto que os comentaré por aquí la velocidad exacta de las ideas planteadas ;)  

Muchísimas gracias chicos por su tiempo. 

El lunes, martes comento. Un saludo.

Enlace a comentario
Compartir con otras webs

Buenas tardes chicos,

impresionante!!! Ha pasado de tardar unos 25 minutos a solo 50segundos ?

Hemos usado los datos reales del personal y están alucinando. 

Al final he usado la propuesta de @Janlui @JSDJSD

La propuesta de @Gerson Pineda yo la entendía mucho más y es la primera que integré pero inexplicablemente me marcaba fallo en el tema de mostrar los segundos en ejecutar la macro. No sé si será por la versión de Excel, trabajamos con Excel365.

Como siempre muchísimas gracias por vuestra ayuda desinteresada siempre. 

un saludo. 

Enlace a comentario
Compartir con otras webs

Hace 38 minutos , YianTheJOP dijo:

La propuesta de @Gerson Pineda yo la entendía mucho más y es la primera que integré pero inexplicablemente me marcaba fallo en el tema de mostrar los segundos en ejecutar la macro. No sé si será por la versión de Excel, trabajamos con Excel365.

También utilizo 365, pero es posible que sea por adaptación, la he probado nuevamente y no hay fallos

Observa

DEMO.gif

Lo que debes cambiar es la variable y la columna a evaluar, para eliminar

 

Saludos

Enlace a comentario
Compartir con otras webs

Archivado

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

  • 96 ¿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

  • Ayúdanos a mejorar la comunidad

    • Donaciones recibidas este mes: 0.00 EUR
      Objetivo: 130.00 EUR
  • Archivos

  • Estadísticas de descargas

    • Archivos
      177
    • Comentarios
      90
    • Revisiones
      27

  • Crear macros Excel

  • Mensajes

    • Hola de nuevo a ambos, @daren, tu archivo lleva excesivos datos, que creo no son necesarios para la información final que buscas. Te subo otro archivo, simplificado al máximo, que, si lo he entendido bien, con esta fórmula simplificada: =CONTAR.SI('Casos de Prueba'!I:I;"OK")*('Casos de Prueba'!I1="Resultados Ciclo "&COLUMNA(A5)) se calcularía el primer dato, que se encuentra en la columna I. Copiando la fórmula a la derecha las celdas que necesites, se completaría el rango.  Tu fórmula la coloco en D7, y esta nueva en D9, que como ves (si, repito, he interpretado bien lo que buscas), da los mismos resultados. ---------------------------------------------------------------- En cuanto a: Aquí tienes, en el mismo archivo (Hoja 3) lo que devuelve tu fórmula cuando hay un determinado dato en A1 y en B2. No llego a entender qué es lo que quieres exactamente.  Tal vez con una pequeña explicación de lo que esperas obtener, sea suficiente para poner el hilo a la aguja. ? ----------------------------------------------------------------- En el caso de que falte por añadir o evaluar alguna otra variable o parámetro (en tu primer post hablabas sólo de 'OK' y ahora veo que en el archivo figuran además 'KO' y 'BLOCK'), por favor, intenta emular el ejemplo del archivo que estoy subiendo; añade EXCLUSIVAMENTE esos datos en la hoja allá donde proceda, explicando dónde o cómo deben contarse o sumarse. Mejor trabajar siempre con datos anónimos y reducidos. Desconozco si en tu archivo alguno de esos datos puede considerarse confidencial, pero seguro que no interesan a nadie. Mucho mejor obviarlos. Saludos, Plantilla V3 (B).xlsx
    • buenas noches, quisiera saber si puedo mejorar mi macros que se encuentra en el evento change de la hoja de calculo de Excel, son códigos de cálculos básicos, además si me pudieran ayudar a reducir el código o darme algún tip para reducirlo yo mismo estaría muy agradecido.  de ante mano muchas gracias     Private Sub Worksheet_Change(ByVal Target As Range)     Application.ScreenUpdating = False     Application.Calculation = xlManual     Application.EnableEvents = False              If Not Intersect(Target, Range("$L$5:$Y$9")) Is Nothing Then             Sub todo()          Range("E22") = WorksheetFunction.Sum(Range("E4:E21"))     Range("E23") = WorksheetFunction.Sum(Range("E4:E19"))     Range("E24") = WorksheetFunction.Sum(Range("E23") - WorksheetFunction.Sum(Range("I4:I7")))     Range("i22") = WorksheetFunction.Sum(Range("I4:I21"))     Range("I4") = Range("E23") * 0.1     Range("I6") = Range("E23") * 0.0127     Range("I5") = Range("EN10") * Range("EN11")     Range("I7") = Range("E23") * 0.006     Range("I25") = Range("E22") - Range("I22")     Range("I12") = Range("E24") * 0.03     Range("C7") = WorksheetFunction.Sum(Range("EQ8") - (Range("EQ9"))) + Range("EN13") + Range("EN14") + Range("EN15") + Range("EN16")     'Range("E7") = WorksheetFunction.Sum(Range("C7") * ((Range("E4") * 0.0077777)))     Range("C9") = Range("EQ9") + Range("EN17") + Range("EN18") + Range("EN19")     'Range("E9") = WorksheetFunction.Sum(((((Range("E4") / Range("C4")) * 7) / 45) * 1.3) * 1.5) * Range("C9")     'Range("E8") = WorksheetFunction.Sum(((((Range("E4") / Range("C4")) * 7) / 45) * 0.3)) * (Range("C8"))     Range("E9") = WorksheetFunction.Sum(((((Range("E4") / Range("C4")) * 7) / 44) * 1.3) * 1.5) * Range("C9")     Range("E8") = WorksheetFunction.Sum(((((Range("E4") / Range("C4")) * 7) / 44) * 0.3)) * (Range("C8"))     Range("E7") = WorksheetFunction.Sum((((Range("E4") / Range("C4")) * 7) / 44) * 1.5) * Range("C7")          End Sub              End If                  Application.Calculation = xlAutomatic     Application.ScreenUpdating = True     Application.EnableEvents = True     End Sub
    • Buenas perdonad la espera adjunto el fichero Excel y explico mas detallado lo que me solicitan: Lo que me solicitan es que esos CP de la pestaña Casos de prueba los cuales tienen formulas para que cuando se copien y peguen junto a sus pasos el CP se va autoincrementando a 1,2,3 etc...., pero si copias ese CP bien solo con el primer paso o con todos sus  pasos y lo insertas entre dos CP no continua con la numeración, como se ve en la foto al hacer eso el CP insertado continua con la numeración CP2 y el de abajo pone también CP2 no se incrementa ni ese ni el valor de CU que hay a la derecha que también es incremental. Necesitaría que continuara con esa numeración aun insertándolo entre medio de 2 tanto el CP como el CU de la derecha. También me solicitan que el campo Ciclo 1 de la pestaña Resumen es auto incremental cuando copias y pegas va sumando 1, pero en las formulas referentes a Ok KO Y bloqueo al copiar y pegar se mantiene la misma formula , la idea es que cuando copies y pegues la fila donde están los ciclos se autoincremente Ciclo a 1,2,3,4 etc... y la formula de los campos OK,KO y Bloqueos se incremente también pasando de la columna I a la J  luego a la k etc... y que en Resultados Ciclo el numero de la formula también se incremente Resultados Ciclo 1 , 2 ,3 etc... que cambie la columna a la vez que el numero de Resultados Ciclo. Gracias por adelantado un saludo. Plantilla v3 Pruebas.xlsx  
    • Saludos amigos espero estén bien Estoy intentando hacer un formulario que me convierta unidades de masa sin embargo  en el mejor de los casos solo he podido lograr la conversión de una unidad a la vez en los TextBox 1, 3, 5, 7, 9, 11 y 13 y cuando lo logro el resultado que se copia  en la celda no se corresponde con el obtenido originalmente en el Textbox del Formulario (frmconv)  ejemplo al convertir 1900 Kg a Lb el resultado en el TextBox1 =4188,78298142 sin embargo al guardar el resultado lo que se copia en la Celda  "F11" es  418.878.298.142,00, adicionalmente el resultado de la conversión no se visualiza inmediatamente por lo que debo de hacer click en los TextBox 1, 3, 5, 7, 9, 11 y 13  para ver el resultado. Mucho les sabre agradecer la ayuda que me puedan brindar. PRUEBA.xlsm
    • Saludos a ambos. Copiar y pegar por sí solas, no tengo el conocimiento de que sirvan como "evento" para actualizar las referencias que buscas hacer, en la forma que lo quieres hacer, ó la fórmula como la quieres hacer. Te recomiendo abrir un tema similar en Macros, es posible que algún Maestro te de alguna idea. Por otro lado, si debe ser con funciones, entonces tendías que interactuar con COLUMNA() y FILA() para que al pegar el destino "sepa" donde está ubicado e intentar cambiar la referencia. =INDIRECTO(CARACTER(COLUMNA()+64)&FILA()) Algo como eso se podría usar para obtener el código ASCII de la letra de la columna (donde 65 es el código para “A”), y FILA() devuelve el número de la fila. La función CARACTER() convierte el código ASCII en una letra. Luego, INDIRECTO() toma la cadena resultante (por ejemplo, “A1”, “B2”, etc.) y la usa como una referencia de celda. En ese caso, una posible idea de editar tu ejemplo sería: =SI(INDIRECTO("'Casos de Prueba'!"&CARACTER(COLUMNA()+64)&"1")="Resultados Ciclo 1"; SI(CONTAR.SI(INDIRECTO("'Casos de Prueba'!"&CARACTER(COLUMNA()+64)&":"&CARACTER(COLUMNA()+64)); "OK")=0; 0; CONTAR.SI(INDIRECTO("'Casos de Prueba'!"&CARACTER(COLUMNA()+64)&":"&CARACTER(COLUMNA()+64)); "OK")); 0)   Enfatizo que es una idea, es muy probable que haya que editar. Así como esta su tema, la recomendación del maestro toma relevancia porque especular o deducir no es lo adecuado para intentar ayudar en este tipo de consultas. Por esta causa de mi parte por ejemplo no puedo aportar algo adicional.
  • 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.