Модальная форма ОЧЕНЬ отличается от диалоговой формы.
Модальные формы НЕ приводят к остановке вызывающего кода, а диалоговая форма делает.(не путайте два типа форм).
Чтобы «вернуть» ответ пользователя из диалоговой формы, просто установите форму visible = false вместо команды закрытия формы.Это выведет диалоговую форму из диалогового режима, и ваш код вызова теперь продолжится, и код вызова «свободен», чтобы проверить любые значения, введенные пользователем или скажем, из выпадающих списков, или флажков, или чего-либо еще.
Таким образом, ваш блок кода будет выглядеть следующим образом:
Private Sub Command0_Click()
Dim f As String
Dim strT As String
f = "formB"
DoCmd.OpenForm f, , , , , acDialog
If CurrentProject.AllForms(f).IsLoaded Then
' grab any values entered by user, or whatever buttons hit
strT = Forms(f).Text1
' etc. etc. etc. - grab values from that form
' don't forget to close the form
DoCmd.Close acForm, f
Else
' user canceled the form
' code goes here for user hitting your cancel button or "x"
End If
End Sub
И в вашей диалоговой форме кнопка «ОК» или «Закрыть» просто переходит:
Me.visible= False
Если пользователь нажмет вашу кнопку отмены, этот код будет:
Docmd.Close acForm
Так что, если пользователь нажимает «отмена» или даже «X»В верхнем правом углу вы считаете, что пользователь «выручил».Когда они это сделают, форма будет закрыта.
Таким образом, код после диалоговой части просто проверяет, является ли форма ОЧЕНЬ открытой (потому что ваша кнопка «ОК» делает видимым = false).
И поскольку форма ОСТАЕТСЯ открытой, товы можете получить значения ЛЮБОГО элемента управления - скажем, пользовательский текст, введенный в текстовое поле, значения из поля со списком, флажок или что-то еще.
Когда пользователь завершит работу, вызывающий код может свободно проверять иливозьмите любое значение (я) из этой формы.
Редактировать - 2-е решение, позволяющее "установку" значений.
Этот код будет работать:
Private Sub Command0_Click()
Dim f As String
Dim strT As String
f = "formB"
DoCmd.OpenForm f
Forms(f).Text1 = "Hello" ' set values on form
' now WAIT for user
Do While CurrentProject.AllForms(f).IsLoaded
If Forms(f).ok = True Then Exit Do
DoEvents
Loop
If CurrentProject.AllForms(f).IsLoaded Then
If Forms(f).ok = True Then
MsgBox "value return = " & Forms(f).Text1
Else
MsgBox "user cancel"
End If
DoCmd.Close acForm, f
Else
' cancel code goes here
MsgBox "user cancel"
End If
End Sub
Код для кнопки «ОК» в форме B теперь:
Me.Visible = False
Me.ok = True
И вам нужен общедоступный var «ok» в форме B. Например:
Option Compare Database
Option Explicit
Public ok As Boolean
Таким образом, кнопка отмены в форме B может просто закрыть форму.(вы можете закрыть форму - но не устанавливайте ok = True)