In all honesty this question intreged me, so I tested it.
Public Class Form1
Private frm As Form2
Private Sub Button1_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles Button1.Click
frm.Controls.Remove(frm.Button1)
End Sub
Private Sub Button2_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles Button2.Click
frm.Show()
End Sub
End Class
That gives a null reference exception, so the only way to do this is to create the
dim frm as form2
as
dim frm as new form2
thus allowing the action to be performed. So to answer your question the form has to be instantiated for the action to be completed.
And yes I agree that this isn't the best way to do such actions. I would prefer to pass a flag of some description and remove the control on the new or loading methods depending on the overall logic of the form manipluation