use Dim frm As Form

I'm constantly typing out the same long form references over and over again because I am not confident I know how to use Dim whatever As Form to refer to a main forms, subforms, subsubforms. Using these examples; how could I use As Form to refer to the form in the first, the sub in the second and the subsub in the third?


I'm Ok with strings but as soon as you get to As Form or As Control I need some clarification of when and how to use them.


Who is Participating?

[Product update] Infrastructure Analysis Tool is now available with Business Accounts.Learn More

I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Leigh PurvisDatabase DeveloperCommented:
Dim frmWhatever as Form

Set frmWhatever = Forms!frmMainInd
Debug.print frmWhatever!cboWhatever

Dim ctlWhatever as Control
Set ctlWhatever = frmWhatever!cboWhatever


A variable of type Form (or Object) can hold a pointer to any existing open form. You use it like this:

    Dim frmAny As Form

    Set frmAny = Forms!frmMainInd
    frmAny!cboWhatever.Value = Null   ' on main form

    Set frmAny = Forms!frmMainInd!fsubGrtOrg.Form
    frmAny!cboWhatever.Value = Null   ' on sub form

    Set frmAny = frmAny!fsubGrtApp.Form
    frmAny!cboWhatever.Value = Null   ' on previous' form subform...

The whole idea of objects is that you manipulate "pointers" to them. To create a new object, you use special instructions, and Access also creates new objects -- e.g. when you open a form. Form _variables_ however are merely pointers. Shortcuts if you like.

If you have a doubt about an object's type, you can ask in the immediate pane:

    ? TypeName( Forms!frmMainInd!fsubGrtOrg.Form!cboWhatever )

This means that you can create a variable of type Combobox to hold a pointer to that particular control. Some "family" objects exist, for example the type Control, that can point to any control, not just comboboxes.

If  you just want to avoid typing, you can use the "implicit variable" of the With contruct, as in:

    With Forms!frmMainInd!fsubGrtOrg.Form
        !cboWhatever.Value = Null
        .BackColor = vbRed
    End With

Every object starting with . or ! will be taken from the innermost With construct.

Does that help any?
If you want to take this a step further, forms with code modules have their own datatype.  This allows you to see the form's controls (using the auto entry feature) and public functions (if any) in the code view.

    Dim M As Form_frmMainInd
    Dim O As Form_fsubGrtOrg
    Dim A As Form_fsubGrtApp

    Set M = Forms!frmMainInd
    Set O = M.fsubGrtOrg.Form
    Set A = M.fsubGrtApp.Form

    M.cboWhatever.Value = Null   ' on main form ' Note the absence of the bang notation.
    O.cboWhatever.Value = Null   ' on sub form
    A.cboWhatever.Value = Null   ' on the other sub form
The 7 Worst Nightmares of a Sysadmin

Fear not! To defend your business’ IT systems we’re going to shine a light on the seven most sinister terrors that haunt sysadmins. That way you can be sure there’s nothing in your stack waiting to go bump in the night.

eliwilAuthor Commented:

thanks this is exactly what I was looking for. one question: how come the double bang in
Leigh PurvisDatabase DeveloperCommented:
You were looking for a With block?

The double bang just means that even EE Access Geniuses make typos ;-)
Thanks, Leigh ;)

The line just above is also wrong, it uses a non-existant property (forms have no .BackColor, sections and controls do) ...

If you are looking into With/End With, consider this:

    With Forms!frmMainInd!fsubGrtOrg.Form
        ' [do stuff on the form...]
        If !cboWhatever <> !txtSomeID Then
            !cboWhatever.Value = Null
        End If
    End With

It's tempting to write:

    With Forms!frmMainInd!fsubGrtOrg.Form
        ' do stuff on the form...
        With !cboWhatever
            If .Value <> !txtSomeID Then   ' <-- fails
                .Value = Null
            End If
        End With
    End With

This is one of the reasons why some programmers never use With/End With, and write instead:

    Dim frm As Form, cbo As ComboBox

    Set frm = Forms!frmMainInd!fsubGrtOrg.Form
    ' do stuff on the form (frm)...
    Set cbo = frm!cboWhatever
    If cbo <> frm!txtSomeID Then   ' <-- explicit!
        cbo.Value = Null
    End If
    Set cbo = Nothing
    set frm = Nothing

Of course, you can also mix both methods.


Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Microsoft Access

From novice to tech pro — start learning today.