MFC par macro

ccpapy

XLDnaute Impliqué
bonsoir,

je n'ai pas trouvé de sujet correspondant à mon problème sur le forum
donc je me permets de vous demander de l'aide.
j'importe des données par macro sur un onglet et je cherche à colorier certaines cellules
suivant des conditions multiples jusqu'à la dernière ligne (variable)
tant que j'avais une seule condition, je m'en sortais mais là.....

un fichier joint pour exprimer mon souhait. (colonne F format heure > 24)

merci
 

Pièces jointes

  • test couleur.xls
    20.5 KB · Affichages: 27
  • test couleur.xls
    20.5 KB · Affichages: 30
  • test couleur.xls
    20.5 KB · Affichages: 26
Dernière édition:

Papou-net

XLDnaute Barbatruc
Re : MFC par macro

Bonsoir ccpapy,

Peut-être comme ceci :

Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim DerLgn
DerLgn = ActiveSheet.Range("A65536").End(xlUp).Row
Dim Cel As Range
For Each Cel In Range("F3:F" & DerLgn)
  Cel.Interior.ColorIndex = xlNone
  Select Case Cel.Offset(0, -2)
    Case Is = 1
      If Cel.Offset(0, 2) < 5 Then Cel.Interior.ColorIndex = 3
    Case Is = 2
      If Cel.Offset(0, 2) < 10 Then Cel.Interior.ColorIndex = 3
    Case Is = 3
      If Cel.Offset(0, 2) < 15 Then Cel.Interior.ColorIndex = 3
    Case Is = 4
      If Cel.Offset(0, 2) < 20 Then Cel.Interior.ColorIndex = 3
  End Select
Next Cel
End Sub
Il y a apparemment une discordance dans le signe de comparaison entre ta demande (>) et le code de ton fichier (<). J'ai considéré celui du fichier..

Bonne soirée.

Cordialement.
 
Dernière édition:

ccpapy

XLDnaute Impliqué
Re : MFC par macro

bonsoir et merci pour ce début de réponse
dans mon post, je tenais à préciser que le format de la colonne F était [h]:00 pour prendre en compte les valeurs supérieures à 24H

je viens de coller ton code sur le fichier test et toutes les cellules passent au rouge
j'essaye de voir pourquoi
exemple de ce que j'aimerai
D=1 et F<05:00 rouge mais si d=1 et F>05:00 pas de couleur
là tout reste rouge
encore merci
 

Papou-net

XLDnaute Barbatruc
Re : MFC par macro

je viens de coller ton code sur le fichier test et toutes les cellules passent au rouge
j'essaye de voir pourquoi

Ah, avec un surcroît de réflexion j'ai trouvé la parade :

Il faut calculer le quota horaire en commençant par diviser 1 par 24 et le multiplier par la valeur adaptée. En effet, pour Excel, 1 jour =24 heures donc 1 heure= 1/24ème de jour.

Modifie donc le code comme ceci :

Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim DerLgn
DerLgn = ActiveSheet.Range("A65536").End(xlUp).Row
Dim Cel As Range
For Each Cel In Range("F3:F" & DerLgn)
  Cel.Interior.ColorIndex = xlNone
  Select Case Cel.Offset(0, -2)
    Case Is = 1
      If Cel.Value < 1 / 24 * 5 Then Cel.Interior.ColorIndex = 3
    Case Is = 2
      If Cel.Value < 1 / 24 * 10 Then Cel.Interior.ColorIndex = 3
    Case Is = 3
      If Cel.Value < 1 / 24 * 15 Then Cel.Interior.ColorIndex = 3
    Case Is = 4
      If Cel.Value < 1 / 24 * 20 Then Cel.Interior.ColorIndex = 3
  End Select
Next Cel
End Sub
Cordialement.
 

ccpapy

XLDnaute Impliqué
Re : MFC par macro

je teste ça,
je voulais aussi préciser l'erreur
If Cel.Offset(0, 2) à remplacer par cel tout court
mais tu as corrigé avant...
donc je teste et j'édite.

Edit:
tu es toujours là pour me sauver la mise, ton astuce fonctionne bien.

un grand merci et bonne soirée
 
Dernière édition:

Gareth

XLDnaute Impliqué
Re : MFC par macro

Re,

Une autre version macro

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
For Each X In Range("A1").CurrentRegion.Offset(2, 3).Resize(, 1)
    X.Offset(0, 2).Interior.ColorIndex = xlNone
    For i = 1 To 4
        If X.Value = i And X.Offset(0, 2).Value < TimeValue("5:00") * i Then X.Offset(0, 2).Interior.ColorIndex = 3
    Next
Next
End Sub
 

ccpapy

XLDnaute Impliqué
Re : MFC par macro

bonjour Gareth,
la version excel utilisée ne permet pas plus de 3 conditions pour la mfc, de plus la façon utilisée pour remplir l'onglet (macro) supprime d'abord les lignes écrites pour re-écrire de nouvelles valeurs. ce qui imposerait d'appliquer la mfc sur un trop grand nombre de ligne. voilà pourquoi je désirais écrire une macro
ta solution aidera peut-être un futur demandeur qui fera une recherche sur le forum
merci quand même d'avoir planché sur le sujet
bonne journée à tous
 

Gareth

XLDnaute Impliqué
Re : MFC par macro

Bonjour,

Je n'ai pas bien compris la contrainte d'application de la MFC sur un trop grand nombre de ligne mais dans le fichier joint, la MFC sur une seule ligne qui devrait donc fontionner sur les anciennes version ...
 

Pièces jointes

  • test couleur.xls
    28 KB · Affichages: 22
  • test couleur.xls
    28 KB · Affichages: 23
  • test couleur.xls
    28 KB · Affichages: 21

Si...

XLDnaute Barbatruc
Re : MFC par macro

salut

Si... tu veux un peu plus court :
Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  Dim C As Range
  For Each C In Range("F3:F" & Range("F65536").End(xlUp).Row)
    C.Interior.ColorIndex = xlNone
    If C < 1 / 24 * 5 * C.Offset(0, -2) Then C.Interior.ColorIndex = 3
  Next
End Sub
 

ccpapy

XLDnaute Impliqué
Re : MFC par macro

re,
assez, n'en jetez plus Papounet avait résolu le problème :):):)
sinon plaisanterie mise à part, pour Gareth:
la contrainte d'appliquer la mfc sur un trop grand nombre de ligne vient du fait que les lignes sont supprimées avant écritures à chaque activation de l'onglet donc les mfc seront supprimées à chaque fois, il arrivera un moment où je n'aurai pas prévu la mfc.

comment me faire mieux comprendre ?
à échelle réduite, je prévois la mfc jusqu'à la ligne 20, après 2 activations de cet onglet j'aurais supprimé par exemple 18 lignes, du coup seule les 2 premières lignes auront une mfc, le reste de mes données ne seront pas coloriées...

par contre ta formule intégrant les "ou" et les "et" fonctionne parfaitement et contourne effectivement le problème de limitation sur la version excel utilisée.
 

Gareth

XLDnaute Impliqué
Re : MFC par macro

Bonsoir,

Un petit dernier pour la route ...
encore plus court :
Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim C As Range
For Each C In Range("F3:F" & Range("F65536").End(xlUp).Row)
    C.Interior.ColorIndex = IIf(C < 1 / 24 * 5 * C.Offset(0, -2), 3, xlNone)
Next
End Sub

Il est possible d'utiliser la MFC et de la propager sur tout le tableau par Macro.
Voir le fichier joint.
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Set Var = Range("A1").Offset(2, 5).Resize(Range("A1").CurrentRegion.Rows.Count - 2, 1)
Var.FormatConditions.Delete
Var.FormatConditions.Add Type:=xlExpression, Formula1:="=OU(ET(D3=1;F3<""5:00""*1);ET(D3=2;F3<""10:00""*1);ET(D3=3;F3<""15:00""*1);ET(D3=4;F3<""20:00""*1))"
Var.FormatConditions(1).Interior.ColorIndex = 3
End Sub
 

Pièces jointes

  • test couleur.xls
    35 KB · Affichages: 23
  • test couleur.xls
    35 KB · Affichages: 20
  • test couleur.xls
    35 KB · Affichages: 23

Staple1600

XLDnaute Barbatruc
Re : MFC par macro

Bonsoir à tous

Pour le fun et pour un chouïa plus court ;)
Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim C As Range
For Each C In Range([F3], [F65536].End(xlUp))
    C.Interior.ColorIndex = 3 * -(C < 1 / 24 * 5 * C.Offset(, -2))
Next
End Sub
 

Staple1600

XLDnaute Barbatruc
Re : MFC par macro

Re

Parce plus court c'est encore possible, mais est-ce bien sérieux ;)
Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim c As Range
For Each c In Range([F3], [F65536].End(xlUp))
    c.Interior.ColorIndex = 3 * -(c < 0.2083 * c(, -1))
Next
End Sub
 
Dernière édition:

Discussions similaires

Réponses
5
Affichages
591

Statistiques des forums

Discussions
312 312
Messages
2 087 159
Membres
103 484
dernier inscrit
maintenance alkern