При открытии формы проверяй, открыта ли она, и если да, то копируй форму, и эту копию уже и открывай. Вот код для создания копии формы:
Код:
Dim saveCount As Integer
Const frmname = "ph_f_search_res_form"
Dim newname As String
If Not IsLoaded(frmname) Then
DoCmd.OpenForm frmname, , , , , , se_list.Column(1)
Else
On Error Resume Next
saveCount = saveCount + 1
newname = frmname & "-interm-" & saveCount
DoCmd.DeleteObject acForm, newname
DoCmd.CopyObject , newname, acForm, frmname
DoCmd.OpenForm newname, , , , , , se_list.Column(1)
Next
А вот функция, которая проверяет, открыта ли форма. Эта функция, если не ошибаюсь, есть в учебной базе Борей.
Код:
Function IsLoaded(ByVal strFormName As String) As Boolean
' Возвращает значения True, если форма открыта в режиме формы или таблицы.
Const conObjStateClosed = 0
Const conDesignView = 0
If SysCmd(acSysCmdGetObjectState, acForm, strFormName) <> conObjStateClosed Then
If Forms(strFormName).CurrentView <> conDesignView Then
IsLoaded = True
End If
End If
End Function
А при завершении работы программы можешь подчищать лишние копии формы:
Код:
On Error Resume Next
Const frmname = "ph_f_search_res_form"
Dim newname As String
Dim i As Integer
For i = 1 To saveCount - 1
newname = frmname & "-interm-" & i
DoCmd.DeleteObject acForm, newname
Next
Переменную saveCount, понятно, желательно объявить глобальной в той форме, которая производит открывание других форм.