Controles en un subformulario
Pregunta
¿Cuál es la manera correcta de llamar a un control que se encuentra dentro de un subformulario? Tengo un formulario llamado “Form1” que contiene un subformulario llamado “SubForm1”, que, a su vez, tiene una serie de controles enlazados a los datos de una tabla (llamados “campo1”, “campo2” y “campo3”). He utilizado este código
MsgBox "Valor del campo1: " & Me.SubForm1.campo1.Value
pero me aparece el mensaje de error “No se encontró el método o el dato miembro”. Esto me hace pensar que no estoy referenciando correctamente el subformulario o el control del subformulario. ¿Alguna pista al respecto?
Respuesta
Los subformularios son unos objetos un tanto especiales (y muy útiles, por cierto), pues representan al mismo tiempo dos objetos diferentes de base de datos.
Por un lado, un subformulario es un control dentro de un formulario, al igual que lo son por ejemplo un cuadro de texto, una etiqueta, un cuadro de lista o un cuadro combinado. Para referirnos a esta faceta del subformulario mediante código, basta que lo referenciemos como si fuera un control cualquiera. Por ejemplo, para hacer que un subformulario tenga el foco, verás que se hace igual que con un control cualquiera:
Me.SubForm1.SetFocus
o también, para conocer los campos relacionados entre el formulario principal y el subformulario
' conocer el campo del formulario relacionado con el subformulario
MsgBox Me.SubForm1.LinkMasterFields
' conocer el campo del subformulario relacionado con
' el formulario principal
MsgBox Me.SubForm1.LinkChildFields
Por otro lado, un subformulario también es un formulario con todas sus propiedades, métodos y eventos, así como con la posibilidad de contener a otros controles o, como es el caso que nos ocupa, contener controles enlazados a datos de una tabla o consulta.
Para referirnos a esta otra faceta de un subformulario debemos utilizar la propiedad “Form”. A través de esta propiedad tendremos acceso a esas propiedades, métodos y eventos propios de un formulario.
En el caso particular de los controles contenidos dentro de un formulario, podemos referirnos a ellos de diferentes maneras, ya que el subformulario tiene una colección Controls que además es la predeterminada. Por tanto, podemos acceder al control “campo1” del “SubForm1” del formulario “Form1” de estas formas equivalentes:
' estas cuatro llamadas son equivalentes y funcionarán todas por igual
Me.SubForm1!campo1
' o
Me.SubForm1("campo1")
' o
Me.SubForm1.Controls("campo1")
' o
Me.SubForm1.Form.campo1
Para el resto de propiedades, métodos y eventos, utilizaremos la propiedad Form del subformulario. De hecho, yo recomendaría siempre utilizar esa propiedad, pues de alguna manera hará el código un poco más claro.
Además de todo esto, al trabajar con subformularios debemos recordar la circunstancia de que aunque un subformulario es un formulario, cuando “ejerza” de subformulario dentro de otro formulario, Access no lo considerará como un formulario independiente, sino como un control “con privilegios”. Prueba de esto es lo que pasa con la relación de la colección Forms de Access y los subformularios. La colección Forms es utilizada por Access para controlar los formularios que están abiertos y, mientras un formulario “ejerza” como subformulario nunca aparecerá en esa colección. Pero basta con que abramos ese formulario/subformulario de manera independiente para que sea tenido en cuenta por la colección Forms.
En fin, el tema de los subformularios es realmente amplio.
Espero que esta exposición te pueda aclarar algunos aspectos, o por lo menos, te aclare cómo has de utilizarlos desde código. Son unas herramientas de verdad muy buenas, y vale la pena el poder sacarles partido.
Créditos
con el fin de dar a conocer el trabajo de uno de los más grandes en el mundo de Access en español, y tras solicitar su permiso, replico este artículo de Juan M Afán de Ribera. Todos los derechos y autoría corresponden a él. Access & VBA FAQ – Controles en un subformulario (archive.org)