• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1483
  • Last Modified:

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.


1 Solution
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
Ultimate Tool Kit for Technology Solution Provider

Broken down into practical pointers and step-by-step instructions, the IT Service Excellence Tool Kit delivers expert advice for technology solution providers. Get your free copy now.

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.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Get your problem seen by more experts

Be seen. Boost your question’s priority for more expert views and faster solutions

Tackle projects and never again get stuck behind a technical roadblock.
Join Now