All you need to do to reference your controls is watch your form variable. There are 4 places to look for your stuff:
1. at the root of your form object
2. in the .Controls property of your form object
3. in the .Form property of your form object
4. in the .Parent property of any item in your .Properties property
The bang just simply replaces the need to write the name of the control with quotes in a parentheses by looking at the object's items' name properties, which is why you should not use a bang if you're programmatically trying to access an object using its name. Here's an example of all this nonsense:
Code:
Sub GettingSubformNameInManyWays()
Dim theForm As Form
Set theForm = Forms("MainForm")
'----------------------------------
' Items in the root of the form object
Dim rootItem As Variant
For Each rootItem In theForm
Debug.Print rootItem.Name
Next
Debug.Print "Root appended: ", theForm!SubForm1.Name
'----------------------------------
' Items in the "Controls" property of the form object
Dim controlsItem As Variant
For Each controlsItem In theForm.Controls
Debug.Print controlsItem.Name
Next
Debug.Print "Controls property bang: ", theForm.Controls!SubForm1.Name
Debug.Print "Controls property no bang: ", theForm.Controls("SubForm1").Name
'----------------------------------
' Items in the "Form" property of the form object
Dim formItem As Variant
For Each formItem In theForm.Form
Debug.Print formItem.Name
Next
Debug.Print "Form property bang: ", theForm.Form!SubForm1.Name
Debug.Print "Form property no bang: ", theForm.Form("SubForm1").Name
'----------------------------------
' Items in the "Properties" property of the form object have
' a "Parent" property where you can also get references
' here's an example of how from the "Caption" property
' but could be any other property there, like "PopUp" or whatever
Debug.Print "From the parent bangs", theForm.Properties!Caption.Parent!SubForm1.Name
Debug.Print "From the parent no bangs", theForm.Properties("Caption").Parent("SubForm1").Name
End Sub