IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

IHM Discussion :

[Formulaire][VBA]Référence à un sous-formulaire en VBA


Sujet :

IHM

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 4
    Points : 4
    Points
    4
    Par défaut [Formulaire][VBA]Référence à un sous-formulaire en VBA
    Bonjour,

    Première demande spécifique de ma part! Je suis un développeur Access d'excellent niveau mais là je nage dans la purée!

    J'ai créé une application bilingue à 100%. Au chargement de mes formulaires je fais appel à une fonction appelé ChangerLangue() à laquelle je passe le nom du formulaire (Me.Name). Je passe en revue tous les contrôles du formulaire afin de changer la valeur du ".Caption".

    Mon problème survient avec un sous-formulaire. Le nom du sous-formulaire ne dit rien à ma fonction. Et si j'essais de faire un "Set frm = Forms(MyForm)" d'une chaîne désignant un formulaire et un sous-formulaire et bien ça génère une erreur. Incompatibilité de type.

    Voici ma fonction. pLangue est une variable globale initialisée au démarrage en fonction de l'utilisateur (français = true, anglais = false)

    Merci de votre aide. Je donnerai plus de détails s'ils s'avèrent nécessaires. JM



    ChangerLangue(ByVal MyForm As Variant)
    Dim frm As Form
    Dim Ctrl As Control
    Dim strnom As String

    Set frm = Forms(MyForm)

    For Each Ctrl In frm.Controls

    Select Case Ctrl.ControlType
    Case acCommandButton, acLabel, acPage
    strnom = Nz(DLookup(IIf(pLangue = True, "[Francais]", "[Anglais]"), _
    "Libelle", _
    "[NomControle] =""" & Ctrl.Name & """ AND [NomFormEtat] ='" & frm.Name & "'"), "")
    Ctrl.Caption = strnom
    End Select
    Next Ctrl

    End Function

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 427
    Points : 520
    Points
    520
    Par défaut
    Bonjour et bienvenu,
    Suggestion peut être bête : as-tu placé ta méthode sur chargement du sous-formulaire ?

  3. #3
    Membre expert
    Avatar de mout1234
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 210
    Points : 3 228
    Points
    3 228
    Par défaut
    Bonjour,

    Tu lui envoies quoi comme valeur à ta fonction dans le cas d'un sous formulaire?


    Pour rappel, un sous formulaire ne fait pas partie de la collection Forms et ne peut donc être pointé par Forms(...). Tu dois donc prévoir un traitement spécifique pour ce sous formulaire ou, plus simplement, remplacer ton argument MyForm par un objet Form. A l'appel tu fournis Me!MonControlSF.Form.


    Je suis un développeur Access d'excellent niveau
    J'espère être à la hauteur
    ............................................................................................

    Dans l'intérêt de tous, ne posez pas de questions techniques par messages privés.

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 345
    Points : 23 805
    Points
    23 805
    Par défaut
    Suggestion : Mettre ta fonction de changement de langue dans ton sous-formulaire, déclenché au chargement.

    L'appel serait un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    call ChangerLangue(me)
    Si tu passes le form en paramètre pas seulement le nom tu ne devrai plus avoir à faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set frm = Forms(MyForm)
    tu pourrais faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For each c in MyForm.controls
    Accessoirement je te suggère la signature suivante pour ta fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ChangerLangue(ByVal MyForm As String)
    Typer ses variables fait partie des pratiques recommandées de programmation.

    Et si tu retiens mon idée la signature serait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ChangerLangue(MyForm As form)
    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  5. #5
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Bonjour,

    Sans me distinguer des réponses précédentes, mais pour résumer :
    - modifier la procédure : variable de passage de type form
    - à chaque ouverture de formulaire créer une instance pour ce formulaire et chacun de ses sous-formulaires
    -appeler la procédure avec ces instances.

    Bon courage,

    PGZ
    pluritas non est ponenda sine necessitate - Le rasoir d'Okham
    Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Réponses appréciées...
    Merci à tous,

    Je n'attendais pas autant de réponses en si peu de temps...

    J'avais déjà essayé de passer le formulaire plutôt que son nom en paramètre, mais dans la fonction, il ne considérait pas le sous-formulaire comme un objet Form...

    En fouillant j'ai découvert que l'objet .Subform existait!! (Jamais vu ni utilisé en plus de 10 ans de développement Access) Et ça fonctionne à merveille. Waouh! Merci de vos recommandations et idées mais je vais poursuivre avec cette solution. (Reste à tester avec un sous-formulaire de plus de deux niveaux)

    En passant, cette fonction de changement de noms d'étiquettes, de pages d'onglets et de boutons de commandes est très efficace et rapide. À mettre dans l'événement "Chargement" du formulaire car cet événement survient juste avant l'affichage à l'écran. Ce qui empêche de voir le changement à l'écran. (Même si c'est une fraction de seconde)

    J'ai dû créer aussi une fonction spécifique pour les Infobulles et les textes de barre d'état.

    Voici donc la fonction corrigée et fonctionnelle!

    Public Function ChangerLangueSF(ByVal MyForm As Variant, _
    ByVal MySubForm As Variant)

    Dim frm As Form
    Dim frmSub As SubForm
    Dim Ctrl As Control
    Dim strnom As String

    Set frm = Forms(MyForm)
    Set frmSub = frm.Form(MySubForm)

    For Each Ctrl In frmSub.Controls

    Select Case Ctrl.ControlType

    Case acCommandButton, acLabel, acPage

    strnom = Nz(DLookup(IIf(pLangue=True, "[Francais]", "[Anglais]"),
    "Libelle", _
    "[NomControle] =""" & Ctrl.Name & """ AND [NomFormEtat] ='" & frmSub.Name & "'"), "")
    Ctrl.Caption = strnom
    End Select
    Next Ctrl

    End Function

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 4
    Points : 4
    Points
    4
    Par défaut J'ai refait de nouveaux tests...
    Mes plus plattes excuses d'avoir fait fi de vos réponses.

    Je viens tout juste de tester la solution de marot_r et c'est beaucoup plus simple que la mienne...

    Ma fonction je l'appelais du formulaire principal pour traiter tous les sous-formulaires. La je l'appel de chaque formulaire sans notion d'objet Subform. Aussi efficace, moins de code! Goood!

    Merci encore à tous!

    Robbit

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 11/04/2008, 10h33
  2. Réponses: 5
    Dernier message: 19/11/2007, 14h27
  3. Réponses: 4
    Dernier message: 21/09/2007, 13h23
  4. Réponses: 11
    Dernier message: 02/05/2007, 08h56
  5. Réponses: 3
    Dernier message: 26/08/2006, 15h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo