Como utilizar menos memoria RAM al ejecutar un formulario macros en excel

Hola bueno lo que ocurre es que tengo unos formularios que al ejecutarlos la memoria ram de mi laptop se dispara hasta en ocasiones a 50 % y la maquina empieza a recalentar. Como puedo reducir la cantidad de memoria ram que utiliza mi macro?

les pego el codigo para que lo revisen

Dim campo1

Private Sub cmdsalir_Click()
Unload Me
End Sub


Private Sub CommandButton3_Click()
'copiando entradas en la hija SALIDAS
Worksheets("SALIDAS").Activate
Range("A2").Select
Do While ActiveCell.Value <> ""
ActiveCell.Offset(1, 0).Select
Loop
ActiveCell.Offset(0, 0).Value = txtcodigo.Text
ActiveCell.Offset(0, 1).Value = txtproducto.Text
ActiveCell.Offset(0, 2).Value = txtcantidad.Text
ActiveCell.Offset(0, 4).Value = cboarea
ActiveCell.Offset(0, 5).Value = txtfecha.Text
'copiando en la hoja saldo
Worksheets("SALDO").Activate
Range("a2").Select
Do While ActiveCell.Value <> ""
If ActiveCell.Value = txtcodigo.Text Then
ActiveCell.Offset(0, 2).Value = txtsaldo.Text
End If
ActiveCell.Offset(1, 0).Select
Loop
Worksheets("SALIDAS").Activate
'Borrando
txtcodigo = ""
txtcantidad = ""
txtsaldo = ""
If optionbutton1.Value Then
ActiveCell.Offset(0, 3).Value = optionbutton1.Caption
End If
If OptionButton2.Value Then
ActiveCell.Offset(0, 3).Value = OptionButton2.Caption
End If
If OptionButton3.Value Then
ActiveCell.Offset(0, 3).Value = OptionButton3.Caption
End If


End Sub

Private Sub optionbutton1_Click()
If optionbutton1.Value Then
txtcodigo = ""
txtproducto = ""
txtstock = ""
txtcantidad = ""
txtsaldo = ""
cboarea.Clear
cboarea.AddItem "SALA"
cboarea.AddItem "REUSO"
cboarea.AddItem "LIMPIEZA"
End If
End Sub

Private Sub OptionButton2_Click()
If OptionButton2.Value Then
txtcodigo = ""
txtproducto = ""
txtstock = ""
txtcantidad = ""
txtsaldo = ""
cboarea.Clear
cboarea.AddItem "SALA"
cboarea.AddItem "REUSO"
cboarea.AddItem "LIMPIEZA"
End If
End Sub

Private Sub OptionButton3_Click()
If OptionButton3.Value Then
txtcodigo = ""
txtproducto = ""
txtstock = ""
txtcantidad = ""
txtsaldo = ""
cboarea.Clear
cboarea.AddItem "ADMINISTRACION"
cboarea.AddItem "ASESORIA LEGAL"
cboarea.AddItem "CONTABILIDAD"
cboarea.AddItem "MANTENIMIENTO"
cboarea.AddItem "NUTRICION"
cboarea.AddItem "PSICOLOGIA"
cboarea.AddItem "CHIMBOTE"
End If
End Sub


Private Sub txtcantidad_Change()
If Not IsNumeric(txtcantidad.Text) And _
txtcantidad.Text <> “” Then
Beep
MsgBox ("Se debe ingresar solo números")

txtcantidad.Text = ""
txtcantidad.SetFocus
End If
txtsaldo.Text = Val(txtstock.Text) - Val(txtcantidad.Text)

End Sub

Private Sub txtcodigo_Change()
'SOLO SE PUEDEN INGRESAR NUMEROS
If Not IsNumeric(txtcodigo.Text) And _
txtcodigo.Text <> “” Then
Beep
MsgBox ("Se debe ingresar solo números")

txtcodigo.Text = ""
txtcodigo.SetFocus
End If
'BUSCANDO NUMERO DE PRODUCTO
For i = 1 To 350
If txtcodigo.Text = Sheets("PRODUCTOS").Cells(i + 1, 1).Value Then
'txtreal.Text = Sheets("PRODUCTOS").Cells(i + 1, 3).Value
txtproducto.Text = Sheets("PRODUCTOS").Cells(i + 1, 2).Value
txtstock.Text = Sheets("SALDO").Cells(i + 1, 3).Value


Exit For
End If
Next

End Sub

Private Sub txtfecha_Change()
Dim fecha As Date

End Sub

Private Sub TextBox1_Change()
'Por.DAM
Application.ScreenUpdating = False
campo1 = IIf(TextBox1 = "", "", TextBox1 & "*")
filtrar
Application.ScreenUpdating = True
End Sub

Private Sub filtrar()
'Por.DAM
'filtra los datos
Set t = Sheets("temp")
t.Cells.Clear
Set h2 = Sheets("PRODUCTOS")
With h2
u = .Range("A" & Rows.Count).End(xlUp).Row
With .Range("A1:E" & u)
If campo1 <> "" Then
.AutoFilter Field:=2, Criteria1:=campo1
.Copy t.Range("A1")
Else
Me.ListBox1 = ""
End If
End With
If .AutoFilterMode Then .Range("A1").AutoFilter
'If .FilterMode Then .ShowAllData
End With
u = t.Range("A" & Rows.Count).End(xlUp).Row
If u > 1 Then
ListBox1.ColumnHeads = False
ListBox1.RowSource = t.Name & "!A2:B" & u
End If
End Sub

1 respuesta

Respuesta
1

¿En qué momento se utiliza más memoria?

En las pruebas que realicé trabaja bastante rápido.

¿Tienes muchas imágenes en tus hojas?

¿Tienes abiertas otras aplicaciones?

Podemos descargar de memoria un par de variables, cambia el código que tienes en

Private Sub filtrar()

Por este código

Sub filtrar()
'Por.DAM
    'filtra los datos
    Set t = Sheets("temp")
    t.Cells.Clear
    Set h2 = Sheets("PRODUCTOS")
    With h2
        u = .Range("A" & Rows.Count).End(xlUp).Row
        With .Range("A1:E" & u)
            If campo1 <> "" Then
                .AutoFilter Field:=2, Criteria1:=campo1
                .Copy t.Range("A1")
            Else
                Me.ListBox1 = ""
            End If
        End With
        If .AutoFilterMode Then .Range("A1").AutoFilter
        'If .FilterMode Then .ShowAllData
    End With
    u = t.Range("A" & Rows.Count).End(xlUp).Row
    If u > 1 Then
        ListBox1.ColumnHeads = True
        ListBox1.RowSource = t.Name & "!A2:B" & u
    End If
    Set h2 = Nothing
    Set t = Nothing
End Sub

muchas gracias Dam, creo saber cual es el problema. Resulta que yo hago unos 150 registros diarios y la macros busca una celda vacia  desde la celda A2 hasta encontrar una vacia en donde colocar el nuevo registro , llegue al registro 1625 y al ejecutar la macro se dispara la memoria ram porque realiza la busqueda de una celda vacia desde la celda A2.

Private Sub CommandButton3_Click()

Worksheets("SALIDAS").Activate
Range("A2").Select
Do While ActiveCell.Value <> ""
ActiveCell.Offset(1, 0).Select

(la macro inicia a buscar desde la celda A2 hasta encontrar una celda vacia  es por eso que la memoria ram se dispara), he cambiado la macro hasta el registro actual, pero tendria que hacerlo siempre manualmente :/. hay alguna forma de aumentar el rango automaticamente ?

Worksheets("SALIDAS").Activate
Range("A1625").Select
Do While ActiveCell.Value <> ""
ActiveCell.Offset(1, 0).Select

Primer consejo, ya no utilices el "Do while" para obtener la celda vacía

Tienes esto:

Worksheets("SALIDAS"). Activate
Range("A2").Select
Do While ActiveCell.Value <> ""
ActiveCell.Offset(1, 0).Select
Loop

Con una instrucción puedes pararte en la última celda vacía, con esto:

Sheets("SALIDAS").Select
Range("A" & Range("A" & Rows.Count).End(xlUp).Row + 1).Select

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas