Foros del Web » Soporte técnico » Ofimática »

[ Excel VBA ] Importar UserForm, consume recursos de mas, Comoliberar memoria Excel?

Estas en el tema de [ Excel VBA ] Importar UserForm, consume recursos de mas, Comoliberar memoria Excel? en el foro de Ofimática en Foros del Web. Hola buenas tardes, la explicacion sera un poco larga, para ver si asi me puedo dar a entender mas facilmente. Miren se tiene una aplicacion ...
  #1 (permalink)  
Antiguo 13/08/2010, 11:56
Avatar de hugo180486  
Fecha de Ingreso: septiembre-2007
Mensajes: 199
Antigüedad: 16 años, 7 meses
Puntos: 3
Exclamación [ Excel VBA ] Importar UserForm, consume recursos de mas, Comoliberar memoria Excel?

Hola buenas tardes, la explicacion sera un poco larga, para ver si asi me puedo dar a entender mas facilmente.

Miren se tiene una aplicacion en VBA, viene siendo algo asi como un sistema reporteador. Para que se den una idea:
- Tiene 91 UserForms
- Y 37 Modulos
- Ademas de como 60 hojas

El detalle que el archivo ya pesaba cerca de 50MB, era muy pesado y funcionaba lento, ademas que nos tiraba muchos errores por tener tantos objetos, un ejemplo podira ser en las hojas, como el excel tiene limite de formatos, los reportes llevan su formatito ahora si para que se vean presentables, pero llegaba un momento que te tiraba el error de no permitir mas formato.

Ademas de perder variables cuando antes no se perdian etc, etc...

Entonces nos parecio buena idea Importar Dinamicamnete los USer FOrm, en 4 Grupos principales.
- 17 Primero
- 17 Segundo
- 27 Tercero
- Y 36 Cuarto..

De tal forma que nuestro archivo de 50MB quedo reducio a 3MB, todo ibamuy bien, los formularios se importae conforme los vallas a usar en la aplicacion, para irlo haciendo gradual y que el proceso no fuera lento los dividimos en grupos, lo haciamos individual, pero llegaba la hora que nos tirab el error que se menciona en las lineas de mas abajo, por eso pensamos que en grupos a lo mejor no lo sacaria.

El Detalle es que importo primero 17 a conganas sigue jalando, despues los 36 tobo bien, despues los 27 a con ganas, pero cuando llego los ultimos 17 va se cuelga y se queda trabado, verificando el Administrador de tareas se puede ver el CPU al 100 %... Nota: No necesariamente en ese Orden, podriamos decir que es en cualquier Orden, y por ahi de la Importacion 85 no importando el Orden se cuelga....

Bueno Ahora se cuelga Antes tiraba un error que decia mas omenos que no se podia referenciar el objeto que checaramos un log, checamos el log y esto es lo que aparece: Line 2: Property OleObjectBlob in UserForm could not be set. Lo anterior no es exclusivo de un Form...

La verdad no tengo ni idea, si alguien ha pasado por esto y logro solucionarlo bienvenido, si no me gustaria saber de algun metodo para liberar la memoria Exclusivamente de Excel (Que no se poner en un archivo Mystring=(80000000) por que no me funciona)...

Se que una Solucion es quitar UserFOrms para que no pese tanto, pero estos se ocupan asi, y se tendria que reestrucutrar todo el proyecto, lo cual no es posible, por eso pido si es que se puede alguna alternativa...

Posteo el codigo para importar los user form, si me le ven algun error ps con ganas...

De antemano muchas gracias por la atencion preestada...

Saludos.

Código vb:
Ver original
  1. Sub Importar_UserForm(ByVal sNombre As String, sfCarpeta As SubCarpeta_Formularios)
  2.    
  3.     Dim sSubCarpeta As String
  4.     Dim vbp         As Variant
  5.     Dim i           As Integer
  6.     Dim cont        As Integer
  7.     Dim bBand       As Boolean
  8.    
  9. On Error GoTo Importar
  10.    
  11.     Set vbp = Workbooks(Constantes.NameSystem).VBProject.VBComponents
  12.    
  13.     cont = 0
  14.    
  15.     For i = 1 To vbp.Count
  16.         cont = cont + 1
  17.         If vbp(cont).Type = 3 Then
  18.             If vbp.Item(cont).Name = sNombre Then
  19.                 bBand = True
  20.                 Exit For
  21.             End If
  22.         End If
  23.     Next
  24.    
  25.     '// Aqui  escojo como parametro las Carpetas de donde se puede obtener los Forularios
  26.    Select Case sfCarpeta
  27.         Case Is = 0
  28.             sSubCarpeta = "Carpeta1\"
  29.         Case Is = 1
  30.             sSubCarpeta = "Carpeta2\"
  31.         Case Is = 2
  32.             sSubCarpeta = "Carpeta3\"
  33.         Case Is = 3
  34.             sSubCarpeta = "Carpeta4\"
  35.     End Select
  36.    
  37.     If bBand = False Then
  38.         sNombre = sNombre & ".frm"
  39.         Application.VBE.ActiveVBProject.VBComponents.Import Constantes.PathForms & sSubCarpeta & sNombre
  40.         DoEvents
  41.     End If
  42.    
  43.     Set vbp = Nothing
  44.  
  45. Exit Sub
  46.  
  47. Importar:
  48. MsgBox Err.Description
  #2 (permalink)  
Antiguo 29/04/2011, 11:08
 
Fecha de Ingreso: abril-2011
Mensajes: 1
Antigüedad: 13 años
Puntos: 0
Respuesta: [ Excel VBA ] Importar UserForm, consume recursos de mas, Comoliberar memo

Hola Hugo, hasta ahora alcanzo a leer tu inquietud. Nose si ya hayas resuelto el problema.
Ante todo decirte que cuando el volumen de información es alto o la complejidad de los requerimientos de información lo ameritan, lo mejor es hacerse a un aplicativo mas apropiado. Excel tiene un limite y no está hecho para situaciones muy exigentes.

De todas formas si aún persistes en trabajar con excel te doy algunas ideas para que lo puedas lograr sin problemas:

1) PUEDES CREAR LOS FORMULARIOS EN TIEMPO DE EJECUCIÓN. ESTO ES, CREAR UNA MACRO QUE ANTE UNA SOLICITUD, CREE EL FORMULARIO RESPECTIVO Y QUE ESTE EJECUTE LAS ACCIONES RESPECTIVAS. DE ESTA MANERA, YA NO TENDRÍAS 91 FORMULARIOS, SINO1, 2,3 O CUATRO A LO SUMO.

2) LOS DATOS O LA INFORMACIÓN QUE PUEDAS TENER ALMACENADA LOS PUEDES ALOJAR EN OTRO ARCHIVO DE EXCEL Y ACCEDER A ESOS DATOS DESDE TU FORMULARIO O HOJA DE CALCULO. TE DOY UN EJEMPLO DE CÓDIGO AL RESPECTO EN: http://www.xltoday.net/vba_ejemplos_excelaexcel.asp


3) NO ES NECESARIO HACER FORMULARIOS. OTRA ALTERNATIVA ES SIMULAR UN FORMULARIO EN UNA HOJA DE CALCULO. EXCEL TIENE MUCHAS OPCIONES DE DISEÑO PARA QUE UNA HOJA DE CALCULO QUEDE BIEN DISEÑADA Y QUE PAREZCA UN FORMULARIO. ASÍ TE AHORRAS EL PROBLEMA DE EXCESO DE OBJETOS.

4) PROCURA TRABAJAR CON VARIOS LIBROS, ESTO ES DIVIDE TODO EN VARIOS LIBROS DE TAL MANERA QUE PUEDAS ACCEDER A TODOS ELLOS DESDE UN LIBRO MATRIZ O PRINCIPAL. ESTE LIBRO PRINCIPAL SERIA COMO UN MENU.

Cualquier duda estoy a la orden.
Un saludo desde Colombia

LEWIS SARMIENTO
  #3 (permalink)  
Antiguo 30/04/2011, 18:48
 
Fecha de Ingreso: agosto-2007
Mensajes: 1.945
Antigüedad: 16 años, 8 meses
Puntos: 39
Respuesta: [ Excel VBA ] Importar UserForm, consume recursos de mas, Comoliberar memo

Segun las normas, no se puede revivir temas viejos. No se que tan viejo se refieren las normas, porque estas no ponen un limite, AHÍ ES DONDE TODOS NOSOTROS QUEDAMOS EN EL AIR.

Pero 8 meses es mucho ya
  #4 (permalink)  
Antiguo 01/05/2011, 18:48
Avatar de hugo180486  
Fecha de Ingreso: septiembre-2007
Mensajes: 199
Antigüedad: 16 años, 7 meses
Puntos: 3
Respuesta: [ Excel VBA ] Importar UserForm, consume recursos de mas, Comoliberar memo

Cita:
Iniciado por lewishsarmiento Ver Mensaje
Hola Hugo, hasta ahora alcanzo a leer tu inquietud. Nose si ya hayas resuelto el problema.
Ante todo decirte que cuando el volumen de información es alto o la complejidad de los requerimientos de información lo ameritan, lo mejor es hacerse a un aplicativo mas apropiado. Excel tiene un limite y no está hecho para situaciones muy exigentes.

De todas formas si aún persistes en trabajar con excel te doy algunas ideas para que lo puedas lograr sin problemas:

1) PUEDES CREAR LOS FORMULARIOS EN TIEMPO DE EJECUCIÓN. ESTO ES, CREAR UNA MACRO QUE ANTE UNA SOLICITUD, CREE EL FORMULARIO RESPECTIVO Y QUE ESTE EJECUTE LAS ACCIONES RESPECTIVAS. DE ESTA MANERA, YA NO TENDRÍAS 91 FORMULARIOS, SINO1, 2,3 O CUATRO A LO SUMO.

2) LOS DATOS O LA INFORMACIÓN QUE PUEDAS TENER ALMACENADA LOS PUEDES ALOJAR EN OTRO ARCHIVO DE EXCEL Y ACCEDER A ESOS DATOS DESDE TU FORMULARIO O HOJA DE CALCULO. TE DOY UN EJEMPLO DE CÓDIGO AL RESPECTO EN: http://www.xltoday.net/vba_ejemplos_excelaexcel.asp


3) NO ES NECESARIO HACER FORMULARIOS. OTRA ALTERNATIVA ES SIMULAR UN FORMULARIO EN UNA HOJA DE CALCULO. EXCEL TIENE MUCHAS OPCIONES DE DISEÑO PARA QUE UNA HOJA DE CALCULO QUEDE BIEN DISEÑADA Y QUE PAREZCA UN FORMULARIO. ASÍ TE AHORRAS EL PROBLEMA DE EXCESO DE OBJETOS.

4) PROCURA TRABAJAR CON VARIOS LIBROS, ESTO ES DIVIDE TODO EN VARIOS LIBROS DE TAL MANERA QUE PUEDAS ACCEDER A TODOS ELLOS DESDE UN LIBRO MATRIZ O PRINCIPAL. ESTE LIBRO PRINCIPAL SERIA COMO UN MENU.

Cualquier duda estoy a la orden.
Un saludo desde Colombia

LEWIS SARMIENTO
1 - Seria buena idea, para eso seria mejor diseñar una clase que te haga todo lo que quieras, pero en mi caso tendrias que dejarla superflexible, por que no todos los formularios son los mismos...

2 - Los datos no estan en Excel estan en una BD de SQL, el ADO lo conoszo muy bien, y un tip y agradeciento tu contestacion, si piensas usar varios libros e importar los datos, es mejor almacernar los datos en todo caso en Access pues el acceso a los datos se produce a mayor velocidad que a un Excel, ademas Access soporta mas instrucciones SQL que Excel...

3,4 - Si pero donde estyo se me exige un diseño supoerior a lo que puedes hacer con excel, entonces pues esa opcion no me sirve, por eso mismo tampoco uso tantos Exceles pues a los usuarios no les gusta tener tantos archivos en su PC...

Gracias por tu respuesta, Saludos desde Mexico...

Si alguine le sirve la solucinq que encontre, es que en el fromulario usen multipaginas asi en vez de tener 10 UserFOrm, tendrian 1 con 10 paginas, esto serviria...

Eviten usar tantos formatos en el ibor de Excel pues tronaria, si es posible los formatos en tiempo de ejecucion...

Última edición por hugo180486; 01/05/2011 a las 18:50 Razón: Una equivocacion

Etiquetas: excel, mas, memoria, recursos, vba
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:58.