Imprimir página | Cerrar ventana

Subformularios en control Ficha

Impreso de: Foro de Access y VBA
Categoría: Access y VBA
Nombre del foro: Access y VBA
Descripción del foro: Foro de programacion en Access (Con código y sin código)
URL: http://www.mvp-access.com/foro/forum_posts.asp?TID=86999
Fecha de impresión: 26/Marzo/2026 a las 17:28


Tema: Subformularios en control Ficha
Publicado por: GOOO
Asunto: Subformularios en control Ficha
Fecha de publicación: 23/Octubre/2024 a las 22:48
Buen día.

Trataré de explicar mi consulta.

Tengo un formulario (principal) al que le tengo 1 control de ficha con 9 pestañas y en cada pestaña 9 subformularios desconectados. Tanto las pestañas como los subformularios está ocultos.

Tengo también, botones de comando que al clicarlos me hace visible la primera pestaña oculta con su respectivo subformulario; y carga en el subformulario con SourceObject el formulario del módulo que necesito mostrar, [lo que simula digamos un navegador].

En cada formulario [módulo] tengo un botón de cerrar, que prácticamente manda el foco al formulario principal, me oculta el subformulario actual donde está el botón de cerrar y su respectiva pestaña.

Para lo cual me apoyo con la siguiente función publica. "Ver mas abajo"

El problema radica en que a veces me lanza un error donde dice:

Se ha producido el error '2467' en tiempo de ejecución: 
La expresión que ha especificado hace referencia a un objecto que está cerrado o que no existe.

Específicamente en esta línea: If ctl.Form.Name = subForm.Name Then
en ctl.Form.Name.


Public Function ObtenerPaginaSubformulario(subForm As Form) As String
'On Error Resume Next
    Dim sForm As Form
    Dim tabControl As Control
    Dim tabPage As Page
    Dim ctl As Control

    ' Asume que el formulario principal se llama "_Principal"
    Set sForm = Forms("_Principal")
 ' Recorre los controles ficha para encontrar la página que contiene el subformulario
    For Each tabControl In sForm.Controls
        If TypeOf tabControl Is tabControl Then
            For Each tabPage In tabControl.Pages
                For Each ctl In tabPage.Controls
                    If TypeOf ctl Is subForm Then
                        If ctl.Form.Name = subForm.Name Then
                            ObtenerPaginaSubformulario = tabPage.Name
                            Exit Function
                        End If
                    End If
                Next ctl
            Next tabPage
        End If
    Next tabControl

    ObtenerPaginaSubformulario = "No está contenido en una página."
End Function

¿Alguna sugerencia o alternativa?.

Bueno si se puede entender. Confused

Nota:  ¿Cómo puedo subir una imagen?



-------------
Viendo se aprende y practicando se mejora



Respuestas:
Publicado por: mounir
Fecha de publicación: 24/Octubre/2024 a las 09:55
Hola!

Podría utilizar la instrucción "On Error Resume Next" antes de la "If ctl.Form.Name = subForm.Name Then".
Espero que te sirva.

-------------
Un Saludo.


Publicado por: happy
Fecha de publicación: 24/Octubre/2024 a las 16:15
Hola, si te sale ese error seguramente es porque en el momento en que consultas alguno de esos subformularios todavía no se le ha asignado la propiedad SourceObject, con lo que la propiedad .Form del subformulario no se ha creado y tampoco puedes extraer de ahí la propiedad .Name

No sé si me he sabido explicar bien ...


-------------
Saludos,

Juan M. Afan de Ribera


Publicado por: GOOO
Fecha de publicación: 24/Octubre/2024 a las 22:32
Gracias por sus respuestas.

mounir: pues lo de colocar "On Error", simplemente no me deja cerrar el formulario. SourceObject,
pero se tomó en cuenta.
happy: el botón para "cerrar" lo llamo desde el subformulario cargado.

con unos ajustes, hice las modificaciones al código, al parecer cumple lo que se necesita.

Public Function ObtenerPaginaSubformulario(subForm As Form) As String
    Dim parentForm As Form
    Dim ctrl As Control
    Dim nombreControl As String

    ' Obtener el formulario principal
    On Error Resume Next
    Set parentForm = subForm.Parent
    On Error GoTo 0

    ' Verificar si el Parent es un Subformulario
    If Not parentForm Is Nothing Then
        If TypeOf parentForm Is SubForm Then
            Set parentForm = parentForm.Parent
        End If

        ' Recorrer los controles del formulario principal para encontrar el subformulario actual
        For Each ctrl In parentForm.Controls
            If ctrl.ControlType = acSubform Then
                ' Comparar el SourceObject del control con el nombre del subformulario
                If ctrl.SourceObject = subForm.Name Then
                    nombreControl = ctrl.Name
                    Exit For
                End If
            End If
        Next ctrl
    Else
        nombreControl = "No se pudo obtener el formulario principal."
    End If

    ObtenerPaginaSubformulario = nombreControl
End Function


Se puece cerrar este tema.


-------------
Viendo se aprende y practicando se mejora


Publicado por: happy
Fecha de publicación: 25/Octubre/2024 a las 17:41
"happy: el botón para "cerrar" lo llamo desde el subformulario cargado."

Esto que me dices en realidad no tiene mucho que ver con lo que te explicaba. A lo que me refería es que si te aparecía ese error al realizar el bucle For Each Next

' Recorre los controles ficha para encontrar la página que contiene el subformulario
    For Each tabControl In sForm.Controls
        If TypeOf tabControl Is tabControl Then
            For Each tabPage In tabControl.Pages
                For Each ctl In tabPage.Controls
                    If TypeOf ctl Is subForm Then
' decias que el error se producía aquí
                        If ctl.Form.Name = subForm.Name Then

Esto quiere decir que el subformulario al que se hace referencia en ese 
ctl.Form.Name
en ese momento tiene la propiedad SourceObejct = "", y cuando un subformulario NO tiene asignada esa propiedad, tampoco tiene creada la propiedad .Form. Por eso aparece ese error

Si ya lo has solucionado de otra forma, entonces perfecto, pero era para aclarar cómo funcionan los subformularios en Access


-------------
Saludos,

Juan M. Afan de Ribera


Publicado por: GOOO
Fecha de publicación: 28/Octubre/2024 a las 16:44
Gracias por la observación.

Podemos cerrar este hilo


-------------
Viendo se aprende y practicando se mejora



Imprimir página | Cerrar ventana