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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 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 chevronné
    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
    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 : 56
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 210
    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

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 407
    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 confirmé 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 : 71
    Localisation : France

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

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    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

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

    Informations forums :
    Inscription : Mars 2007
    Messages : 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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 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