This page focuses specifically on creating and using custom dialog boxes using MS Access 97.
Overview
DoCmd.OpenForm "FormName", , , , , acDialog, "Passed Parameter"The calling form even waits until the dialog box is closed.
The problem is how to get data back from it.
tempStr = Forms![Form Name]!FieldName.Value ' Either . or ! tempStr = Forms("Form Name").FieldName.Value ' Either . or ! tempStr = Forms(DialogName).Form.Tag ' The dot is requiredUnfortunately, when a dialog box is closed, there is no form to get the data from.
The solution is simple - don't Close the dialog, just Hide it. Of course, the help explicitly says "other windows in Microsoft Access are disabled until you close the form". (Suprise - the help is wrong.)
Returning Values via Form.Tag
Private Sub OK_UIButton_Click() ' Hide dialog box so the parameters are still available Me.Visible = False Tag = ProductID.Value End Sub Private Sub Cancel_UIButton_Click() ' Hide dialog box so the parameters are still available Me.Visible = False Tag = -1 End SubHowever, if you just hide the form, the next time it is called, the calling code usually won't wait until the user enters new data. (I've seen it both ways.) As a result, it is necessary for the calling form to actually close the dialog box after the data has been read.
Private Sub Command3_Click() Dim tempStr As String Dim ResultFlag As String Dim DialogName As String DialogName = "Locate Product" ' The name of the dialog box tempStr = ProductID.Value ' Parameter used by the dialog box 'DoCmd.OpenForm "FormName", , , , , , "Passed Parameter" DoCmd.OpenForm DialogName, , , , , acDialog, tempStr ResultFlag = Forms(DialogName).Form.Tag ' Uses String 'ResultFlag = Forms![Locate Product].Form.Tag ' Alternate syntax 'Unbound_UIField.Value = ResultFlag ' for test only If ResultFlag <> Str(-1) Then ' Test that OK was pressed tempStr = Forms(DialogName)!ProductID.Value ProductID_UIEdit.Value = tempStr End If ' Without an explicit "DoCmd.Close", ' * The dialog box's Form_Open is run only ' the first time "DoCmd.OpenForm" is called ' * When the form is merely hidden, ' "DoCmd.OpenForm" does not always wait for the ' user to hide the dialog box - very unpredictable DoCmd.Close acForm, DialogName End Sub
If you elect to return a button ID via Form.Tag, then I suggest using either string values or the standard MsgBox constants (vbOK vbCancel vbAbort vbRetry vbIgnore vbYes vbNo - with values from 1 to 7).
Using a Module
' This routine accepts the name of the dialog box (form) ' and a single ID value. It returns returns the original value ' if either Esc or Cancel is pressed, otherwise, it returns ' the new value Public Function OpenDialogBox_Int_MC _ (DialogName As String, CurrentValue As Integer) As Integer Dim ResultFlag As String DoCmd.OpenForm DialogName, , , , , acDialog, CurrentValue ResultFlag = Forms(DialogName).Form.Tag If ResultFlag <> Str(-1) Then ' Test that OK was pressed OpenDialogBox_Int_MC = ResultFlag Else OpenDialogBox_Int_MC = CurrentValue End If DoCmd.Close acForm, DialogName End FunctionThis only accepts and returns a record ID (long integer), a separate routine (OpenDialogBox_Str_MC) accepts and returns string identifiers (used for short lists, <50 elements - I have no idea what I ment by this). Call this routine with something similar to
tempInt = OpenDialogBox_Int_MC("DialogBoxName", RecordID)
I use _MC (ModuleCode) to indicate code that I've written which is located in a module. This just makes it a little easier for other people to read my code.
There are several techniques to get data back from a dialog box
References and Related Information