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

MEFC VBA

10 réponses
Avatar
Daniel
Bonjour.
Je dois rater quelque chose. Suite à la question de Chocho, j'ai monté la
moulinette suivante :

Sub test1()
Dim c As Range, Teste, Formule As String, Couleuyr As Integer
For Each c In Range("D22:O24")
Var = c.Address
With c.FormatConditions(1)
Teste = .Type
Formule = .Formula1
couleur = .Interior.ColorIndex
End With
Var = Evaluate(Formule)
If Evaluate(Formule) = True Then
MsgBox "toto"
End If
Next c
End Sub

Dans chaque cellule de la plage, la même MEFC : test si le contenu de la
cellule est différent de "".
Or le contenu de la variable Formule (et peut-être les autres variables)
n'évolue pas, sauf si, en exécution ligne à ligne, on visualise la MEFC de
la cellule traitée sans y faire de modif avant de récupérer la formule.
Ci-joint le classeur, pour une meilleure compréhension :
http://cjoint.com/?gCoWB1HB27

Merci d'avance.
Daniel

10 réponses

Avatar
zOrg2net
Salut Daniel,
Première constatation; si tu as mis Option explicit dans ta procédure, tu
vas buter sur "Var" qui n'est pas déclaré et sur "couleur" qui est déclaré
sous le nom de "Couleuyr". Si pas d'obligation de déclaration de variable,
pourquoi "Var" prend-elle l'adresse de la celulle puis ensuite cette valeur >
Evaluate(Formule). En fait la valeur de la variable "Var" n'est utilisée
nulle part.
Pour le reste je cherche encore.

zOrg2net
7OuNet


Bonjour.
Je dois rater quelque chose. Suite à la question de Chocho, j'ai monté la
moulinette suivante :

Sub test1()
Dim c As Range, Teste, Formule As String, Couleuyr As Integer
For Each c In Range("D22:O24")
Var = c.Address
With c.FormatConditions(1)
Teste = .Type
Formule = .Formula1
couleur = .Interior.ColorIndex
End With
Var = Evaluate(Formule)
If Evaluate(Formule) = True Then
MsgBox "toto"
End If
Next c
End Sub

Dans chaque cellule de la plage, la même MEFC : test si le contenu de la
cellule est différent de "".
Or le contenu de la variable Formule (et peut-être les autres variables)
n'évolue pas, sauf si, en exécution ligne à ligne, on visualise la MEFC de
la cellule traitée sans y faire de modif avant de récupérer la formule.
Ci-joint le classeur, pour une meilleure compréhension :
http://cjoint.com/?gCoWB1HB27

Merci d'avance.
Daniel





Avatar
Daniel
Bé, merci de regarder. Si tu as récupéré le classeur, tu vois qu'il n'y a
pas d'option explicit ;).
J'utilise Var pour déboguer. En mode ligne à ligne, je vois ses valeurs
successives, donc pas de problème là non plus.
Daniel
"zOrg2net" a écrit dans le message de
news:
Salut Daniel,
Première constatation; si tu as mis Option explicit dans ta procédure, tu
vas buter sur "Var" qui n'est pas déclaré et sur "couleur" qui est déclaré
sous le nom de "Couleuyr". Si pas d'obligation de déclaration de variable,
pourquoi "Var" prend-elle l'adresse de la celulle puis ensuite cette
valeur >
Evaluate(Formule). En fait la valeur de la variable "Var" n'est utilisée
nulle part.
Pour le reste je cherche encore.

zOrg2net
7OuNet


Bonjour.
Je dois rater quelque chose. Suite à la question de Chocho, j'ai monté la
moulinette suivante :

Sub test1()
Dim c As Range, Teste, Formule As String, Couleuyr As Integer
For Each c In Range("D22:O24")
Var = c.Address
With c.FormatConditions(1)
Teste = .Type
Formule = .Formula1
couleur = .Interior.ColorIndex
End With
Var = Evaluate(Formule)
If Evaluate(Formule) = True Then
MsgBox "toto"
End If
Next c
End Sub

Dans chaque cellule de la plage, la même MEFC : test si le contenu de la
cellule est différent de "".
Or le contenu de la variable Formule (et peut-être les autres variables)
n'évolue pas, sauf si, en exécution ligne à ligne, on visualise la MEFC
de
la cellule traitée sans y faire de modif avant de récupérer la formule.
Ci-joint le classeur, pour une meilleure compréhension :
http://cjoint.com/?gCoWB1HB27

Merci d'avance.
Daniel







Avatar
zOrg2net
Rebonjour,

Fin des constatations:
Si tu sélectionnes la cellule Var avec Range(Var).Select, Evaluate(Formule)
fait référence aux cellules suivantes de la plage, sinon, elle ne fait
référence qu'a la cellule D22 du départ.

zOrg2net
7OuNet

Sub test1()
Dim c As Range, Teste, Formule As String, Couleuyr As Integer
For Each c In Range("D22:O24")
Var = c.Address
Range(Var).Select
With c.FormatConditions(1)
Teste = .Type
Formule = .Formula1
couleur = .Interior.ColorIndex
End With
Var = Evaluate(Formule)
If Var = True Then
MsgBox "toto"
End If
Next c
End Sub



Bonjour.
Je dois rater quelque chose. Suite à la question de Chocho, j'ai monté la
moulinette suivante :

Sub test1()
Dim c As Range, Teste, Formule As String, Couleuyr As Integer
For Each c In Range("D22:O24")
Var = c.Address
With c.FormatConditions(1)
Teste = .Type
Formule = .Formula1
couleur = .Interior.ColorIndex
End With
Var = Evaluate(Formule)
If Evaluate(Formule) = True Then
MsgBox "toto"
End If
Next c
End Sub

Dans chaque cellule de la plage, la même MEFC : test si le contenu de la
cellule est différent de "".
Or le contenu de la variable Formule (et peut-être les autres variables)
n'évolue pas, sauf si, en exécution ligne à ligne, on visualise la MEFC de
la cellule traitée sans y faire de modif avant de récupérer la formule.
Ci-joint le classeur, pour une meilleure compréhension :
http://cjoint.com/?gCoWB1HB27

Merci d'avance.
Daniel





Avatar
Daniel
Daccord, ça fonctionne. Mais l'explication ? Pourquoi faut-il sélectionner
la cellule ?
Daniel
"zOrg2net" a écrit dans le message de
news:
Rebonjour,

Fin des constatations:
Si tu sélectionnes la cellule Var avec Range(Var).Select,
Evaluate(Formule)
fait référence aux cellules suivantes de la plage, sinon, elle ne fait
référence qu'a la cellule D22 du départ.

zOrg2net
7OuNet

Sub test1()
Dim c As Range, Teste, Formule As String, Couleuyr As Integer
For Each c In Range("D22:O24")
Var = c.Address
Range(Var).Select
With c.FormatConditions(1)
Teste = .Type
Formule = .Formula1
couleur = .Interior.ColorIndex
End With
Var = Evaluate(Formule)
If Var = True Then
MsgBox "toto"
End If
Next c
End Sub



Bonjour.
Je dois rater quelque chose. Suite à la question de Chocho, j'ai monté la
moulinette suivante :

Sub test1()
Dim c As Range, Teste, Formule As String, Couleuyr As Integer
For Each c In Range("D22:O24")
Var = c.Address
With c.FormatConditions(1)
Teste = .Type
Formule = .Formula1
couleur = .Interior.ColorIndex
End With
Var = Evaluate(Formule)
If Evaluate(Formule) = True Then
MsgBox "toto"
End If
Next c
End Sub

Dans chaque cellule de la plage, la même MEFC : test si le contenu de la
cellule est différent de "".
Or le contenu de la variable Formule (et peut-être les autres variables)
n'évolue pas, sauf si, en exécution ligne à ligne, on visualise la MEFC
de
la cellule traitée sans y faire de modif avant de récupérer la formule.
Ci-joint le classeur, pour une meilleure compréhension :
http://cjoint.com/?gCoWB1HB27

Merci d'avance.
Daniel







Avatar
zOrg2net
Bonne question!!
Je suppose qu'en sélectionnant chaque cellule de la plage celle-ci devient
active. Evaluate(Formule) garde peut-être la valeur de D22, parceque c'est la
première cellule sélectionnée et que c'est la seule active, puisque For Each
c In Range("D22:O24") ne fait que balayer la plage indiquée. A la différence
d'une boucle For To Next qui sélectionnerait au fur et à mesure l'objet qu'on
lui demanderait.
Humm!! Je ne sais pas si c'est bien clair.
Peut-être qu'un de nos éminents MVP aurait une explication moins touffue et
plus réaliste.

zOrg2net
7OuNet


Daccord, ça fonctionne. Mais l'explication ? Pourquoi faut-il sélectionner
la cellule ?
Daniel
"zOrg2net" a écrit dans le message de
news:
Rebonjour,

Fin des constatations:
Si tu sélectionnes la cellule Var avec Range(Var).Select,
Evaluate(Formule)
fait référence aux cellules suivantes de la plage, sinon, elle ne fait
référence qu'a la cellule D22 du départ.

zOrg2net
7OuNet

Sub test1()
Dim c As Range, Teste, Formule As String, Couleuyr As Integer
For Each c In Range("D22:O24")
Var = c.Address
Range(Var).Select
With c.FormatConditions(1)
Teste = .Type
Formule = .Formula1
couleur = .Interior.ColorIndex
End With
Var = Evaluate(Formule)
If Var = True Then
MsgBox "toto"
End If
Next c
End Sub



Bonjour.
Je dois rater quelque chose. Suite à la question de Chocho, j'ai monté la
moulinette suivante :

Sub test1()
Dim c As Range, Teste, Formule As String, Couleuyr As Integer
For Each c In Range("D22:O24")
Var = c.Address
With c.FormatConditions(1)
Teste = .Type
Formule = .Formula1
couleur = .Interior.ColorIndex
End With
Var = Evaluate(Formule)
If Evaluate(Formule) = True Then
MsgBox "toto"
End If
Next c
End Sub

Dans chaque cellule de la plage, la même MEFC : test si le contenu de la
cellule est différent de "".
Or le contenu de la variable Formule (et peut-être les autres variables)
n'évolue pas, sauf si, en exécution ligne à ligne, on visualise la MEFC
de
la cellule traitée sans y faire de modif avant de récupérer la formule.
Ci-joint le classeur, pour une meilleure compréhension :
http://cjoint.com/?gCoWB1HB27

Merci d'avance.
Daniel












Avatar
MichDenis
On peut utiliser ceci pour sélectionner une plage de cellules
ayant reçu la même mise en forme particulière

'--------------------------------
Sub test()
Dim X As Range
Set X = Range("C22:Q24").SpecialCells(xlCellTypeSameFormatConditions)
MsgBox X.Address
End Sub
'--------------------------------

Sauf que cette syntaxe pour qu'elle fonctionne a une particularité importante à cerner
Ce n'est pas une question de compréhension.... c'est de même que les programmeurs
de Microsoft ont développé le concept ...!

Pour que cette syntaxe soit valide, la première cellule de la plage doit avoir reçu la
mise en forme conditionnelle dont on recherche la globalité de la plage que l'on désire
cerner :

Exemple : Si tu utilises la plage suivante :
Set X = Range("H22:Q30").SpecialCells(xlCellTypeSameFormatConditions)
X.Address retourne C22:Q24

Si tu utilises la plage suivante :
Set X = Range("H21:Q30").SpecialCells(xlCellTypeSameFormatConditions)
Tu auras un message d'erreur t'indiquant qu'il n'y a pas de cellules correspondantes
En fait, parce que la première cellule H21 (la référence) n'a pas un format conditionnelle,
la méthode SpecialCells ne peut pas trouver les autres cellules évidemment.

De même lorsque tu crées via l'interface de la feuille de calcul, une mise en forme
conditionnelle, tu sélectionnes la cellule la plus à gauche et la plus près de la lignie1
pour établir la plage de cellules sur laquelle s'appliquera la mise en forme conditionnelle.

Si tu as suivi et si j'ai bien compris, c'est la "cellule active" qui renvoie "la formule de
référence"
à une mise en forme conditionnelle....c'est pour cette raison que tu dois sélectionner
chacune des cellules de la plage !



"Daniel" a écrit dans le message de news:

Daccord, ça fonctionne. Mais l'explication ? Pourquoi faut-il sélectionner
la cellule ?
Daniel
"zOrg2net" a écrit dans le message de
news:
Rebonjour,

Fin des constatations:
Si tu sélectionnes la cellule Var avec Range(Var).Select,
Evaluate(Formule)
fait référence aux cellules suivantes de la plage, sinon, elle ne fait
référence qu'a la cellule D22 du départ.

zOrg2net
7OuNet

Sub test1()
Dim c As Range, Teste, Formule As String, Couleuyr As Integer
For Each c In Range("D22:O24")
Var = c.Address
Range(Var).Select
With c.FormatConditions(1)
Teste = .Type
Formule = .Formula1
couleur = .Interior.ColorIndex
End With
Var = Evaluate(Formule)
If Var = True Then
MsgBox "toto"
End If
Next c
End Sub



Bonjour.
Je dois rater quelque chose. Suite à la question de Chocho, j'ai monté la
moulinette suivante :

Sub test1()
Dim c As Range, Teste, Formule As String, Couleuyr As Integer
For Each c In Range("D22:O24")
Var = c.Address
With c.FormatConditions(1)
Teste = .Type
Formule = .Formula1
couleur = .Interior.ColorIndex
End With
Var = Evaluate(Formule)
If Evaluate(Formule) = True Then
MsgBox "toto"
End If
Next c
End Sub

Dans chaque cellule de la plage, la même MEFC : test si le contenu de la
cellule est différent de "".
Or le contenu de la variable Formule (et peut-être les autres variables)
n'évolue pas, sauf si, en exécution ligne à ligne, on visualise la MEFC
de
la cellule traitée sans y faire de modif avant de récupérer la formule.
Ci-joint le classeur, pour une meilleure compréhension :
http://cjoint.com/?gCoWB1HB27

Merci d'avance.
Daniel







Avatar
Daniel
Merci pour tes explications.
Mettons que je sois particulièrement dur à la détente.
Si je résume ton raisonne, qu'il faille que la "première" cellule de la
plage ait une MEFC pour définir X peut se comprendre (sinon la plage peut
comprendre n sous ensembles de MEFC similaires. Je comprends également le
processus de définition manuelle d'une plage de MEFC.
Mais explique-moi le comportement suivant :
contexte : - la cellule A1 contient la MEFC suivante ¡<>""
- la cellule active est I4 (aucune MEFC)
Range("A1").FormatConditions(1).Formula1
renvoie :
=I4<>""
Le résultat est le même si I4 contient une MEFC
Donc XL récupère la formule de la MEFC de A1 et substitue l'adresse de la
plage active à celle de A1.
Daniel
"MichDenis" a écrit dans le message de news:
%23$
On peut utiliser ceci pour sélectionner une plage de cellules
ayant reçu la même mise en forme particulière

'--------------------------------
Sub test()
Dim X As Range
Set X = Range("C22:Q24").SpecialCells(xlCellTypeSameFormatConditions)
MsgBox X.Address
End Sub
'--------------------------------

Sauf que cette syntaxe pour qu'elle fonctionne a une particularité
importante à cerner
Ce n'est pas une question de compréhension.... c'est de même que les
programmeurs
de Microsoft ont développé le concept ...!

Pour que cette syntaxe soit valide, la première cellule de la plage doit
avoir reçu la
mise en forme conditionnelle dont on recherche la globalité de la plage
que l'on désire
cerner :

Exemple : Si tu utilises la plage suivante :
Set X = Range("H22:Q30").SpecialCells(xlCellTypeSameFormatConditions)
X.Address retourne C22:Q24

Si tu utilises la plage suivante :
Set X = Range("H21:Q30").SpecialCells(xlCellTypeSameFormatConditions)
Tu auras un message d'erreur t'indiquant qu'il n'y a pas de cellules
correspondantes
En fait, parce que la première cellule H21 (la référence) n'a pas un
format conditionnelle,
la méthode SpecialCells ne peut pas trouver les autres cellules
évidemment.

De même lorsque tu crées via l'interface de la feuille de calcul, une mise
en forme
conditionnelle, tu sélectionnes la cellule la plus à gauche et la plus
près de la lignie1
pour établir la plage de cellules sur laquelle s'appliquera la mise en
forme conditionnelle.

Si tu as suivi et si j'ai bien compris, c'est la "cellule active" qui
renvoie "la formule de
référence"
à une mise en forme conditionnelle....c'est pour cette raison que tu dois
sélectionner
chacune des cellules de la plage !



"Daniel" a écrit dans le message de news:

Daccord, ça fonctionne. Mais l'explication ? Pourquoi faut-il sélectionner
la cellule ?
Daniel
"zOrg2net" a écrit dans le message de
news:
Rebonjour,

Fin des constatations:
Si tu sélectionnes la cellule Var avec Range(Var).Select,
Evaluate(Formule)
fait référence aux cellules suivantes de la plage, sinon, elle ne fait
référence qu'a la cellule D22 du départ.

zOrg2net
7OuNet

Sub test1()
Dim c As Range, Teste, Formule As String, Couleuyr As Integer
For Each c In Range("D22:O24")
Var = c.Address
Range(Var).Select
With c.FormatConditions(1)
Teste = .Type
Formule = .Formula1
couleur = .Interior.ColorIndex
End With
Var = Evaluate(Formule)
If Var = True Then
MsgBox "toto"
End If
Next c
End Sub



Bonjour.
Je dois rater quelque chose. Suite à la question de Chocho, j'ai monté
la
moulinette suivante :

Sub test1()
Dim c As Range, Teste, Formule As String, Couleuyr As Integer
For Each c In Range("D22:O24")
Var = c.Address
With c.FormatConditions(1)
Teste = .Type
Formule = .Formula1
couleur = .Interior.ColorIndex
End With
Var = Evaluate(Formule)
If Evaluate(Formule) = True Then
MsgBox "toto"
End If
Next c
End Sub

Dans chaque cellule de la plage, la même MEFC : test si le contenu de la
cellule est différent de "".
Or le contenu de la variable Formule (et peut-être les autres variables)
n'évolue pas, sauf si, en exécution ligne à ligne, on visualise la MEFC
de
la cellule traitée sans y faire de modif avant de récupérer la formule.
Ci-joint le classeur, pour une meilleure compréhension :
http://cjoint.com/?gCoWB1HB27

Merci d'avance.
Daniel












Avatar
MichDenis
Un autre qui ne veut pas comprendre ...;-))

Suppose que tu veux qu'une mise en forme conditionnelle s'applique
sur la plage A1:D10. Dans la formule que tu vas utiliser tu vas
RETENIR LA CELLULE A1 COMME RÉFÉRENCE ET
excel va reproduire la mise en forme en adaptant l'adresse
pour chacune des cellules de la plage.

Quand tu fais ceci :

Exemple : Si tu utilises la plage suivante :
Set X = Range("H22:Q30").SpecialCells(xlCellTypeSameFormatConditions)
X.Address retourne C22:Q24

Tu peux même aller plus loin :
Set x = Range("H22").SpecialCells(xlCellTypeSameFormatConditions)
Msgbox x.Address
A partir d'une cellule qui a une mise en forme condtionnelle, tu peux définir
l'adresse de toutes les cellules de la feuille qui ont une même mise en forme
conditionnelle.

La procédure RETIENT LA PREMIÈRE CELLULE DE LA PLAGE H22
comme cellule de RÉFÉRENCE pour évaluer si les autres cellules contient
la même mise en forme conditionnelle.

Quand tu boucles sur une plage de cellules comme dans ton exemple
'---------------------------------:
Sub test1()
Dim c As Range, Teste, Formule As String, Couleuyr As Integer
For Each c In Range("D22:O24")
Var = c.Address
With c.FormatConditions(1)
Formule = .Formula1
couleur = .Interior.ColorIndex
End With
Var = Evaluate(Formule)
If Evaluate(Formule) = True Then
MsgBox "toto"
End If
Next c
End Sub
'---------------------------------

Si la cellule active était D15, il prendra comme cellule de
référence D22 (première cellule de la plage définie)
pour établir la formule de la mise en forme condtionnelle
pour la totalité de la plage. IL PREND LA PREMIÈRE CELLULE
DE LA PLAGE MENTIONNÉE COMME CELLULE DE
RÉFÉRENCE.... Si la première cellule de la plage n'a pas
une mise en forme conditionnelle, la procédure se plante.

Dans ton dernier exemple :
Range("A1").FormatConditions(1).Formula1
renvoie :=I4<>"" si I4 est la cellule active....

Il ne fait pas de vérification si la cellule I4
a une mise en forme condtionnelle il ne fait
QU'ADAPTER l' adresse de la cellule de
la formule de la cellule de référence...

si tu veux savoir si I4 a une mise en forme condtionnelle
x=Range("I4").FormatConditions(1).Formula1
qui se plantera si I4 n'a pas de mise en forme cond.

La seule alternative c'est de rendre la cellule active lorsque tu veux
savoir si oui ou non la cellule a une mise en forme conditionnellle
en dans un second temps, évaluer la formule, le cas échéant.

Est-ce logique ? Faut poser la question à Microsoft....mais cette de
cette manière que cela fonctionne.






"Daniel" a écrit dans le message de news:

Merci pour tes explications.
Mettons que je sois particulièrement dur à la détente.
Si je résume ton raisonne, qu'il faille que la "première" cellule de la
plage ait une MEFC pour définir X peut se comprendre (sinon la plage peut
comprendre n sous ensembles de MEFC similaires. Je comprends également le
processus de définition manuelle d'une plage de MEFC.
Mais explique-moi le comportement suivant :
contexte : - la cellule A1 contient la MEFC suivante ¡<>""
- la cellule active est I4 (aucune MEFC)
Range("A1").FormatConditions(1).Formula1
renvoie :
=I4<>""
Le résultat est le même si I4 contient une MEFC
Donc XL récupère la formule de la MEFC de A1 et substitue l'adresse de la
plage active à celle de A1.
Daniel
"MichDenis" a écrit dans le message de news:
%23$
On peut utiliser ceci pour sélectionner une plage de cellules
ayant reçu la même mise en forme particulière

'--------------------------------
Sub test()
Dim X As Range
Set X = Range("C22:Q24").SpecialCells(xlCellTypeSameFormatConditions)
MsgBox X.Address
End Sub
'--------------------------------

Sauf que cette syntaxe pour qu'elle fonctionne a une particularité
importante à cerner
Ce n'est pas une question de compréhension.... c'est de même que les
programmeurs
de Microsoft ont développé le concept ...!

Pour que cette syntaxe soit valide, la première cellule de la plage doit
avoir reçu la
mise en forme conditionnelle dont on recherche la globalité de la plage
que l'on désire
cerner :

Exemple : Si tu utilises la plage suivante :
Set X = Range("H22:Q30").SpecialCells(xlCellTypeSameFormatConditions)
X.Address retourne C22:Q24

Si tu utilises la plage suivante :
Set X = Range("H21:Q30").SpecialCells(xlCellTypeSameFormatConditions)
Tu auras un message d'erreur t'indiquant qu'il n'y a pas de cellules
correspondantes
En fait, parce que la première cellule H21 (la référence) n'a pas un
format conditionnelle,
la méthode SpecialCells ne peut pas trouver les autres cellules
évidemment.

De même lorsque tu crées via l'interface de la feuille de calcul, une mise
en forme
conditionnelle, tu sélectionnes la cellule la plus à gauche et la plus
près de la lignie1
pour établir la plage de cellules sur laquelle s'appliquera la mise en
forme conditionnelle.

Si tu as suivi et si j'ai bien compris, c'est la "cellule active" qui
renvoie "la formule de
référence"
à une mise en forme conditionnelle....c'est pour cette raison que tu dois
sélectionner
chacune des cellules de la plage !



"Daniel" a écrit dans le message de news:

Daccord, ça fonctionne. Mais l'explication ? Pourquoi faut-il sélectionner
la cellule ?
Daniel
"zOrg2net" a écrit dans le message de
news:
Rebonjour,

Fin des constatations:
Si tu sélectionnes la cellule Var avec Range(Var).Select,
Evaluate(Formule)
fait référence aux cellules suivantes de la plage, sinon, elle ne fait
référence qu'a la cellule D22 du départ.

zOrg2net
7OuNet

Sub test1()
Dim c As Range, Teste, Formule As String, Couleuyr As Integer
For Each c In Range("D22:O24")
Var = c.Address
Range(Var).Select
With c.FormatConditions(1)
Teste = .Type
Formule = .Formula1
couleur = .Interior.ColorIndex
End With
Var = Evaluate(Formule)
If Var = True Then
MsgBox "toto"
End If
Next c
End Sub



Bonjour.
Je dois rater quelque chose. Suite à la question de Chocho, j'ai monté
la
moulinette suivante :

Sub test1()
Dim c As Range, Teste, Formule As String, Couleuyr As Integer
For Each c In Range("D22:O24")
Var = c.Address
With c.FormatConditions(1)
Teste = .Type
Formule = .Formula1
couleur = .Interior.ColorIndex
End With
Var = Evaluate(Formule)
If Evaluate(Formule) = True Then
MsgBox "toto"
End If
Next c
End Sub

Dans chaque cellule de la plage, la même MEFC : test si le contenu de la
cellule est différent de "".
Or le contenu de la variable Formule (et peut-être les autres variables)
n'évolue pas, sauf si, en exécution ligne à ligne, on visualise la MEFC
de
la cellule traitée sans y faire de modif avant de récupérer la formule.
Ci-joint le classeur, pour une meilleure compréhension :
http://cjoint.com/?gCoWB1HB27

Merci d'avance.
Daniel












Avatar
Daniel
OK J'ai compris que c'était comme ça que ça fonctionnait. Je cherchais juste
quelque chose de logique - de mon point de vue, pas de celui de MS -.
On fera avec. De toute façons, j'étais réticent à mélanger MEFC et VBA, sans
savoir trop pourquoi. Maintenant, je sais.
Merci encore.
Daniel
"MichDenis" a écrit dans le message de news:
%
Un autre qui ne veut pas comprendre ...;-))

Suppose que tu veux qu'une mise en forme conditionnelle s'applique
sur la plage A1:D10. Dans la formule que tu vas utiliser tu vas
RETENIR LA CELLULE A1 COMME RÉFÉRENCE ET
excel va reproduire la mise en forme en adaptant l'adresse
pour chacune des cellules de la plage.

Quand tu fais ceci :

Exemple : Si tu utilises la plage suivante :
Set X = Range("H22:Q30").SpecialCells(xlCellTypeSameFormatConditions)
X.Address retourne C22:Q24

Tu peux même aller plus loin :
Set x = Range("H22").SpecialCells(xlCellTypeSameFormatConditions)
Msgbox x.Address
A partir d'une cellule qui a une mise en forme condtionnelle, tu peux
définir
l'adresse de toutes les cellules de la feuille qui ont une même mise en
forme
conditionnelle.

La procédure RETIENT LA PREMIÈRE CELLULE DE LA PLAGE H22
comme cellule de RÉFÉRENCE pour évaluer si les autres cellules contient
la même mise en forme conditionnelle.

Quand tu boucles sur une plage de cellules comme dans ton exemple
'---------------------------------:
Sub test1()
Dim c As Range, Teste, Formule As String, Couleuyr As Integer
For Each c In Range("D22:O24")
Var = c.Address
With c.FormatConditions(1)
Formule = .Formula1
couleur = .Interior.ColorIndex
End With
Var = Evaluate(Formule)
If Evaluate(Formule) = True Then
MsgBox "toto"
End If
Next c
End Sub
'---------------------------------

Si la cellule active était D15, il prendra comme cellule de
référence D22 (première cellule de la plage définie)
pour établir la formule de la mise en forme condtionnelle
pour la totalité de la plage. IL PREND LA PREMIÈRE CELLULE
DE LA PLAGE MENTIONNÉE COMME CELLULE DE
RÉFÉRENCE.... Si la première cellule de la plage n'a pas
une mise en forme conditionnelle, la procédure se plante.

Dans ton dernier exemple :
Range("A1").FormatConditions(1).Formula1
renvoie :=I4<>"" si I4 est la cellule active....

Il ne fait pas de vérification si la cellule I4
a une mise en forme condtionnelle il ne fait
QU'ADAPTER l' adresse de la cellule de
la formule de la cellule de référence...

si tu veux savoir si I4 a une mise en forme condtionnelle
x=Range("I4").FormatConditions(1).Formula1
qui se plantera si I4 n'a pas de mise en forme cond.

La seule alternative c'est de rendre la cellule active lorsque tu veux
savoir si oui ou non la cellule a une mise en forme conditionnellle
en dans un second temps, évaluer la formule, le cas échéant.

Est-ce logique ? Faut poser la question à Microsoft....mais cette de
cette manière que cela fonctionne.






"Daniel" a écrit dans le message de news:

Merci pour tes explications.
Mettons que je sois particulièrement dur à la détente.
Si je résume ton raisonne, qu'il faille que la "première" cellule de la
plage ait une MEFC pour définir X peut se comprendre (sinon la plage peut
comprendre n sous ensembles de MEFC similaires. Je comprends également le
processus de définition manuelle d'une plage de MEFC.
Mais explique-moi le comportement suivant :
contexte : - la cellule A1 contient la MEFC suivante ¡<>""
- la cellule active est I4 (aucune MEFC)
Range("A1").FormatConditions(1).Formula1
renvoie :
=I4<>""
Le résultat est le même si I4 contient une MEFC
Donc XL récupère la formule de la MEFC de A1 et substitue l'adresse de la
plage active à celle de A1.
Daniel
"MichDenis" a écrit dans le message de news:
%23$
On peut utiliser ceci pour sélectionner une plage de cellules
ayant reçu la même mise en forme particulière

'--------------------------------
Sub test()
Dim X As Range
Set X = Range("C22:Q24").SpecialCells(xlCellTypeSameFormatConditions)
MsgBox X.Address
End Sub
'--------------------------------

Sauf que cette syntaxe pour qu'elle fonctionne a une particularité
importante à cerner
Ce n'est pas une question de compréhension.... c'est de même que les
programmeurs
de Microsoft ont développé le concept ...!

Pour que cette syntaxe soit valide, la première cellule de la plage doit
avoir reçu la
mise en forme conditionnelle dont on recherche la globalité de la plage
que l'on désire
cerner :

Exemple : Si tu utilises la plage suivante :
Set X = Range("H22:Q30").SpecialCells(xlCellTypeSameFormatConditions)
X.Address retourne C22:Q24

Si tu utilises la plage suivante :
Set X = Range("H21:Q30").SpecialCells(xlCellTypeSameFormatConditions)
Tu auras un message d'erreur t'indiquant qu'il n'y a pas de cellules
correspondantes
En fait, parce que la première cellule H21 (la référence) n'a pas un
format conditionnelle,
la méthode SpecialCells ne peut pas trouver les autres cellules
évidemment.

De même lorsque tu crées via l'interface de la feuille de calcul, une
mise
en forme
conditionnelle, tu sélectionnes la cellule la plus à gauche et la plus
près de la lignie1
pour établir la plage de cellules sur laquelle s'appliquera la mise en
forme conditionnelle.

Si tu as suivi et si j'ai bien compris, c'est la "cellule active" qui
renvoie "la formule de
référence"
à une mise en forme conditionnelle....c'est pour cette raison que tu dois
sélectionner
chacune des cellules de la plage !



"Daniel" a écrit dans le message de news:

Daccord, ça fonctionne. Mais l'explication ? Pourquoi faut-il
sélectionner
la cellule ?
Daniel
"zOrg2net" a écrit dans le message
de
news:
Rebonjour,

Fin des constatations:
Si tu sélectionnes la cellule Var avec Range(Var).Select,
Evaluate(Formule)
fait référence aux cellules suivantes de la plage, sinon, elle ne fait
référence qu'a la cellule D22 du départ.

zOrg2net
7OuNet

Sub test1()
Dim c As Range, Teste, Formule As String, Couleuyr As Integer
For Each c In Range("D22:O24")
Var = c.Address
Range(Var).Select
With c.FormatConditions(1)
Teste = .Type
Formule = .Formula1
couleur = .Interior.ColorIndex
End With
Var = Evaluate(Formule)
If Var = True Then
MsgBox "toto"
End If
Next c
End Sub



Bonjour.
Je dois rater quelque chose. Suite à la question de Chocho, j'ai monté
la
moulinette suivante :

Sub test1()
Dim c As Range, Teste, Formule As String, Couleuyr As Integer
For Each c In Range("D22:O24")
Var = c.Address
With c.FormatConditions(1)
Teste = .Type
Formule = .Formula1
couleur = .Interior.ColorIndex
End With
Var = Evaluate(Formule)
If Evaluate(Formule) = True Then
MsgBox "toto"
End If
Next c
End Sub

Dans chaque cellule de la plage, la même MEFC : test si le contenu de
la
cellule est différent de "".
Or le contenu de la variable Formule (et peut-être les autres
variables)
n'évolue pas, sauf si, en exécution ligne à ligne, on visualise la MEFC
de
la cellule traitée sans y faire de modif avant de récupérer la formule.
Ci-joint le classeur, pour une meilleure compréhension :
http://cjoint.com/?gCoWB1HB27

Merci d'avance.
Daniel

















Avatar
zOrg2net
Salut à tous,
Bon en lisant ce fil, je vois que ma réponse intuitive n'était pas trop
farfelu.
Quoiqu'il faille un peu de folie parfois, pour comprendre comment
fonctionnent toutes ces applications et leurs systèmes de programmation.
Mais bon! On aime ça et c'est pas les difficultés qui vont nous faire changer.

zOrg2net
7OuNet


Un autre qui ne veut pas comprendre ...;-))

Suppose que tu veux qu'une mise en forme conditionnelle s'applique
sur la plage A1:D10. Dans la formule que tu vas utiliser tu vas
RETENIR LA CELLULE A1 COMME RÉFÉRENCE ET
excel va reproduire la mise en forme en adaptant l'adresse
pour chacune des cellules de la plage.

Quand tu fais ceci :

Exemple : Si tu utilises la plage suivante :
Set X = Range("H22:Q30").SpecialCells(xlCellTypeSameFormatConditions)
X.Address retourne C22:Q24

Tu peux même aller plus loin :
Set x = Range("H22").SpecialCells(xlCellTypeSameFormatConditions)
Msgbox x.Address
A partir d'une cellule qui a une mise en forme condtionnelle, tu peux définir
l'adresse de toutes les cellules de la feuille qui ont une même mise en forme
conditionnelle.

La procédure RETIENT LA PREMIÈRE CELLULE DE LA PLAGE H22
comme cellule de RÉFÉRENCE pour évaluer si les autres cellules contient
la même mise en forme conditionnelle.

Quand tu boucles sur une plage de cellules comme dans ton exemple
'---------------------------------:
Sub test1()
Dim c As Range, Teste, Formule As String, Couleuyr As Integer
For Each c In Range("D22:O24")
Var = c.Address
With c.FormatConditions(1)
Formule = .Formula1
couleur = .Interior.ColorIndex
End With
Var = Evaluate(Formule)
If Evaluate(Formule) = True Then
MsgBox "toto"
End If
Next c
End Sub
'---------------------------------

Si la cellule active était D15, il prendra comme cellule de
référence D22 (première cellule de la plage définie)
pour établir la formule de la mise en forme condtionnelle
pour la totalité de la plage. IL PREND LA PREMIÈRE CELLULE
DE LA PLAGE MENTIONNÉE COMME CELLULE DE
RÉFÉRENCE.... Si la première cellule de la plage n'a pas
une mise en forme conditionnelle, la procédure se plante.

Dans ton dernier exemple :
Range("A1").FormatConditions(1).Formula1
renvoie :=I4<>"" si I4 est la cellule active....

Il ne fait pas de vérification si la cellule I4
a une mise en forme condtionnelle il ne fait
QU'ADAPTER l' adresse de la cellule de
la formule de la cellule de référence...

si tu veux savoir si I4 a une mise en forme condtionnelle
x=Range("I4").FormatConditions(1).Formula1
qui se plantera si I4 n'a pas de mise en forme cond.

La seule alternative c'est de rendre la cellule active lorsque tu veux
savoir si oui ou non la cellule a une mise en forme conditionnellle
en dans un second temps, évaluer la formule, le cas échéant.

Est-ce logique ? Faut poser la question à Microsoft....mais cette de
cette manière que cela fonctionne.






"Daniel" a écrit dans le message de news:

Merci pour tes explications.
Mettons que je sois particulièrement dur à la détente.
Si je résume ton raisonne, qu'il faille que la "première" cellule de la
plage ait une MEFC pour définir X peut se comprendre (sinon la plage peut
comprendre n sous ensembles de MEFC similaires. Je comprends également le
processus de définition manuelle d'une plage de MEFC.
Mais explique-moi le comportement suivant :
contexte : - la cellule A1 contient la MEFC suivante ¡<>""
- la cellule active est I4 (aucune MEFC)
Range("A1").FormatConditions(1).Formula1
renvoie :
=I4<>""
Le résultat est le même si I4 contient une MEFC
Donc XL récupère la formule de la MEFC de A1 et substitue l'adresse de la
plage active à celle de A1.
Daniel
"MichDenis" a écrit dans le message de news:
%23$
On peut utiliser ceci pour sélectionner une plage de cellules
ayant reçu la même mise en forme particulière

'--------------------------------
Sub test()
Dim X As Range
Set X = Range("C22:Q24").SpecialCells(xlCellTypeSameFormatConditions)
MsgBox X.Address
End Sub
'--------------------------------

Sauf que cette syntaxe pour qu'elle fonctionne a une particularité
importante à cerner
Ce n'est pas une question de compréhension.... c'est de même que les
programmeurs
de Microsoft ont développé le concept ...!

Pour que cette syntaxe soit valide, la première cellule de la plage doit
avoir reçu la
mise en forme conditionnelle dont on recherche la globalité de la plage
que l'on désire
cerner :

Exemple : Si tu utilises la plage suivante :
Set X = Range("H22:Q30").SpecialCells(xlCellTypeSameFormatConditions)
X.Address retourne C22:Q24

Si tu utilises la plage suivante :
Set X = Range("H21:Q30").SpecialCells(xlCellTypeSameFormatConditions)
Tu auras un message d'erreur t'indiquant qu'il n'y a pas de cellules
correspondantes
En fait, parce que la première cellule H21 (la référence) n'a pas un
format conditionnelle,
la méthode SpecialCells ne peut pas trouver les autres cellules
évidemment.

De même lorsque tu crées via l'interface de la feuille de calcul, une mise
en forme
conditionnelle, tu sélectionnes la cellule la plus à gauche et la plus
près de la lignie1
pour établir la plage de cellules sur laquelle s'appliquera la mise en
forme conditionnelle.

Si tu as suivi et si j'ai bien compris, c'est la "cellule active" qui
renvoie "la formule de
référence"
à une mise en forme conditionnelle....c'est pour cette raison que tu dois
sélectionner
chacune des cellules de la plage !



"Daniel" a écrit dans le message de news:

Daccord, ça fonctionne. Mais l'explication ? Pourquoi faut-il sélectionner
la cellule ?
Daniel
"zOrg2net" a écrit dans le message de
news:
Rebonjour,

Fin des constatations:
Si tu sélectionnes la cellule Var avec Range(Var).Select,
Evaluate(Formule)
fait référence aux cellules suivantes de la plage, sinon, elle ne fait
référence qu'a la cellule D22 du départ.

zOrg2net
7OuNet

Sub test1()
Dim c As Range, Teste, Formule As String, Couleuyr As Integer
For Each c In Range("D22:O24")
Var = c.Address
Range(Var).Select
With c.FormatConditions(1)
Teste = .Type
Formule = .Formula1
couleur = .Interior.ColorIndex
End With
Var = Evaluate(Formule)
If Var = True Then
MsgBox "toto"
End If
Next c
End Sub



Bonjour.
Je dois rater quelque chose. Suite à la question de Chocho, j'ai monté
la
moulinette suivante :

Sub test1()
Dim c As Range, Teste, Formule As String, Couleuyr As Integer
For Each c In Range("D22:O24")
Var = c.Address
With c.FormatConditions(1)
Teste = .Type
Formule = .Formula1
couleur = .Interior.ColorIndex
End With
Var = Evaluate(Formule)
If Evaluate(Formule) = True Then
MsgBox "toto"
End If
Next c
End Sub

Dans chaque cellule de la plage, la même MEFC : test si le contenu de la
cellule est différent de "".
Or le contenu de la variable Formule (et peut-être les autres variables)
n'évolue pas, sauf si, en exécution ligne à ligne, on visualise la MEFC
de
la cellule traitée sans y faire de modif avant de récupérer la formule.
Ci-joint le classeur, pour une meilleure compréhension :
http://cjoint.com/?gCoWB1HB27

Merci d'avance.
Daniel