Problema con macros en excel 2010

Tenia un libro de excel 2003 con una macro que funcionaba perfectamente, tardaba como mucho 5 segundos en ejecutarse. Tengo que pasar todos los libros a excel 2010, asi que abrí un libro creado en un excel 2003 en el excel 2010, fui a archivo > información > convertir y lo convertí... Pero al ejecutarse esta misma macro tarda mas de 20 segundos. Por que puede ser ? Hay que convertir las macros por otra parte ?

Gracias por la auyda!

1 Respuesta

Respuesta
1

Respondo a tu pregunta acerca de si hay que convertir macros y la respuesta es no. Quizás solo requieren de algún ajuste.

Abrí el Excel 2010 y desde allí abrí tu libro 2003. Una vez abierto, guardar como y allí buscá la nueva extensión (xlsm).

Si se demora habría que revisar la macro x si requiere de algún ajuste en particular.
Por poner solo un ejemplo y es un error frecuente: muchas veces para hacer algo (dar un formato, limpiar celdas, buscar un dato, etc) no le asignan un rango sino que usan la expresión:
Cells.Select y luego trabajan sobre toda la selección, es decir toda la hoja.

Imaginate que antes tenías 65000 filas y ahora más de 1 millón multiplicadas x la mayor cantidad de col... lógicamente que se demorará.

Revisa esto y si no lo resolvés, dejá escrita la macro para evaluarla.

Ahi esta el problema! y ahora tengo otro problema, la macro lo que hace es usar filtro avanzado, y no puedo elegir rangos... me pide columnas. Ya hice la prueba de llevarla desde la fila 4 a la 8000 y no funciona. Como puedo hacer ?

Dejo la macro por si hay una forma mas fácil de escribirlo.

Sub FiltrarMovDeMaquinas()
'
'limpiar para evitar errores
LimpiaMovdeMaq
'no parpadea
Application.ScreenUpdating = False
'apagar saltos de paginas
ActiveSheet.DisplayPageBreaks = False
'seleccionar pestaña
Sheets("Export_cas").Select
'Desproteger hoja
ActiveSheet.Unprotect "978645312"
'Filtrar Ticket in Ticket out
Columns("H:J").AdvancedFilter Action:=xlFilterCopy _
, CriteriaRange:=Range("V1:V2"), CopyToRange:=Range("T3"), Unique:=False
'filtrar Pagos Fuera de Sistema
Columns("H:J").AdvancedFilter Action:=xlFilterCopy _
, CriteriaRange:=Range("Z1:Z2"), CopyToRange:=Range("X3"), Unique:=False
'filtrar Procesos de Pagos
Columns("H:J").AdvancedFilter Action:=xlFilterCopy _
, CriteriaRange:=Range("AD1:AD2"), CopyToRange:=Range("AB3"), Unique:=False
'filtrar Recupero de Poder Publico
Columns("H:J").AdvancedFilter Action:=xlFilterCopy _
, CriteriaRange:=Range("AH1:AH2"), CopyToRange:=Range("AF3"), Unique:=False
'filtrar Poder Publico
Columns("H:J").AdvancedFilter Action:=xlFilterCopy _
, CriteriaRange:=Range("AL1:AL2"), CopyToRange:=Range("AJ3"), Unique:=False
'filtrar Emitidos
Columns("H:J").AdvancedFilter Action:=xlFilterCopy _
, CriteriaRange:=Range("AP1:AP2"), CopyToRange:=Range("AN3"), Unique:=False
'filtrar Anulados
Columns("H:J").AdvancedFilter Action:=xlFilterCopy _
, CriteriaRange:=Range("AT1:AT2"), CopyToRange:=Range("AR3"), Unique:=False
'filtrar Tickets pagados en maquina
Columns("H:J").AdvancedFilter Action:=xlFilterCopy _
, CriteriaRange:=Range("aX1:aX2"), CopyToRange:=Range("AV3"), Unique:=False
'filtrar Tickets pagados en caja
Columns("H:J").AdvancedFilter Action:=xlFilterCopy _
, CriteriaRange:=Range("BB1:BB2"), CopyToRange:=Range("AZ3"), Unique:=False
'filtrar Recupero por anulación
Columns("H:J").AdvancedFilter Action:=xlFilterCopy _
, CriteriaRange:=Range("BF1:BF2"), CopyToRange:=Range("BD3"), Unique:=False
'filtrar Recupero por vencido / anulado
Columns("H:J").AdvancedFilter Action:=xlFilterCopy _
, CriteriaRange:=Range("BJ1:BJ2"), CopyToRange:=Range("bh3"), Unique:=False
'filtrar Tickets vencidos
Columns("H:J").AdvancedFilter Action:=xlFilterCopy _
, CriteriaRange:=Range("bn1:bn2"), CopyToRange:=Range("bl3"), Unique:=False
'filtrar Tickets vencidos pagados
Columns("H:J").AdvancedFilter Action:=xlFilterCopy _
, CriteriaRange:=Range("br1:br2"), CopyToRange:=Range("bp3"), Unique:=False
'filtrar Diferencia
Columns("H:J").AdvancedFilter Action:=xlFilterCopy _
, CriteriaRange:=Range("bv1:bv2"), CopyToRange:=Range("bt3"), Unique:=False
'volver a proteger hoja
ActiveSheet.Protect "978645312"
'activar parpadeo
Application.ScreenUpdating = True
End Sub

Aquí no veo que haya problemas en principio. Enviás las 3 col a distintos rangos filtradas por distintos criterios.

Tenés que revisar 2 detalles:

- Si la hoja "Export_cas" tiene o no alguna macro dentro del objeto HOJA, del tipo WorkSheet_Change o alguna otra. O quizás dentro del objeto ThisWorkbook algún evento que se ejecute para esta hoja.

2- Revisar el proceso: LimpiaMovdeMaq

Exactamente, la hoja "Export_cas" tiene escrito para llamar a FiltrarMovDeMaquinas

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("h4:j8000")) Is Nothing Then
FiltrarMovDeMaquinas
End If
End Sub

y limpiamovdemaq la tengo escrita asi, se encuentra dentro del modulo1

Sub LimpiaMovdeMaq()
'
' Limpia
' Macro grabada el 03/02/2014 por Julián
'Limpia mov de maq
'no parpadea
Application.ScreenUpdating = False
'apagar saltos de paginas
ActiveSheet.DisplayPageBreaks = False
'seleccionar pestaña
Sheets("Export_cas").Select
'desproteger hoja
ActiveSheet.Unprotect "978645312"
'borrar datos filtrados
Range("T3:bv8000").Select
Selection.Clear
Range("b4").Select
'volver a proteger hoja
ActiveSheet.Protect "978645312"
'avtiva parpadeo
Application.ScreenUpdating = True
End Sub

El problema no esta en la macro "FiltrarMovDeMaquinas" ? No importa que el filtro avanzado tenga como rango toda la columna en vez de el rango ? esta bien ubicada la macro "LimpiaMovdeMaq" dentro del modulo ? cada vez que se modifica un valor es necesario borrar los datos para que no se monten... entonces antes de iniciar los filtros se ejecuta la limpieza.

Gracias por tu ayuda!

- La macro de limpieza está bien dentro del filtrado. Quítale la última línea a la de limpieza. No actives la pantalla.

- La macro de Hoja tiene los rangos bien definidos que no interfieren con el destino del filtrado. Se ejecuta con cada cambio en celdas del rango H4:J8000

- La de filtrado puede ser acotada, indicando el rango en lugar de las columnas. Por ej:

Range("H1:J8000")

-Si la hoja tiene muchas fórmulas que se recalculan al moverlas, podes inhabilitar el modo de cálculo al inicio y volverlo a activar al finalizar.

Sub FiltrarMovDeMaquinas()
Application.Calculation = xlManual

y antes del End Sub:

Application.Calculation = xlAutomatic
End Sub

Esto es todo lo que se puede observar con las macros aquí expuestas.

Ahi va queriendo mejoro muchísimo. Ultima pregunta y la finalizo. Conviene crearle un nombre para que no llegue siempre hasta 8000 el rango del filtro avanzado ? A 8000 me llegaría si se cumplieran ciertas condiciones... generalmente trabajo con menos de 3000, usaba nombres cuando hacia estos movimientos con formulas... y prácticamente tardaba mas el calculo del nombre que todo lo demás. Es posible hacer referencias a nombres desdés el VB?

Es la última en esta entrada. Si luego necesitas algo más x favor en nueva consulta.

Podes establecer el rango buscando la última celda ocupada desde la col que siempre tendrá datos.

Por ej: si fuese H:

Range("H1:J" & range("65536").End(xlup).Row)

Hay varias maneras de obtener el fin de rango, este es solo 1 de ellas... podes encontrar otros ejemplos en la sección Macros de mi sitio.

Sdos

Elsa

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas