Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
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 23/12/2011, 14h22   #1
Invité de passage
 
Homme
Ingénieur qualité méthodes
Inscription : 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
Points : 0
Points : 0
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 :
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 :
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
duboisgs est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 23/12/2011, 15h20   #2
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
Bonjour,

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

Code :
1
2
3
4
5
    Formule = ActiveCell.Validation.Formula1
    Tabl = Split(Formule, "(")
    Tabl(0) = "=INDIRECT"
    Formule = Join(Tabl, "(")
    Set References = Range(Formule)
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 26/12/2011, 10h19   #3
Invité de passage
 
Homme
Ingénieur qualité méthodes
Inscription : 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
Points : 0
Points : 0
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
Type de fichier : xls Synoptic TECEO.xls
Type de fichier : txt macro VBA en mode TXT.txt
duboisgs est déconnecté   Envoyer un message privé Réponse avec citation 11
Vieux 26/12/2011, 10h39   #4
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
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 ?
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 26/12/2011, 11h10   #5
Invité de passage
 
Homme
Ingénieur qualité méthodes
Inscription : 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
Points : 0
Points : 0
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.
duboisgs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2011, 11h58   #6
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
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 :
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
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2011, 12h20   #7
Invité de passage
 
Homme
Ingénieur qualité méthodes
Inscription : 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
Points : 0
Points : 0
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.
duboisgs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2011, 12h35   #8
Modérateur
 
Avatar de AlainTech
 
Homme Alain Gerard
Consultant informatique
Inscription : mai 2005
Messages : 3 675
Détails du profil
Informations personnelles :
Nom : Homme Alain Gerard
Âge : 58
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique
Secteur : Finance

Informations forums :
Inscription : mai 2005
Messages : 3 675
Points : 7 665
Points : 7 665
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!
AlainTech est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2011, 12h37   #9
Invité de passage
 
Homme
Ingénieur qualité méthodes
Inscription : 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
Points : 0
Points : 0
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 :
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
duboisgs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2011, 12h56   #10
Modérateur
 
Avatar de AlainTech
 
Homme Alain Gerard
Consultant informatique
Inscription : mai 2005
Messages : 3 675
Détails du profil
Informations personnelles :
Nom : Homme Alain Gerard
Âge : 58
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique
Secteur : Finance

Informations forums :
Inscription : mai 2005
Messages : 3 675
Points : 7 665
Points : 7 665
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!
AlainTech est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 26/12/2011, 14h23   #11
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
Pour Duboisgs :
Citation:
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.
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 26/12/2011, 20h52   #12
Expert Confirmé Sénior
 
Avatar de Qwazerty
 
Homme Stéphane
La très haute tension :D
Inscription : avril 2002
Messages : 2 446
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Âge : 32
Localisation : France

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

Informations forums :
Inscription : avril 2002
Messages : 2 446
Points : 4 620
Points : 4 620
Envoyer un message via MSN à Qwazerty
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
HammerFest
Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer
Qwazerty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2011, 22h05   #13
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
@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...
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/12/2011, 09h47   #14
Invité de passage
 
Homme
Ingénieur qualité méthodes
Inscription : 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
Points : 0
Points : 0
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.
duboisgs est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h50.


 
 
 
 
Partenaires

Hébergement Web