Una solucion es que desde el form1 o de inicio declares los formularios que vas a abrir desde alli, en la seccion declaraciones escribes:
dim form2 as new form2
Así cuando cierres el form2 éste se descargará de memoria.
Otra causa puede ser los objetos que usas en tu programa, éstos también hay que descargarlos, de eso no me acuerdo mucho pero sé que se hace con la función NOTHING, lee acerca de ella.
saludos.
<fin de texto>
Martín tiene razón, en cuanto a la atención que hay que presatr al cerrar formularios.
Tné en cuenta que si desde Form1 -> abris Form2, al cerrar Form2 con un Uload Me , se desencadena el evento Unload y QueryUnload, pero no Terminate, por cuanto la aplicación sigue en curso.
Después si en algún momento del Form1, haces referencia a una instancia del Form2, (Ej. If Form2.Caption o Form2.Label1.Enabled = false) lamentablmente estás reviviendo esa instancia y queda cargado en memoria pero no se muestra. Ello provoca que cuando vos cerrás el Form1, el Form2 sigue abierto, por lo que el Terminate no se desencadena nunca.
Las secuencias para terminar son Unload, QueryUnload. Terminate.
Con el Depurador, poné puntos de interrupción y seguí la secuencia de cierre.
Cuando cierres forms después del unload poné Set FormX = Nothing
de esa manera se borran de memoria todas las instancias de ese form.
Si usas OCX de terceros, tené en cuenta que puede ser que sus controles no se decarguen y por lo tanto mantengan tu aplicación en curso.
Una práctica non santa de algunos programadores es usar la sentencia End, para descargar toda la aplicación, de una manera tan te