Cómo saber si un formulario está abierto en Access

formulario está abierto, accessOs mostramos algunas funciones que nos permiten saber si un formulario está abierto en Access.

Os mostramos algunas funciones que nos permiten saber si un formulario está abierto, ésto es muy útil para cuando tenemos que interactuar con otro formulario y que en caso de que esté cerrado no nos de el consiguiente error.
Por ejemplo, yo lo uso en los formularios de búsqueda de clientes y de productos, desde el formulario de albaranes llamo al formulario buscador de clientes y traspaso el cliente deseado con esa condicion " si está abierto", lo mismo con los formularios de facturas y otros.

Para ello hay varias formas y la más sencilla sería ésta:

If CurrentProject.AllForms("NombreDelFormulario").IsLoaded Then
..........
End if

Y luego otras formas a través de funciones, ésta sería una:

Function IsLoaded(ByVal strFormName As String) As Integer
' Devuelve True si el formulario que se pasa como parámetro está abierto en modo formulario u hoja de datos

' Estas variables se usan como comprobar el valor devuelto por la función  SysCmd
'  y la propiedad CurrentView del formulario
    Const conObjStateClosed = 0
    Const conDesignView = 0

    'El primer If usa la función SysCmd function prar comprobar el
    'estado del formulario. Puede ser: no abierto,
    'o no existente, abierto, nuevo, o modificado sin salvar
    If SysCmd(acSysCmdGetObjectState, acForm, strFormName) <> conObjStateClosed Then
      
        'El segundo If comprueba la vista actual del formulario,
        'asumiendo que el If anterior lo encontró abierto
        'Si el formulario está abierto en modo formulario, la función devuelve
        'verdadero. Si está en modo diseño devuelve falso
        If Forms(strFormName).CurrentView <> conDesignView Then
            IsLoaded = True
        End If
  
    End If
  
End Function

Y ésta otra:

Public Function EstaAbierto(ByVal strObjeto As String, Tipo As AcObjectType) As Boolean

On Error GoTo EstaAbierto_TratamientoErrores

Select Case Tipo
   Case acForm
      If CurrentProject.AllForms(strObjeto).IsLoaded Then EstaAbierto = True
   Case acReport
      If CurrentProject.AllReports(strObjeto).IsLoaded Then EstaAbierto = True
End Select

EstaAbierto_Salir:
   On Error GoTo 0
   Exit Function
  
EstaAbierto_TratamientoErrores:

   Select Case err
      Case 2467
         MsgBox "El objeto indicado no existe o no es del tipo indicado", vbCritical + vbOKOnly, "ATENCION"
      Case Else
         MsgBox "Error " & err.Number & " en proc.: EstaAbierto de Módulo: Módulo3 (" & err.Description & ")"
   End Select
   Resume EstaAbierto_Salir

End Function

Uso:
If EstaAbierto("formFacturas", acForm) Then
....
End if

Categorías: