Posez votre question Signaler

Excel - macro (mise en forme conditionnelle) [Résolu]

chewi - Dernière réponse le 26 mar 2010 à 00:30
Bonjour au forum,

Voilà mon mon problème:

J'ai créé une macro qui transfère des données d'une feuille à une autre à des endroits variant suivant la valeur d'une cellule. ( 4 possibilités : AV,RV,RP et AP )

Je mets ensuite en format conditionnel (verte ou rouge) une des cellules transférées (moyenne de 3 autres).

Dans les cas RV et RP, aucun problème.
Mais dans les cas AV et AP, il m'affiche le message d'erreur suivant pour les lignes commençant par .FormatConditions.Add (If "AV" ou If "AP" suivant le cas) :

Run-time error '1004':
Application-defined or object-defined error


(Pour info, hier, jour de la création de la macro, tout allait bien)

Quelqu'un peut-il m'éclairer sur ce qui ne va pas?
Sachant que je suis assez novice en VBA.

D'avance merci.

Voici la macro:

Sub DataExportFr()

Dim Colonne As Byte
Dim trouve

With Sheets("Feuil1")

If UCase(Left(.Range("I2"), 2)) = "AV" Then
Colonne = Feuil2.Range("IV14").End(xlToLeft).Column + 1
If Colonne < 4 Then Colonne = 4
.Range("J2:J4").Copy Feuil2.Cells(14, Colonne)
.Range("E2").Copy Feuil2.Cells(8, Colonne)
.Range("F2").Copy Feuil2.Cells(9, Colonne)
.Range("G2").Copy Feuil2.Cells(10, Colonne)
.Range("H2").Copy Feuil2.Cells(12, Colonne)
.Range("B2").Copy Feuil2.Cells(13, Colonne)
.Range("J5").Copy Feuil2.Cells(17, Colonne)

With Feuil2.Cells(17, Colonne)
.FormatConditions.Add Type:=xlCellValue, Operator:=xlNotBetween, _
Formula1:="16", Formula2:="22"

.FormatConditions(1).Font.ColorIndex = 3

.FormatConditions.Add Type:=xlCellValue, Operator:=xlBetween, _
Formula1:="16", Formula2:="22"

.FormatConditions(2).Font.ColorIndex = 10
End With

ElseIf UCase(Left(.Range("I2"), 2)) = "RV" Then
Colonne = Feuil2.Range("IV43").End(xlToLeft).Column + 1
If Colonne < 12 Then Colonne = 12
.Range("J2:J4").Copy Feuil2.Cells(43, Colonne)
.Range("E2").Copy Feuil2.Cells(39, Colonne)
.Range("H2").Copy Feuil2.Cells(40, Colonne)
.Range("B2").Copy Feuil2.Cells(41, Colonne)
.Range("J5").Copy Feuil2.Cells(46, Colonne)

With Feuil2.Cells(46, Colonne)
.FormatConditions.Add Type:=xlCellValue, Operator:=xlNotBetween, _
Formula1:="16", Formula2:="22"
.FormatConditions(1).Font.ColorIndex = 3

.FormatConditions.Add Type:=xlCellValue, Operator:=xlBetween, _
Formula1:="16", Formula2:="22"
.FormatConditions(2).Font.ColorIndex = 10
End With

ElseIf UCase(Left(.Range("I2"), 2)) = "RP" Then
Colonne = Feuil2.Range("IV43").End(xlToLeft).Column + 1
If Colonne < 12 Then Colonne = 12
.Range("J2:J4").Copy Feuil2.Cells(43, Colonne)
Feuil2.Cells(43, Colonne).Font.ColorIndex = 5
Feuil2.Cells(44, Colonne).Font.ColorIndex = 5
Feuil2.Cells(45, Colonne).Font.ColorIndex = 5

.Range("E2").Copy Feuil2.Cells(39, Colonne)
.Range("H2").Copy Feuil2.Cells(40, Colonne)
.Range("B2").Copy Feuil2.Cells(41, Colonne)

Feuil2.Cells(39, Colonne).Font.ColorIndex = 5
Feuil2.Cells(40, Colonne).Font.ColorIndex = 5
Feuil2.Cells(41, Colonne).Font.ColorIndex = 5

.Range("J5").Copy Feuil2.Cells(46, Colonne)

With Feuil2.Cells(46, Colonne)
.FormatConditions.Add Type:=xlCellValue, Operator:=xlNotBetween, _
Formula1:="16", Formula2:="23"
.FormatConditions(1).Font.ColorIndex = 3

.FormatConditions.Add Type:=xlCellValue, Operator:=xlBetween, _
Formula1:="16", Formula2:="23"
.FormatConditions(2).Font.ColorIndex = 10
End With

ElseIf UCase(Left(.Range("I2"), 2)) = "AP" Then
Set trouve = Feuil2.Range("D8:IV8").Find(.Range("E2"), LookIn:=xlValues)
If trouve Is Nothing Then
MsgBox ("Cette valeur n'existe pas!")
Exit Sub
End If
.Range("J2:J4").Copy Feuil2.Cells(21, trouve.Column)
.Range("J5").Copy Feuil2.Cells(24, trouve.Column)

With Feuil2.Cells(24, trouve.Column)
.FormatConditions.Add Type:=xlCellValue, Operator:=xlNotBetween, _
Formula1:="16", Formula2:="23"

.FormatConditions(1).Font.ColorIndex = 3
.FormatConditions.Add Type:=xlCellValue, Operator:=xlBetween, _
Formula1:="16", Formula2:="23"

.FormatConditions(2).Font.ColorIndex = 10
End With

End If
Application.DisplayAlerts = False
Sheets("Feuil1").Select
Cells.ClearContents
Application.DisplayAlerts = True
Range("J5").Select
ActiveCell.FormulaR1C1 = "=AVERAGE(R[-3]C:R[-1]C)"
Sheets("Feuil2").Select

End With

End Sub
Lire la suite 

Excel - macro (mise en forme conditionnelle) »

10 réponses
Réponse
+3
moins plus
Re,

Il se peut que je sois à côté de la plaque, et je ne sais pas dans quelles conditions tu utilises tes formats.
Je reprécise : pour chaque cellule, Excel autorise 3 formats conditionnels. A la tentative de création d'un 4ème pour la même cellule, on a précisément le message qui t'enquiquine.
Ayant créé des formats au cours d'une exécution, ils restent définis dans le classeur. Donc si au cours d'une exécution suivante tu réinterviens sur une cellule qui a déjà des formats créés par une exécution précédente, ça tilte. Autrement dit, si FormatConditions.Count = 3, il faut en supprimer avant d'en rajouter...
Encore une fois, ce n'est peut-être pas ça ton problème, mais je préfère lever les ambiguïtés d'interprétation.
khawla - 26 mar 2010 à 00:30
j'ai un probléme en excel .j'enseigne plusieurs modules dans une entreprise qui a 1000 travailleurs et je veux que le nom ne se répéte pas parcontre dans mon bilan annuel je veux garder les modules sur mon tableau pour chaque employé .comment faire.
Ajouter un commentaire
Réponse
+2
moins plus
Hello chewi,

Je pense que tu ne peux pas indéfiniment ajouter des Format.Conditions à une cellule, vu que leur nombre est limité à 3.
Donc avant, fais un : Cellule.FormatConditions.Delete
Ajouter un commentaire
Réponse
+1
moins plus
Salut Armojax et les autres.

Tout d'abord, merci pour ta réponse.

Cependant,... (si je ne me trompe pas)

Si tu regarde bien dans la macro, je ne mets que deux conditions par cellules qui restent les mêmes de cellule en cellule.
Vert si compris entre 16 et 23 et rouge si non compris.

Le message d'erreur s'applique aux lignes qui sont soulignées.

Si tu vois autre chose, n'hésite pas!

Merci quand même.

@+
Armojax - 1 sep 2006 à 10:53
OK, tu n'en mets que deux... à chaque exécution. Et tu en enlèves quand ?
Ajouter un commentaire
Réponse
+1
moins plus
Merci quand même!

et MeaCulpa! , "honte sur moi"
Ajouter un commentaire
Réponse
+0
moins plus
Re

Je vais essayer de mieux m'expliquer.

Dans ma macro, à chaque exécution, l'emplacement d'une des cellules transférées subit deux mises en forme conditionnelles mais ensuite, cette cellule étant complétée, elle n'est plus jamais modifiée, je n'y touche plus. ( Tu peux voir : "Column + 1" )
Donc dans chaque cellule, il n'y a que deux mises en forme conditionnelles (qui en plus, sont toujours les mêmes).

Les mises en formes conditionnelles sont limitées à 3 par cellule !
Je viens d'essayer dans un classeur plus de 20 formats conditionnels répartis sur une quinzaine de cellules et aucun problème!

Le problème ne vient donc pas, à mon humble avis, du nombre de répétitions du format.
Je ne pense donc pas être obligé d'en enlever.

Maintenant, s'il s'agit réellement du problème, je veux bien enlever tout format conditionnel à chaque exécution et n'en mettre qu'un seul sur toute la plage de cellule concernée.
Mais encore une fois, je ne crois pas que ça vienne de là.

En attendant de tes nouvelles.
Si d'autres pouvaient m'aiguiller sur mon problème, j'en serait le plus heureux car je ne trouve vraiment pas la clé du problème.

Bien à vous.
Et merci d'avance!
Ajouter un commentaire
Réponse
+0
moins plus
Re Armojax.

C'est précisément là le problème, je viens de le trouver aussi et vu ton dernier post, c'est exactement ça!

En fait ma macro n'est pas sensée revenir sur une cellule qui a déjà été remplie mais le problème (qui finalement n'en est pas un) est que lorsque je fais des essais, j'efface le contenu des cellules et donc pas la mise en forme conditionnelle que j'oublie!
Donc la macro est bonne mais pas la manipulation que je fais de mon fichier.

Il vaudrait donc mieux que lors de ma mise en forme conditionnelle dans la macro, je vérifie d'abord si une conditionnelle est déjà présente et si oui, l'effacer avant d'appliquer la nouvelle (qui est la même).

Si tu savais m'aider sur la ligne de code à entrer pour dire en bon visual:

With Feuil2.Cells(17, Colonne)

If .FormatCondition = True Then
.Format.Conditions.Clear
End If


.FormatConditions.Add Type:=xlCellValue, Operator:=xlNotBetween, _
Formula1:="16", Formula2:="22"
.FormatConditions(1).Font.ColorIndex = 3
End With
Ajouter un commentaire
Réponse
+0
moins plus
Tu peux mettre, p.ex. :
If .FormatConditions.Count <> 0 Then
  .FormatConditions.Delete
End If

Tu peux aussi écrire tout simplement :
.FormatConditions.Delete
sans rien tester, car la commande ne plante pas, même si aucun format n'existe (donc pas besoin de On error... etc.).
Ajouter un commentaire
Réponse
-7
moins plus
salut les as d'excel !!!


Je travaille avec une équipe de 6 personnes pendent 7 jours de la semaines et sur trois shifts répartis comme suit: 3 de 8h à 15h; 2 de 15h à 22h et 1 de 18h à 1h du matin. Comment faire pour automatiser le planing hebdomadaire sur une période de 5 semaines par exemple. il existe aussi certaines conditions: par exemple celui qui travaille de 18hà 1h ne doit pas faire 8h-15h le lendemain. Le week end seuls 2 personnes travaillent la journée et les autres se reposent.

Merci de m'aider!!!!
Ajouter un commentaire
Ce document intitulé « Excel - macro (mise en forme conditionnelle) » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
5 extensions si vous voulez revenir à l'ancien Facebook