** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Subformularios en control Ficha
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoSubformularios en control Ficha

 Responder Responder
Autor
Mensaje
GOOO Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 08/Mayo/2012
Localización: Guatemala
Estado: Sin conexión
Puntos: 358
Enlace directo a este mensaje Tema: Subformularios en control Ficha
    Enviado: 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
Arriba
mounir Ver desplegable
Colaborador
Colaborador


Unido: 09/Febrero/2009
Localización: Asturias-España
Estado: Sin conexión
Puntos: 6521
Enlace directo a este mensaje Enviado: 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.

Editado por mounir - 24/Octubre/2024 a las 09:56
Un Saludo.
Arriba
happy Ver desplegable
Moderador
Moderador


Unido: 29/Enero/2005
Localización: España
Estado: Sin conexión
Puntos: 3200
Enlace directo a este mensaje Enviado: 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
Arriba
GOOO Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 08/Mayo/2012
Localización: Guatemala
Estado: Sin conexión
Puntos: 358
Enlace directo a este mensaje Enviado: 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
Arriba
happy Ver desplegable
Moderador
Moderador


Unido: 29/Enero/2005
Localización: España
Estado: Sin conexión
Puntos: 3200
Enlace directo a este mensaje Enviado: 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
Arriba
GOOO Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 08/Mayo/2012
Localización: Guatemala
Estado: Sin conexión
Puntos: 358
Enlace directo a este mensaje Enviado: 28/Octubre/2024 a las 16:44
Gracias por la observación.

Podemos cerrar este hilo
Viendo se aprende y practicando se mejora
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable