Ver Mensaje Individual
  #1 (permalink)  
Antiguo 13/08/2010, 11:56
Avatar de hugo180486
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