Существует много способов передачи параметров в открываемую форму или отчет и возврата значений из вызываемой формы в основную, в частности:
использование строковых свойств формы OpenArgs и Tag.
Первые два метода достаточно очевидны, а вот последний требует немного более подробного описания.
Если необходимо передать какую либо информацию в открываемую методом OpenForm форму, то можно использовать аргумент OpenArgs:
DoCmd.OpenForm "Example", , , , , acDialog, "ABCD"
"Example" имя открываемой формы;
acDialog параметр, указывающий, что форму надо открывать в
модальном режиме (при этом следующая строка программы
будет выполнена только после закрытия формы, когда
результирующее значение уже будет выбрано);
"ABCD" передаваемая в OpenArgs информация.
Теперь строку OpenArgs можно использовать, например, в процедуре обработки события Load открываемой формы для установки текущей записи (предполагается, что поле ID - числовое).
Private Sub Form_Load()
On Error Resume Next
If OpenArgs <> "" Then
Me.RecordsetClone.FindFirst "ID = " & OpenArgs
Me.Bookmark = RecordsetClone.Bookmark
End If
End Sub
Возвращаемое из формы значение можно присвоить свойству формы Tag (строка до 2000 символов):
Tag = StringToReturn
Сделать это надо в процедуре обработки события нажатия кнопки, закрывающей форму. Если использовать событие закрытия формы, то данный способ не сработает. В итоге, фрагмент вызывающей программы может выглядеть так:
DoCmd.OpenForm "Example", , , , , acDialog, "ABCD"
ResultString = Form_Example.Tag
Далее, значение ResultString можно использовать, например, для присвоения значения какому либо полю главной формы. Если нужно указать, что пользователь отказался от изменений, нажав кнопку "Отмена" или просто закрыв форму, то можно присвоить свойству Tag пустую строку или исходное значение OpenArgs.
Если необходимо передавать не строковое значение, а число или дату, то придётся выполнить соответствующие преобразования.
Для передачи нескольких значений потребуется сформировать из них строку со специальными разделителями, а затем выбирать значения с помощью специальной функции, например, такой:
Const ArgsSeparator = "//"
Public Function GetArgument(strArguments As String, _
intArg As Integer) As String
On Error Resume Next
Dim intCounter As Integer
Dim iCurrPos As Integer
Dim strCurrArg As String
GetArgument = ""
For intCounter = 1 To intArg
If strArguments = "" Then Exit Function
iCurrPos = InStr(strArguments, ArgsSeparator)
If iCurrPos > 0 Then
strCurrArg = Left(strArguments, iCurrPos - 1)
strArguments = Mid(strArguments, iCurrPos + Len(ArgsSeparator))
Else
strCurrArg = strArguments
strArguments = ""
End If
Next intCounter
GetArgument = strCurrArg
End Function
Этот способ передачи параметров хорош тем, что не требует никаких дополнительных переменных и объектов, что особенно удобно в относительно простых ситуациях, например в календаре.