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 teminante que muchas veces provoca vuelcos de memoria indeseables.