Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

TCS et Excel Francais Anglais

10 réponses
Avatar
bcar
Bonjour,

Je génère des mises en forme conditionnelles à la volée.
Quand je veux mettre des paramètres plus complexes que des simples
égalités, cela pose un problème car il faut écrire la formule dans la
langue de l'application. Ce qui fait que je ne peux pas utiliser ma
fonction de génération dans un excel qui n'est pas dans la langue de
celui que j'ai utilisé pour écrire ma fonction.

Comment faire, sachant que je n'ai pas trop envie d'avoir un cas par
langue supporté par excel

Merci

10 réponses

Avatar
Daniel.C
Bonjour.
Utilise une fonction perso afin d'évaluer ta formule. Si tu utilises dans ta
condition:
=ENT(A1),
écris :
Formula1:="=gene(""=INT(A1)=8"")"
Avec la fonction :

Function gene(formule)
Application.Volatile
gene = Evaluate(formule)
End Function

Cordialement.
Daniel
"bcar" a écrit dans le message de news:
fjoqs2$h4r$
Bonjour,

Je génère des mises en forme conditionnelles à la volée.
Quand je veux mettre des paramètres plus complexes que des simples
égalités, cela pose un problème car il faut écrire la formule dans la
langue de l'application. Ce qui fait que je ne peux pas utiliser ma
fonction de génération dans un excel qui n'est pas dans la langue de
celui que j'ai utilisé pour écrire ma fonction.

Comment faire, sachant que je n'ai pas trop envie d'avoir un cas par
langue supporté par excel

Merci


Avatar
bcar
C'est une bonne idée, merci.

Cependant, les formules que j'écris sont fonction de la cellule sur
lesquelles elle s'appliquent (par exemple "=IsNA(RC)")

je suis par conséquent obligé de générer une mise en forme
conditionnelle par ligne (peu agréable à manipuler !)

Les fonctions offset et compagnie ne m'aident pas car je ne sais pas
comment faire référence à la cellule en cours dans mon expression qui
est dans ma mise en forme conditionnelle en mode A1


grossoModo j'aimerais avoir :
Call r.FormatConditions.Add(Type:=xlCellValue, Operator:=xlEqual,
Formula1:="=IsNA(RC)")

cela n'est pas possible à cause de la langue donc :
...Formula1:="=myEval(""IsNA(RC)"")")

avec
Public Function myEval(ByVal formula As String)
Application.Volatile
myEval= Evaluate(formula)
End Function


mais cela n'est pas possible du fait qu'evaluate ne fonctionne qu'en mode A1

Et là je suis un peu bloqué
Avatar
Daniel.C
Bonjour.
Exemple pour une plage :

Sub test1()
For Each c In Selection
c.FormatConditions.Add Type:=xlExpression, _
Formula1:="=gene(""=isna(" & c.Address & ")"")"
Selection.FormatConditions(c.FormatConditions.Count).SetFirstPriority
With c.FormatConditions(1).Interior
.PatternColorIndex = xlAutomatic
.Color = 255
.TintAndShade = 0
End With
c.FormatConditions(1).StopIfTrue = False
Next c
End Sub

Daniel
Function gene(formule)
Application.Volatile
gene = Evaluate(formule)
End Function


"bcar" a écrit dans le message de news:
fjtqa4$e96$
C'est une bonne idée, merci.

Cependant, les formules que j'écris sont fonction de la cellule sur
lesquelles elle s'appliquent (par exemple "=IsNA(RC)")

je suis par conséquent obligé de générer une mise en forme
conditionnelle par ligne (peu agréable à manipuler !)

Les fonctions offset et compagnie ne m'aident pas car je ne sais pas
comment faire référence à la cellule en cours dans mon expression qui
est dans ma mise en forme conditionnelle en mode A1


grossoModo j'aimerais avoir :
Call r.FormatConditions.Add(Type:=xlCellValue, Operator:=xlEqual,
Formula1:="=IsNA(RC)")

cela n'est pas possible à cause de la langue donc :
...Formula1:="=myEval(""IsNA(RC)"")")

avec
Public Function myEval(ByVal formula As String)
Application.Volatile
myEval= Evaluate(formula)
End Function


mais cela n'est pas possible du fait qu'evaluate ne fonctionne qu'en mode
A1

Et là je suis un peu bloqué


Avatar
bcar
Merci pour votre réponse.
Je m'étais déjà intéressé à la solution de la boucle, mais celle-ci ne
m'emballe pas trop car après cela oblige à manipuler les filtre 1 par 1
ce qui est assez pénible.

A la limite, je crois que je préférerais spécialiser la fonction en
suivant la langue de l'application (il faudrait juste que je me rappelle
comment connaître la langue) en me faisant une petite table de
traduction des fonctions et en supprimant la fonctionnalité si la langue
n'est pas connue.

Bonjour.
Exemple pour une plage :

Sub test1()
For Each c In Selection
c.FormatConditions.Add Type:=xlExpression, _
Formula1:="=gene(""=isna(" & c.Address & ")"")"
Selection.FormatConditions(c.FormatConditions.Count).SetFirstPriority
With c.FormatConditions(1).Interior
.PatternColorIndex = xlAutomatic
.Color = 255
.TintAndShade = 0
End With
c.FormatConditions(1).StopIfTrue = False
Next c
End Sub

Daniel
Function gene(formule)
Application.Volatile
gene = Evaluate(formule)
End Function


Avatar
bcar
En fait je crois que je vais faire quelque chose avec les formulaLocal,
je vous tiens au courant

Merci pour votre réponse.
Je m'étais déjà intéressé à la solution de la boucle, mais celle-ci ne
m'emballe pas trop car après cela oblige à manipuler les filtre 1 par 1
ce qui est assez pénible.

A la limite, je crois que je préférerais spécialiser la fonction en
suivant la langue de l'application (il faudrait juste que je me rappelle
comment connaître la langue) en me faisant une petite table de
traduction des fonctions et en supprimant la fonctionnalité si la langue
n'est pas connue.



Avatar
bcar
J'ai essayé de feinter excel en faisant ceci :
shDest.Cells(5, 9) = "=IsError(I6)" ' formule en Anglais
tmp = shDest.Cells(5, 9).FormulaLocal ' formule dans la langue d'Excel
r.FormatConditions.Add(Type:=xlExpression, Formula1:=tmp)

Parfois ça marche, mais souvent ça ne marche pas.
Je ne comprend pas pourquoi au lieu de retrouver systematiquement I6
dans ma formule de mise en forme conditionnelle je retrouve parfois des
valeur aléatoires du genre I6854 ou G41789 ou encore J6


En fait je crois que je vais faire quelque chose avec les formulaLocal,
je vous tiens au courant

Merci pour votre réponse.
Je m'étais déjà intéressé à la solution de la boucle, mais celle-ci ne
m'emballe pas trop car après cela oblige à manipuler les filtre 1 par 1
ce qui est assez pénible.

A la limite, je crois que je préférerais spécialiser la fonction en
suivant la langue de l'application (il faudrait juste que je me rappelle
comment connaître la langue) en me faisant une petite table de
traduction des fonctions et en supprimant la fonctionnalité si la langue
n'est pas connue.





Avatar
Philippe.R
Bonjour,
Si la référence à I6 doit être absolue pour toute la plage, il manque des $
dans "=IsError(I6)"
"=IsError($I$6)" devrait mieux convenir
--
Avec plaisir
http://dj.joss.free.fr/trombine.htm
Philippe.R
Pour se connecter au forum :
http://www.excelabo.net/mpfe/connexion.php
News://news.microsoft.com/microsoft.public.fr.excel
"bcar" a écrit dans le message de
news:fk5gap$p5b$
J'ai essayé de feinter excel en faisant ceci :
shDest.Cells(5, 9) = "=IsError(I6)" ' formule en Anglais
tmp = shDest.Cells(5, 9).FormulaLocal ' formule dans la langue d'Excel
r.FormatConditions.Add(Type:=xlExpression, Formula1:=tmp)

Parfois ça marche, mais souvent ça ne marche pas.
Je ne comprend pas pourquoi au lieu de retrouver systematiquement I6
dans ma formule de mise en forme conditionnelle je retrouve parfois des
valeur aléatoires du genre I6854 ou G41789 ou encore J6


En fait je crois que je vais faire quelque chose avec les formulaLocal,
je vous tiens au courant

Merci pour votre réponse.
Je m'étais déjà intéressé à la solution de la boucle, mais celle-ci ne
m'emballe pas trop car après cela oblige à manipuler les filtre 1 par 1
ce qui est assez pénible.

A la limite, je crois que je préférerais spécialiser la fonction en
suivant la langue de l'application (il faudrait juste que je me rappelle
comment connaître la langue) en me faisant une petite table de
traduction des fonctions et en supprimant la fonctionnalité si la langue
n'est pas connue.







Avatar
bcar
Non, ce serait trop facile !
La référence est une référence relative.
I6 représente la première cellule du range a mettre en forme
conditionnellement, c'est normalement comme cela que l'on fait lorsque
l'on est en mode A1. Il est vrai que j'ai mis I6 sans préciser, toute
mes excuses (cela dit en passant $I$6 fonctionne à tout les coups, mais
ce n'est pas le résultat que je veux obtenir).

Bonjour,
Si la référence à I6 doit être absolue pour toute la plage, il manque
des $ dans "=IsError(I6)"
"=IsError($I$6)" devrait mieux convenir


Avatar
bcar
Précisons cependant que tmp contient toujours bien "=esterreur(I6)"
(puisque mon excel est en Français) mais que quand je fait gérer les
mise en forme conditionnelle à partir du tableur ma formule est tout
autre, j'ai bien le "=esterreur" mais ce qui est entre parenthèse change
suivant je ne sais quelle règle ("(J7)", "(D1048576)" pile le nombre
de ligne d'excel par ailleurs, "XFC2", serait-ce le max de colonne
d'excel 2007 ? ...)

J'ai essayé de feinter excel en faisant ceci :
shDest.Cells(5, 9) = "=IsError(I6)" ' formule en Anglais
tmp = shDest.Cells(5, 9).FormulaLocal ' formule dans la langue d'Excel
r.FormatConditions.Add(Type:=xlExpression, Formula1:=tmp)

Parfois ça marche, mais souvent ça ne marche pas.
Je ne comprend pas pourquoi au lieu de retrouver systematiquement I6
dans ma formule de mise en forme conditionnelle je retrouve parfois des
valeur aléatoires du genre I6854 ou G41789 ou encore J6




Avatar
bcar
C'est bon, j'ai trouvé,

En fait pour la mise en forme conditionnelle, mieux vaut utiliser le
style LC même si la feuille est en mode A1 (bizarre !), c'est peut être
un Bug.
Ce qui nous donne :

Cells(1, 1) = "=IsError(D7)"
tmp = Cells(1, 1).FormulaLocal
tmp = Mid(tmp, 1, InStr(1, tmp, "("))
tmp = tmp + "LC)"
Call Cells.FormatConditions.Delete
Call r.FormatConditions.Add(Type:=xlExpression, Formula1:=tmp)
....

Bonjour,

Je génère des mises en forme conditionnelles à la volée.
Quand je veux mettre des paramètres plus complexes que des simples
égalités, cela pose un problème car il faut écrire la formule dans la
langue de l'application. Ce qui fait que je ne peux pas utiliser ma
fonction de génération dans un excel qui n'est pas dans la langue de
celui que j'ai utilisé pour écrire ma fonction.

Comment faire, sachant que je n'ai pas trop envie d'avoir un cas par
langue supporté par excel

Merci