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 :

interprétatoin fonction INDIRECT - Langue


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juillet 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2011
    Messages : 16
    Par défaut interprétatoin fonction INDIRECT - Langue
    Bonjour,
    j'ai réalisé une macro dernièrment qui permet de colorier le choix que l'on fait dans un menu déroulant (datavalidation).
    Il ne sagit pas de format conditionnel mais bien de Datavalidation avec dans certain cas l'emploi de la fonction "indirect" dans la datavalidation.

    Cette macro fonctionne très bien mais quand le fichier est envoyé à l'étranger.
    Elle bug uniquement quand la datavalidation utilise cette fameuse fonction "indirect".

    Après analyse avec mes collègues Espagnol, la fonction indirect se traduit par "indirecto".

    La ligne de commande que j'utilise interprète mal le tout puisque la fonction est comprise, je pense, en mode texte et non pas dynamique. La voici:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set References = Range(ActiveCell.Validation.Formula1)
    La solution de remplacer "indirect par indirecto" n'est pas pensable puisqu'il faudrait la traduire dans toutes les langues (puisque ces un fichiers WW).

    Merci d'avance aux "king" de VBA-Excel de votre aide.

    A toute fin utilse, voici la macro au complet:



    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
     
    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
     
    Dim Plage As Range, Noms As Range, CelNom As Range, Celcouleur As Range
    On Error Resume Next 'Permet d'arreter la macro sans message en d'erreur
     
    Set References = Range(ActiveCell.Validation.Formula1) 
    If Sh.Name = ("Configurator") Then 'Feuille du classeur avec liste déroulante
        Set Plage = Range("D9:D25") 'Plage dans la feuille du classeur
     
    Else: Exit Sub
    End If
     
     
     
    If Not Intersect(Target, Plage) Is Nothing Then
        For Each CelNom In Intersect(Target, Plage)
            For Each Celcouleur In References
     
                   If CelNom = Celcouleur Then
                        CelNom.Interior.ColorIndex = Celcouleur.Interior.ColorIndex
                        CelNom.Font.ColorIndex = Celcouleur.Font.ColorIndex
                        Exit For
                   End If
     
                   If CelNom <> Celcouleur Then
                        CelNom.Interior.Color = 255
                   End If
     
            Next Celcouleur
        Next CelNom
    End If
     
    End Sub

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Bonjour,

    Peut-être comme ceci (non testé) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        Formule = ActiveCell.Validation.Formula1
        Tabl = Split(Formule, "(")
        Tabl(0) = "=INDIRECT"
        Formule = Join(Tabl, "(")
        Set References = Range(Formule)

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juillet 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2011
    Messages : 16
    Par défaut
    Merci Daniel,

    J'ai bien compris le principe mais malheureusement cela ne fonctionne pas.
    Mais là je ne comprend pas pourquoi.

    Si tu peux encore m'aider, j'apprécierai fortement.

    A toute fin utile j'ai mis le fichier XLS en question et la macro en fichier TXT pour montrer mes bonnes intentions.

    Merci encore
    Pièces jointes en attente de validation Pièces jointes en attente de validation

  4. #4
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Bonjour,
    Bon, tes fichiers ont bien aidé à décanter le problème. Ma solution ne pouvait pas fonctionner; j'étais parti sur des formules commençant par "=INDIRECT". Par contre, ta macro se déclenche à chaque fois qu'on entre une donnée ou une formule dans une cellule, quelle que soit la feuille. Est-ce bien ce que tu veux ?
    Où sont les listes déroulantes (validation de données) contenant les formules incriminées ?

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juillet 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2011
    Messages : 16
    Par défaut
    Effectivement le but est que la macro se déclanche à chaque fois que l'on change qqchose dans l'onglet "Configurator" et en particulier dans le range D9:D25.
    Les fonction indirectes sont en D10, D13, D14, D17, D18, D19, D22, D23.
    Tu auras donc compris que les fonctions " SPLIT et JOIN" poseraient des problèmes puisque la fonction Indirect n'est pas utilisée pour chaque cellule du range (D9:D25)



    Les listes déroulentes se retrouvent respectivement dans les onglets "Specific configuration" et "Common configuration".

    Chaque encadrement specifie une zone nommée dont le nom (pour info) se trouve en bleu en dessous du cadre.

    Merci encore pour ton aide.

  6. #6
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    C'est difficile pour moi de tester... J'ai mis "INDIRECTO" par VBA dans la formule. Utilise le code suivant la formule avant et après modification s'affichera quand tu modifieras une liste de la feuille "Configurator" :

    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
    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
     
    If Intersect(Target, [D9:D25]) Is Nothing Then Exit Sub
    Dim Plage As Range, Noms As Range, CelNom As Range, Celcouleur As Range
    On Error Resume Next 'Permet d'arreter la macro sans message en d'erreur
     
    'Set References = Range("Empty_head") 'Reference = zone avec un nom de champ içi Empty Head
    'Dans notre cas de figure, il faut que la reference soit liée avec le nom de champ repris dans chaque datavalidation ce qui donne ceci
     
     
     
    ' solution pour interprétation de la fonction Indirect dans toutes les langues Excel INDIRECT-INDIRECTO-...
     
     
        formule = ActiveCell.Validation.Formula1
        Tabl = Split(formule, "(")
        '*** pour test
        Tabl(0) = "=INDIRECTO"
        MsgBox "formule initiale : " & Join(Tabl, "(")
        Tabl(0) = "=INDIRECT"
        formule = Join(Tabl, "(")
        MsgBox "formule corrigée : " & formule
        '***
        Set References = Range(formule)
     
     
     
    ' Set References = Range(ActiveCell.Validation.Formula1) 'Activecell.Validation.Formula1 est la commande qui permet de reprendre la formule dans la data validation de la cellule active
     
    If Sh.Name = ("Configurator") Then 'Feuille du classeur avec liste déroulante
        Set Plage = Range("D9:D25") 'Plage dans la feuille du classeur
    'ElseIf Sh.Name = ("3 quadri 2005") Then 'Exemple si tu veux mettre une autre feuille ou autre plage, voir ligne suivante
        'Set Plage = Range("D4:D33,H4:H34,L4:L33,P4:P34")
    Else: Exit Sub
    End If
     
    'ThisWorkbook.
     
    If Not Intersect(Target, Plage) Is Nothing Then
        For Each CelNom In Intersect(Target, Plage)
            For Each Celcouleur In References
     
                   If CelNom = Celcouleur Then
                        CelNom.Interior.ColorIndex = Celcouleur.Interior.ColorIndex
                        CelNom.Font.ColorIndex = Celcouleur.Font.ColorIndex
                        Exit For
                   End If
     
                   If CelNom <> Celcouleur Then
                        CelNom.Interior.Color = 255
                   End If
     
            Next Celcouleur
        Next CelNom
    End If
     
    End Sub

  7. #7
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juillet 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2011
    Messages : 16
    Par défaut
    Merci Daniel,


    on commence à touché au but.
    Mais comme évoqué au début, ce fichier va tourner sur toutes les versions de Excel (World wide). Chinois, Français, Espagnol, Allemand, ...

    Donc la solution de remplacer Indirecto par Indirect me semble lourd si on doit faire l'excercice pour toutes les langues Excel.
    Sans compter sur la version Chinoise.

    Avez-vous une autre idée.

  8. #8
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Par défaut
    Bonjour à tous.

    J'ai un gros doute quand au fond de ce problème.
    Les formules ne sont pas stockées en format texte dans Excel.
    Toute formule valide dans une langue sera automatiquement traduite si le fichier est ouvert sous un Excel d'une autre langue.

    Je passe régulièrement des fichier entre le boulot (Anglais) et chez moi (Français) et n'ai pas de problème.
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  9. #9
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juillet 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2011
    Messages : 16
    Par défaut
    J'ai modifié ta proposition par ceci.
    Mais je pense que cela ne fonctionne qu'avec un certain nombre de pays limité.
    En effet, cela marche uniquement si la traduction de indirect dans une autre langue commance par INDIR.

    Mais ceci à l'avantage de fonctionner même si la datavalidation ne fait pas appel à la fonction Indirect.

    Je suis ouvert à tous commentaires ou autres propositions.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        formule = ActiveCell.Validation.Formula1
        tabl = Split(formule, "(")
        '*** pour test
        If Left(tabl(0), 6) = "=INDIR" Then
            tabl(0) = "=INDIRECT"
            formule = Join(tabl, "(")
            Set References = Range(formule)
        Else
            Set References = Range(ActiveCell.Validation.Formula1)
     
        End If


    Merci d'avance

  10. #10
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Par défaut
    Je corrige ce que j'ai dit plus haut
    Les formules dans les cellules seront traduites.

    Il est possible que, dans les critères de validation, les formules soient stockées en texte.

    Il reste donc la solution de mettre les formules dont on a besoin dans une feuille cachée et d'aller lire leur contenu pour l'écrire dans les critères de validation.
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  11. #11
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Pour Duboisgs :
    Donc la solution de remplacer Indirecto par Indirect me semble lourd si on doit faire l'excercice pour toutes les langues Excel.
    Je me suis mal exprimé. Ôtes ce qui est entre commentaires :
    Rétablis le code comme il était. Le but de ma modification est de remplacer la première partie de la formule : "=" + nom local de la fonction INDIRECT (non reconnu par VBA par "=INDIRECT" qui lui, est reconnu.

  12. #12
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 127
    Par défaut
    Salut

    Une question me turlupine, tes validation fonctionne quelque soit la langue du Excel utilisé?
    Si j'ai bien compris, les formules contenues dans les validations ne s'adaptent pas automatiquement à la langue de l'application Excel, donc les validations ne devraient pas fonctionner?

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  13. #13
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    @Qwazerty :

    Bonsoir,

    J'ai compris l'inverse : Excel les interprète bien et la traduction ne se fait pas dans VBA ? Faute de pouvoir vérifier...

  14. #14
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juillet 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2011
    Messages : 16
    Par défaut A tous
    C'est exactement cela Daniel,
    Excel fait la conversion automatiquement dans les différentes langues
    ex: la fonction Indirect (en Anglais) est directement traduit par excel Espagnol par INDIRECTO dans la datavalidation.
    A partir de ce moment, VBA lit le contenu de la formule de la datavalidation mais ne le converti plus vers l'anglais et donc maintient INDIRECTO.

    La solution de Daniel semble la bonne, encore un grand merci Daniel.

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/05/2008, 20h48
  2. Réponses: 3
    Dernier message: 09/10/2007, 02h50
  3. je ne sais pas utiliser la fonction "indirect"
    Par kingtang dans le forum Excel
    Réponses: 5
    Dernier message: 30/09/2007, 21h33
  4. redirection en fonction la langue
    Par Alex35 dans le forum ASP
    Réponses: 10
    Dernier message: 07/11/2006, 10h59
  5. Fonction INDIRECT avec variable sur n° de colonne
    Par mat.guillaume dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 30/08/2006, 18h04

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