Hola.
El problema del espacio de pila, no son las variables, sino la forma en que las utilizas.
Veamos, la pila es un espacio de memoria de tamaño limitado cuyo cometido es acceder muy rápidamente a su contenido o bien contener los punhtos de ruptura de la secuencia de los programas, para retornar al punto siguiente una vez terminado el ciclo de una estructura (función, sub,evento...). Esto pués supone una ventaja y un inconveniente. La ventaja es que usando la pila el acceso alos datos es más rápido, el inconveniente es que como el espacio es limitado hay que asegurarse que no ocupamos todo el espacio de pila.
Tienes que examinar tu código y buscar donde haces operaciones de recursividad (que es cuando más facilmente puedes desbordar la pila sin darte cuenta).
Por ejemplo, el sigueinte código me produce el desbordamiento de la pila (se pone un botón que llama a una rutina:
cuando aparece el problema de la pila d vale 5568 (en mi sistema).
Private Function sumar() As Double 'esta función producirá desbordamiento
Static d As Double
d = d + 1
If d = 6000 Then Exit Function
Call sumar
sumar = d
End Function
Private Sub Command1_Click()
msgbox(sumar)
End Sub
Lo que sucede es que tras cada llamada a la rutnina contar, el sistema debe almacenar en la pila el punto del SALTO a la rutina contar, para que al término de la misma pueda retornar, pero sucede que tras un salto, sucede otro y orro y otro ... por tanto el espacio de pila se queda agotado o al menos el sistema detecta que se puede quedar agotado, porque ha entrado en un bucle que parece sin fin (en este caso concreto). ya que el desboramiento se produce cuando d vale 5568 no llega a alcanzar el valor 6000, que es cuando la pila se empezaría a vacíar tras empezar a devolver los puntos de retorno, de hecho si pusiéramos el valor 5567 en la comprobación de d, habríamos llegado al límite sin superarlo...
La solución consiste en resolver el problema con otro enfoque , en el ejemplo sería cuestión de usar una estructura for...next para evitar esto... (sin eliminar aquella función creamos otra similar para ver las diferencias)
Private function contar() as double 'esta función NO producirá desbordamiento
Dim d As Double
For d = 0 To 6000
d = d + 1
Next
End Sub
Private Sub Command1_Click()
msgbox(contar) 'no da error
msgbox(sumar) 'dará error de desbordameinto de pila
End Sub
Private Function sumar() As Double 'esta función producirá desbordamiento
Static d As Double
d = d + 1
If d = 6000 Then Exit Function
Call sumar
sumar = d
End Function
Es decir el bucle for next almacena en la pila (suponiendo que se almacene) sólo 1 variable (el valor del límite)...que se consulta con cada next y se elimina de la pila al salir del bucle.
Así tu problema posiblemente esté en que abres archivos y abres y abres y abres, cuando lo ideal es abrir y cerrar ; si es necesario abrir y abrir sin cerrar, debes asegurarte que esto no se aplique a un número muy grande ... La forma rápida y segura de desbordamiento es anidar a un nivel profundo...
Aunque el problema no lo tuevieres en los archivos es similar.... un problema de anidación o de múltiples llamadas a funciones, eventos, subrutinas, doevents,etc.. sin generarse el retorno para ir vaciando la pila.