2010-07-27 4 views
7

Comme le suggère le titre de ma question, comment est-il possible de parcourir tous les contrôles d'un formulaire, y compris les sous-formulaires.Comment boucler tous les contrôles dans un formulaire, y compris les contrôles dans un sous-formulaire - Access 2007

Par exemple, j'utilise la routine ci-dessous sous pour définir la couleur d'arrière-plan des contrôles avec l'étiquette *

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 

Comment pourrait modifier ce pour attraper les contrôles dans un sous-formulaire? Merci d'avance pour toute aide ou pointeurs.

Vive Noel

+0

D'autres ont répondu à notre question, mais vous devriez vraiment changer ceci: "Pour chaque ctl Dans FRM" - à "Pour chaque ctl En frm.Controls". La collection par défaut d'un formulaire est en fait une union de la collection Controls and Fields, ce que vous avez écrit pourrait donner des résultats inattendus. –

+0

Salut David merci pour le conseil, ont corrigé le code ci-dessus. – noelmcg

+0

Re comment ** "Pour chaque ctl en frm" ** - Je ne pouvais pas reproduire ce problème avec Access 2010. – Fionnuala

Répondre

12

Vous pouvez utiliser récursion

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

Joli un Remou, qui ressemble exactement à la technique que je recherche. – noelmcg

+0

@Remou fait [cela atteindre son but] (http://stackoverflow.com/a/14415188/1389394)? :-) – bonCodigo

+0

Bonne réponse. J'ai remarqué que vous pouvez simplifier 'frm (ctl.Name) .Form' à' ctl.Form' (vérifié dans Access 2016). – MarredCheese

1

Accéder à la collection de contrôles de la propriété formulaire du contrôle de sous-formulaire.

Attention, le nom du contrôle de sous-formulaire peut ne pas être identique au nom de l'objet de formulaire enregistré.

Si votre sous-formulaire contrôle est nommé SubformControlName, commencer à partir d'ici:

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

Mise à jour: De votre commentaire, voici ce que je pense que vous cherchez.

Si vous ne connaissez pas le (s) nom (s) de vos contrôles de sous-formulaire à l'avance, vous pouvez identifier les contrôles de votre formulaire qui sont des contrôles de sous-formulaire au moment de l'exécution.

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

Acclamations HAnsUp. Si vous n'aviez pas le nom (éventuellement les noms) des sous-formulaires dans un formulaire, comment pourriez-vous boucler les contrôles alors? – noelmcg

Questions connexes