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

Macros et VBA Excel Discussion :

Problème avec la definition des noms d'objet pour changer une valeur de caption


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2012
    Messages : 8
    Points : 4
    Points
    4
    Par défaut Problème avec la definition des noms d'objet pour changer une valeur de caption
    Bonjour

    J'ai besoin de faire une macro Excel qui permet de fonctionner en deux langues (francais - anglais)
    pour cela j'ai un tableau Excel qui regroupe les champs suivants dans la feuille "ToolLang"

    Type Object captionName English French
    Sheet Menu CmdCommande Test List Liste de test
    Form Bdtest boutonmarche Start Marche
    ...


    J'ai par la suite le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    Public Sub Translation()
    Dim i As Integer
    Dim ObjectName As String
    Dim CaptionName As String
    Dim CaptionText As String
    Dim Lang As Integer
     
    Lang = 1
    i = 0
     
    Do While (Sheets("ToolLang").Cells(i + 2, 1).Value > 0)
     
        If Sheets("ToolLang").Cells(i + 2, 1).Value = "Sheet" Then
            ObjectName = Sheets("ToolLang").Cells(i + 2, 2).Value
            CaptionName = Sheets("ToolLang").Cells(i + 2, 3).Value
            CaptionText = Sheets("ToolLang").Cells(i + 2, 3 + Lang).Value
            Sheets(ObjectName).CaptionName.Caption = CaptionText '<-- erreur ici
        End If
     
    Loop

    Le code n'accepte pas la dernière ligne alors que si j'entre le code si dessous, tout se passe correctement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets(ObjectName).CmdCommand.caption = CaptionText
    Si je comprend le nom CaptionName ne peut être défini comme une chaine de caractère. Mais alors comment faire car j'ai essayé plusieurs solutions sans réussir à trouver.

    MErci pour votre aide
    Benoit

  2. #2
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Bonjour,

    Essaie comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets(ObjectName).OLEObjects(CaptionName).Object.Caption = CaptionText
    LES FAQ OFFICE - LES COURS OFFICE - LES COURS EXCEL - LES LIVRES OFFICE - SOURCES VBA - ATELIER BRICOLAGE VBA

    Lorsque votre problème est solutionné, pensez à le signaler en cliquant sur le bouton au bas de la discussion.

  3. #3
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2012
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Merci Fring pour la réponse rapide et efficace. Ca marche très bien.

    Benoit

    Comme vous l'aviez peut être constaté, j'ai aussi des forms et là j'ai essayé votre solution et de broder avec mais pas de chance ça ne fonctionne pas dans ce cas là. Une petite idée?

    Cordialement
    Benoit

  4. #4
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Désolé je ne comprend pas ta question, tu peux préciser ?
    LES FAQ OFFICE - LES COURS OFFICE - LES COURS EXCEL - LES LIVRES OFFICE - SOURCES VBA - ATELIER BRICOLAGE VBA

    Lorsque votre problème est solutionné, pensez à le signaler en cliquant sur le bouton au bas de la discussion.

  5. #5
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2012
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Voila qqs précisions
    Dans la précédente formule je vérifie si l'objet se trouve dans une fenêtre "if ___.value = "sheet"
    Mais je dois aussi changer les langues de label et bouton dans des userform

    Donc je créé aussi une étape comme celle-ci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      If Sheets("ToolLang").Cells(i + 2, 1).Value = "Form" Then
            ObjectName = Sheets("ToolLang").Cells(i + 2, 2).Value
            CaptionName = Sheets("ToolLang").Cells(i + 2, 3).Value
            CaptionText = Sheets("ToolLang").Cells(i + 2, 3 + Lang).Value
            BdDoc.OLEObjects(CaptionName).Object.Caption = CaptionText  '<--- ca bloque ici
      End if
    J'ai essayé d'appliquer la même méthode mais sans succès. j'ai essayé de broder et trouver qqs astuces sur le net mais sans succès.
    Donc si tu as une piste, elle sera la bienvenue.

    Benoit

  6. #6
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Pour un contrôle sur un UserForm, la bonne syntaxe est la suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BdDoc.Controls(CaptionName).Caption = CaptionText
    LES FAQ OFFICE - LES COURS OFFICE - LES COURS EXCEL - LES LIVRES OFFICE - SOURCES VBA - ATELIER BRICOLAGE VBA

    Lorsque votre problème est solutionné, pensez à le signaler en cliquant sur le bouton au bas de la discussion.

  7. #7
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2012
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Merci encore pour cette réponse rapide.

    Ca fonctionne mais pour info j'observe qd même une différence entre les deux commandes. Dans mon code je lance la traduction des le lancement de l'application

    Pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets(ObjectName).OLEObjects(CaptionName).Object.Caption = CaptionText
    le texte traduit est changé directement dans le Caption. Si je ferme et que j'ouvre le fichier Excel sans executer le code. la dernière traduction reste active.

    Pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BdDoc.Controls(CaptionName).Caption = CaptionText
    lors de la première apparition de l'userform, la traduction apparait mais si je ferme la fenetre et que je la lance la nouveau. La traduction a disparu.

    Ma solution sera de lancer une traduction de l'userform a chaque ouverture de fenêtre. A moins qu'il y ait une autre solution qq part

  8. #8
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Oui pour un UserForm tu dois indiquer la traduction à chaque ouverture ou écrire la traduction voulue dans une cellule et faire référence à cette cellule lors de chaque ouverture du UserForm.
    LES FAQ OFFICE - LES COURS OFFICE - LES COURS EXCEL - LES LIVRES OFFICE - SOURCES VBA - ATELIER BRICOLAGE VBA

    Lorsque votre problème est solutionné, pensez à le signaler en cliquant sur le bouton au bas de la discussion.

  9. #9
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2012
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    je viens de m'atteler à la partie traduction de mon programme, j'ai encore une question car j'ai essayé la partie de code (qui fonctionnait bien) mais je ne m'étais pas rendu compte que cela ne répondait qu'à une partie du code

    si dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BdDoc.Controls(CaptionName).Caption = CaptionText
    je veux remplacer BdDoc par la variable ObjectName qui est une chaine de caractère peut être égale à "BdDoc" ou à d'autre nom de userform, comment puis je faire. J'ai essayé différentes méthodes (en créant une variable userform et en affectant un nom, ...) mais sans succès et là je sèche.

    As tu une idée Fring?

    Merci par avance

    Note complémentaire :
    J'ai essayé la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Set oUserForm = UserForms.Add(ObjectName)
     
    ' puis après
     
    oUserForm.Controls(CaptionName).Caption = CaptionText
    mais cela ne va pas car dès que j'applique la commande UserForms.Add, cela appelle l'affichage de la form (fonction initialize) et au début de celle-ci cela appelle la fonction de traduction donc ca tourne en rond.

  10. #10
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Tu peux faire comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim MonUSF As String
    'Dim CaptionName...etc...
     
    MonUSF = "BdDoc"
     
    With VBA.UserForms.Add(MonUSF)
        .Controls(CaptionName).Caption = CaptionText
        .Show
    End With
    LES FAQ OFFICE - LES COURS OFFICE - LES COURS EXCEL - LES LIVRES OFFICE - SOURCES VBA - ATELIER BRICOLAGE VBA

    Lorsque votre problème est solutionné, pensez à le signaler en cliquant sur le bouton au bas de la discussion.

  11. #11
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2012
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    le problème avec la commande VBA.UserForms.Add que j'ai déjà essayé c'est que cela appelle la fonction "initialize" de l'userform et au début de cette fonction j'appelle ma fonction de traduction laquelle contient ce fameux code VBA.UserForms.Add et qui le relance etc etc etc

    donc ca tourne en rond pour le code et ca ne tourne pas rond pour moi

  12. #12
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Si je comprend bien, il suffirait simplement de mettre, dans l'évènement Initialize
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.Controls(CaptionName).Caption = CaptionText
    LES FAQ OFFICE - LES COURS OFFICE - LES COURS EXCEL - LES LIVRES OFFICE - SOURCES VBA - ATELIER BRICOLAGE VBA

    Lorsque votre problème est solutionné, pensez à le signaler en cliquant sur le bouton au bas de la discussion.

  13. #13
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2012
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    je vais essayé d'être plus clair sur mon code. Déjà j'avais une partie du code de ma form dans UserForm_Initialize et rien dans UserForm_Activate ce qui était une grossière erreur de la première personne qui a fait le code. Merci pour ton commentaire qui m'a permis de réfléchir sur cela.

    Mais j'ai encore un souci avec ta fonction

    Donc j'ai modifié le code de l'userform BdDoc comme ceci (je n'ai plus de fonction UserForm_Initialize. De ce fait quand je lance VBA.UserForms.Add je n'ai plus de lancement de UserForm_Initialize.)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Private Sub UserForm_Activate()
        Application.ScreenUpdating = False
     
        ToolsManag.Translation ("BdDoc")
    ....
    End Sub
    Dans ma classe ClsToolsManagement (renommé ToolsManag) voici la partie de code Translation.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    56
    57
     
    Public Sub Translation(ObjectType As String)
    Dim i As Integer
    Dim ObjectName As String
    Dim CaptionName As String
    Dim CaptionText As String
    Dim Lang As Integer
    Dim FilterRange, LineRange As Range
    Dim VisibleRow As Integer
     
        Lang = 1
     
        Set oUserForm = UserForms.Add(ObjectType)
     
        'unlock worksheets
        Update.Unlock_sheets
     
        ActiveWorkbook.Sheets("ToolLang").Select
     
        'apply filter on the first row
        Sheets("ToolLang").Rows("1:1").Select
        Selection.AutoFilter Field:=2, Criteria1:=ObjectType
     
        'Define range of visible cells
        Set FilterRange = Sheets("ToolLang").UsedRange.SpecialCells(xlCellTypeVisible)
     
            For Each LineRange In FilterRange.Rows
     
                VisibleRow = LineRange.Row
                If LineRange.Row > 1 Then 'first line is only title so to ignore
     
                    'part to translate sheet object
                    If Sheets("ToolLang").Cells(VisibleRow, 1).Value = "Sheet" Then
                        ObjectName = Sheets("ToolLang").Cells(VisibleRow, 2).Value
                        CaptionName = Sheets("ToolLang").Cells(VisibleRow, 3).Value
                        CaptionText = Sheets("ToolLang").Cells(VisibleRow, 3 + Lang).Value
                        Sheets(ObjectName).OLEObjects(CaptionName).Object.Caption = CaptionText
                    End If
     
                    'part to translate user form
                    If Sheets("ToolLang").Cells(VisibleRow, 1).Value = "Form" Then
     
                        ObjectName = Sheets("ToolLang").Cells(VisibleRow, 2).Value
                        CaptionName = Sheets("ToolLang").Cells(VisibleRow, 3).Value
                        CaptionText = Sheets("ToolLang").Cells(VisibleRow, 3 + Lang).Value
     
                        With VBA.UserForms.Add(ObjectName)
                            .Controls(CaptionName).Caption = CaptionText
                            .Show
                        End With
                    End If
                End If
            Next
     
        'remove filter
        Sheets("ToolLang").AutoFilterMode = False
    End sub
    note ObjectType = ObjectName je dois encore optimiser le code

    Maintenant le pb est le suivant
    qd je lance
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    .Controls(CaptionName).Caption = CaptionText ' pas d'erreur mais le caption modifié ne s'affiche pas
    .show ' cette commande relance UserForm_Activate donc on fait on tourne en boucle.
    Dans le code si je remplace par DbDoc.Controls(CaptionName).Caption = CaptionText la mise à jour se fait tout de suite

  14. #14
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Je ne mettrais rien dans l'Initialize du UserForm mais je lancerais la procédure de traduction avant de l'initialiser.

    Au lieu de faire BdDoc.Show et la procédure de traduction par la suite, je ferais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub MaMacro()
    'BdDoc.Show
    Translation "BdDoc" '<-- BdDoc ou contenu d'une cellule
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub Translation(USF As String)
    'CaptionName...
    'CaptionText...
    With VBA.UserForms.Add(USF)
        .Controls(CaptionName).Caption = CaptionText
        .Show '<-- on initialise le UserForm après les traductions
    End With
    End Sub
    LES FAQ OFFICE - LES COURS OFFICE - LES COURS EXCEL - LES LIVRES OFFICE - SOURCES VBA - ATELIER BRICOLAGE VBA

    Lorsque votre problème est solutionné, pensez à le signaler en cliquant sur le bouton au bas de la discussion.

  15. #15
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2012
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Au final j'ai trouvé la solution.

    Premièrement j'ai découpé mon code de traduction en 2 (un pour les feuilles, un pour les formes
    J'ai tout de même laisser l'appel de la traduction dans la fonction initialize avec un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TlMg.TranslationUserForm Me
    et ma fonction est la suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Sub TranslationUserForm(FormName As Object)
    ...
    End sub
    Mais c'est vrai que j'ai vu des limites à utiliser des fonctions initialize. Je pense que je mettre cela dans une form_Load et faire
    En tout cas merci beaucoup pour ton aide Fring.
    Je ne sais pas is je serais capable de te rendre la pareille. Tu es plusieurs crans au dessus de moi

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

Discussions similaires

  1. Nom du slot pour changer la valeur d'une variable
    Par UnConfiantEtudiant dans le forum Débuter
    Réponses: 9
    Dernier message: 12/09/2014, 22h58
  2. [XL-2010] Problème avec la méthode find d'un objet Range dans une zone filtrée
    Par stargates01 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 28/02/2014, 23h27
  3. Réponses: 4
    Dernier message: 16/11/2009, 22h39
  4. Problème de casse des noms d'objets
    Par Lucas Panny dans le forum SQL
    Réponses: 18
    Dernier message: 10/06/2008, 13h51
  5. problème avec la persistance des objets
    Par gentil dans le forum Hibernate
    Réponses: 15
    Dernier message: 04/04/2007, 11h44

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