Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > IHM
IHM Ce forum est dédié aux questions relatives à la création de formulaires et d'états, avec ou sans code VBA, et macros.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/11/2010, 10h53   #1
Membre habitué
 
Inscription : janvier 2006
Messages : 99
Détails du profil
Informations personnelles :
Âge : 38

Informations forums :
Inscription : janvier 2006
Messages : 99
Points : 101
Points : 101
Par défaut Accès aux controles d'un sous-formulaire

Bonjour,

habituellement je n'ai pas de problème pour accéder aux contrôles d'un sous formulaire, mais là, je bute sur la syntaxe.
J'ai créé une procédure externe pour traduire les libellés d'un formulaire quelconque en différentes langues (les textes sont stockés en table).
Le nom de mon formulaire est donc une variable. De même, je ne suis pas certain de la présence d'un sous-formulaire dans le formulaire, encore moins de son nom.

Voilà mon code (version simplifiée, j'ai laissé de coté tous les traitements)

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Public Sub AfficherLangue(NomForm As String)

    Dim ctl As Control, subctl As Control
    
    For Each ctl In Forms(NomForm).Controls
        If (ctl.ControlType = acLabel) Then
            'je traduis...
        End If
        If ctl.ControlType = acSubform Then
            'si c'est un sous-formulaire, je dois lister tous les controles et traduire les étiquettes
            For Each subctl In Forms(NomForm).Control(ctl.Name).Form(ctl.SourceObject).Controls
                'je dois traduire les étiquettes...
            Next
        End If
    Next
end sub
Je bute donc sur la syntaxe de la ligne en rouge.

Merci d'avance à celui qui pourra m'éclairer.
Aegnor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2010, 14h35   #2
Rédacteur

 
Avatar de ClaudeLELOUP
 
Homme Claude LELOUP
Chercheur de loisirs (ayant trouvé !)
Inscription : novembre 2006
Messages : 5 234
Détails du profil
Informations personnelles :
Nom : Homme Claude LELOUP
Âge : 66
Localisation : Belgique

Informations professionnelles :
Activité : Chercheur de loisirs (ayant trouvé !)
Secteur : Finance

Informations forums :
Inscription : novembre 2006
Messages : 5 234
Points : 11 019
Points : 11 019
Bonjour,
Attention, je n'ai pas testé !
Ceci devrait fonctionner (en tout cas une piste)

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Public Sub AfficherLangue(NomForm As String)
 
    Dim ctl As Control, NomDuSousForm as string    
    For Each ctl In Forms(NomForm).Controls
        If (ctl.ControlType = acLabel) Then
            'je traduis...
        End If
        If ctl.ControlType = acSubform Then
            'si c'est un sous-formulaire, je dois lister tous les controles et traduire les étiquettes
            NomDuSousForm=ctl.name            
            AfficherLangue(NomDuSousForm)
        End If
    Next
end sub

NB dans ton code, il faudrait aussi testé "onglet" qui peut lui-aussi contenir un sub form.
ClaudeLELOUP est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2010, 15h20   #3
Membre habitué
 
Inscription : janvier 2006
Messages : 99
Détails du profil
Informations personnelles :
Âge : 38

Informations forums :
Inscription : janvier 2006
Messages : 99
Points : 101
Points : 101
Merci pour la piste, malheureusement, ça ne fonctionne pas (pourtant passer en récursif, c'était une bonne idée).
Et je sais pourquoi (enfin je crois) : lorsqu'on ouvre un formulaire A avec un sous-formulaire B à l'intérieur, le formulaire A fait partie de la collection Forms (collection des formulaires ouverts, je le rappelle pour les débutants) mais pas le formulaire B.
Du coup, lors du 2ème appel à la procédure, Access me répond qu'il ne trouve pas le formulaire B dans la collection Forms.
Dommage, la solution était élégante et me plaisait bien.

Une autre solution, peut-être ?

PS : pour les onglets, je n'avais pas oublié de les traiter (ni les boutons non plus) mais j'avais simplifié le code pour garder juste mon problème.
Aegnor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2010, 15h30   #4
Rédacteur

 
Avatar de ClaudeLELOUP
 
Homme Claude LELOUP
Chercheur de loisirs (ayant trouvé !)
Inscription : novembre 2006
Messages : 5 234
Détails du profil
Informations personnelles :
Nom : Homme Claude LELOUP
Âge : 66
Localisation : Belgique

Informations professionnelles :
Activité : Chercheur de loisirs (ayant trouvé !)
Secteur : Finance

Informations forums :
Inscription : novembre 2006
Messages : 5 234
Points : 11 019
Points : 11 019
ici, tu trouves un exemple pour boucler sur tous les sous-formulaires
http://www.developpez.net/forums/d97...e/#post5503957
ClaudeLELOUP est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2010, 17h03   #5
Membre habitué
 
Inscription : janvier 2006
Messages : 99
Détails du profil
Informations personnelles :
Âge : 38

Informations forums :
Inscription : janvier 2006
Messages : 99
Points : 101
Points : 101
Je vais regarder ça, je vous tiens au courant.
Aegnor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2010, 14h00   #6
Membre habitué
 
Inscription : janvier 2006
Messages : 99
Détails du profil
Informations personnelles :
Âge : 38

Informations forums :
Inscription : janvier 2006
Messages : 99
Points : 101
Points : 101
Malheureusement, je n'ai pas trouvé comment employer ton code.
Par contre, j'ai fini par trouver la syntaxe correcte pour la ligne :

For Each subctl In Forms(NomForm).Controls(ctl.Name).Form.Controls

Pour ceux que ça intéresserait, voici ma procédure pour traduire les libellés des formulaires en fonction d'une table de traduction (comportant 4 champs : Formulaire, Etiquette, Langue, Traduction) :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
Public Sub AfficherLangue(NomForm As String)
On Error GoTo erreur
 
    Dim trad As Recordset, Langue As String
    Dim ctl As Control, subctl As Control
    Dim frm As Form
 
    'on va chercher la langue de l'application stockée dans une table de paramètres utilisateur, par défaut anglais
    Langue = Nz(DLookup("ValeurTxt", "Parametres Utilisateur", "Parametre = 'Langage'"), "English")
 
    Set trad = CurrentDb.OpenRecordset("SELECT * FROM Traduction WHERE Langue ='" & Langue & "'")
 
    'le nom du formulaire pour commencer
    trad.FindFirst "(Formulaire='" & NomForm & "') AND (Etiquette ='Form Name')"
    Forms(NomForm).Caption = trad![traduction]
    'on balaie tous les contrôles un à un
    For Each ctl In Forms(NomForm).COntrols
        'les étiquettes
        If (ctl.ControlType = acLabel) Then
            trad.FindFirst "(Formulaire ='" & NomForm & "') AND (Etiquette ='" & ctl.Name & "')"
            ctl.Caption = trad![traduction]
        End If
        'les onglets
        If ctl.ControlType = acTabCtl Then
            For Each pg In ctl.Pages
                trad.FindFirst "(Formulaire ='" & NomForm & "') AND (Etiquette ='" & ctl.Name & "-page" & pg.PageIndex & "')"
                ctl.Pages(pg.PageIndex).Caption = trad![traduction]
            Next pg
        End If
        'les boutons
        If ctl.ControlType = acCommandButton Then
            If ctl.Picture = "(aucune)" Then
                trad.FindFirst "(Formulaire ='" & NomForm & "') AND (Etiquette ='" & ctl.Name & "')"
                ctl.Caption = trad![traduction]
            End If
        End If
        'les sous-formulaires
        If ctl.ControlType = acSubform Then
            For Each subctl In Forms(NomForm).COntrols(ctl.Name).Form.COntrols
                If (subctl.ControlType = acLabel) Then
                    trad.FindFirst "(Formulaire ='" & ctl.Name & "') AND (Etiquette ='" & subctl.Name & "')"
                    subctl.Caption = trad![traduction]
                End If
            Next
        End If
    Next
    trad.Close
    Set trad = Nothing
    Exit Sub
 
erreur:
    MsgBox err.Description
    Resume Next
 
End Sub
Il suffit ensuite d'appeler la procédure à l'ouverture de chaque formulaire :
Code :
1
2
3
4
5
Private Sub Form_Open(Cancel As Integer)
 
    AfficherLangue Me.Name
 
End Sub
Ma procédure n'est pas forcément exhaustive au niveau des cas possibles mais elle en traite la très grande majorité.
Aegnor est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 18/11/2010, 14h14   #7
Rédacteur

 
Avatar de ClaudeLELOUP
 
Homme Claude LELOUP
Chercheur de loisirs (ayant trouvé !)
Inscription : novembre 2006
Messages : 5 234
Détails du profil
Informations personnelles :
Nom : Homme Claude LELOUP
Âge : 66
Localisation : Belgique

Informations professionnelles :
Activité : Chercheur de loisirs (ayant trouvé !)
Secteur : Finance

Informations forums :
Inscription : novembre 2006
Messages : 5 234
Points : 11 019
Points : 11 019
Merci pour l'info

As-tu testé ce qui se passe si ton onglet contient un sous-formulaire ?
A mon avis, il échappe à l'énumération
ClaudeLELOUP est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2010, 17h52   #8
Membre habitué
 
Inscription : janvier 2006
Messages : 99
Détails du profil
Informations personnelles :
Âge : 38

Informations forums :
Inscription : janvier 2006
Messages : 99
Points : 101
Points : 101
Citation:
Envoyé par ClaudeLELOUP Voir le message
Merci pour l'info

As-tu testé ce qui se passe si ton onglet contient un sous-formulaire ?
A mon avis, il échappe à l'énumération
C'est aussi ce que j'aurais cru, mais en fait, non il est bien pris en compte. Apparement le sous-formulaire fait à la fois partie du formulaire et à la fois de l'onglet. L'objet est listé dans les 2 collections.
Tant mieux, ça facilite le code !
Aegnor est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h47.


 
 
 
 
Partenaires

Hébergement Web