2010-07-27 27 views
7

Como lo sugiere el título de mi pregunta, ¿cómo es posible recorrer todos los controles en un formulario, incluidos los subformularios?Cómo recorrer todos los controles en un formulario, incluidos los controles en un subformulario - Access 2007

Por ejemplo, yo utilizo el siguiente rutina secundario para ajustar el color de fondo de los controles con la etiqueta *

Public Sub colCtrlReq(frm As Form) 
' Sets background color for required field -> Tag = * 
Dim setColour As String 
setColour = RGB(255, 244, 164) 
Dim ctl As Control 
For Each ctl In frm.Controls 
     If ctl.ControlType = acTextBox Or ctl.ControlType = acComboBox Or ctl.ControlType = acListBox Then 
      If InStr(1, ctl.Tag, "*") <> 0 Then 
       ctl.BackColor = setColour 
      End If 
     End If 
Next ctl 
Set ctl = Nothing 
End Sub 

¿Cómo alterar este para atrapar a los controles en un subformulario? Gracias de antemano por cualquier ayuda o sugerencias.

Saludos Noel

+0

Otros han respondido a nuestra pregunta, pero que realmente debe cambiar esta situación: "Para Cada CTL en frm" - "Para cada ctl En frm.Controls". La colección predeterminada de un formulario es en realidad una unión de la colección Controles y campos, por lo que lo que ha escrito podría dar resultados inesperados. –

+0

Saludos David, gracias por el consejo, ha corregido el código anterior. – noelmcg

+0

Re comment ** "Por cada ctl en frm" ** - No pude reproducir este problema con Access 2010. – Fionnuala

Respuesta

12

Puede utilizar la recursividad

Public Sub colCtrlReq(frm As Form) 
'' Sets background color for required field -> Tag = * 
Dim setColour As String 
setColour = RGB(255, 244, 164) 
Dim ctl As Control 
For Each ctl In frm 
     If ctl.ControlType = acTextBox Or ctl.ControlType = acComboBox _ 
      Or ctl.ControlType = acListBox Then 
      If InStr(1, ctl.Tag, "*") <> 0 Then 
       ctl.BackColor = setColour 
      End If 
     ElseIf ctl.ControlType = acSubform Then 
      colCtrlReq frm(ctl.Name).Form 

     End If 
Next ctl 
Set ctl = Nothing 
End Sub 
+0

Un buen Remou, que se ve exactamente como la técnica que estoy buscando. – noelmcg

+0

@Remou hace [esto lograr su propósito] (http://stackoverflow.com/a/14415188/1389394)? :-) – bonCodigo

+0

Gran respuesta. Noté que puedes simplificar 'frm (ctl.Name) .Form' a' ctl.Form' (verificado en Access 2016). – MarredCheese

1

un acceso a la colección de controles del formulario propiedad del control de subformulario.

Tenga cuidado, el nombre del control de subformulario puede no ser el mismo que el nombre del objeto de formulario guardado.

Si el control de subformulario se llama SubformControlName, empezar desde aquí:

For Each ctl In frm!SubformControlName.Form.Controls 
    Debug.Print ctl.Name 
Next 

actualización: Desde su comentario, esto es lo que creo que estás buscando.

Si no conoce el (los) nombre (s) de su (s) control (es) de subformulario (s) por adelantado, puede identificar cuáles de los controles de su formulario son controles de subformulario en tiempo de ejecución.

For Each ctl In frm.Controls 
    If TypeName(ctl) = "SubForm" Then 
     Debug.Print ctl.Name & " is a SubForm" 
     For Each ctlSub in ctl.Form.Controls 
      Debug.Print ctlSub.Name 
     Next 
    End If 
Next 
+2

Cheers HAnsUp. Si no tenía el nombre (posiblemente nombres) de los subformularios en un formulario, ¿cómo podría recorrer los controles entonces? – noelmcg

Cuestiones relacionadas