Я не обязательно рекомендую это для текущей проблемы (хотя это может быть решение), но это может пригодиться в некоторых ситуациях, и это открыть форму с помощью acDialog + acHidden, изменить ее свойства, а затем установить .Visible = True. Это приводит к тому, что форма становится модальной в той точке, в которой она появляется, а не в точке, в которой она открыта. Таким образом, код выполняется до тех пор, пока форма не будет установлена в .Visible, а затем остановится, как это было бы только с аргументом acDialog в команде OpenForm:
DoCmd.OpenForm "dlgMyDialog", , , , , acDialog +acHidden
With Forms!dlgMyDialog
!cmbMyComboBox.Rowsource = ...
!cmdClose.Tag = "Modal"
.Visible = True ' <= code pauses here
End With
Это то, что вы можете использовать, когда вам нужно открыть модальную форму (с помощью acDialog) из другой формы, открытой с помощью acDialog. То есть откройте новый диалог с помощью acDialog + acHidden и в событии OnOpen дочерней формы установите .Visible = True и родительской (то есть вызывающей) формы .Visible = False. Чтобы перевести форму вызова в диалоговый режим, задайте .Visible = True формы вызова в событии OnClose дочерней формы.
Недостаток этого подхода, с моей точки зрения, заключается в том, что эти две формы должны слишком много знать друг о друге. Я предпочитаю, чтобы диалоговую форму можно было использовать из нескольких контекстов, что означает отсутствие зашитых ссылок на любую из форм, которые могут ее вызывать (и она может вызываться в контексте только кода, а не из другой формы). Но когда вам нужно сделать что-то подобное, это способ сделать это.