Créer des MFC d'un type prédéfini pour chaque ligne d'une feuille

Me revoilà !

Alors,

voilà, telle qu'affichée sur mon Mac, la plage à laquelle s'applique la MFC pour la cellule R24 (prise au hasard) :

Feuil1!$F$9:$S$11;Feuil1!$F$16:$S$17;Feuil1!$F$23:$S$25

C'est la MFC qui a pour formule

=F9>5

et qui colorie les cellules en orange.

A part ça, quand j'insère plage.Select au début des macros MFC1 et MFC2_4, que je me mets en style L1C1 et que je clique sur le bouton "MFC" j'obtiens le message d'erreur suivant :

Erreur d'exécution "5" : Argument ou appel de procédure incorrect.

Et le débogueur surligne la ligne

plage.FormatConditions.Add Type:=xlExpression, Formula1:="=ET(LC4<=L2C;LC5>=L3C)"

J'espère que ça va t'éclairer...

Bonjour,

Ah, j'avais compris que c'était dans la formule qu'il insérait la feuille.

Là on ne peut rien faire d'autre que mettre plage.Select au début et

Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=ET(LC4<=L2C;LC5>=L3C)"

En espérant qu'il n'ait pas de difficulté sur le type L1C1 de la formule.

eric

Donc je remplace :

plage.FormatConditions.Add Type:=xlExpression, Formula1:="=ET(LC4<=L2C;LC5>=L3C)"

par

Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=ET(LC4<=L2C;LC5>=L3C)"

Si c'est ça, ça beugue sur mon Mac.

(erreur d'exécution 5, ligne surlignée en jaune au débogage : plage.FormatConditions.Add Type:=xlExpression, Formula1:="=ET(LC4<=L2C;LC5>=L3C)" )

Pour être sûr de ne pas faire de bêtise voilà l'ensemble de la macro modifiée :

Sub MFC1(plage As Range) ' MFC dates
    Application.ScreenUpdating = False
    plage.Select
    plage.FormatConditions.Add Type:=xlExpression, Formula1:="=ET(LC4<=L2C;LC5>=L3C)"
    plage.FormatConditions(plage.FormatConditions.Count).Interior.ColorIndex = 37
End Sub

Heuuu, tu n'as pas remplacé plage par Selection sur chaque ligne après le plage.Select (?!?)

Hem hem...erreur d'étourderie de ma part.

Si, je l'avais fait sur une précédente version test.

Donc voilà le code rectifié, mais il beugue :

Sub MFC1(plage As Range) ' MFC dates
    Application.ScreenUpdating = False
    plage.Select
    Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=ET(LC4<=L2C;LC5>=L3C)"
    Selection.FormatConditions(plage.FormatConditions.Count).Interior.ColorIndex = 37
End Sub

Désolé mais là je ne vois plus de différence avec ton exemple.

Il va falloir que tu fasses un appel au peuple en précisant MFC sur Mac dans le titre.

Si tu peux mettre le lien ici que je m'instruise

eric

Merci eriiic.

Je vais faire ce que tu suggères.

J'apprécie que tu m'aies accompagné jusque-là – et tant mieux si au bout du bout, quelqu'un t'apprend qqch.

ton erreur ne s'est pas propagée sur la ligne suivante des fois ?

Car il reste un plage oublié :

Selection.FormatConditions(plage.FormatConditions.Count).Interior.ColorIndex = 37

eric

En tous cas, avec Selection.FormatConditions(plage.FormatConditions.Count).Interior.ColorIndex = 37, ça fonctionne sur PC.

J'ai essayé de juste supprimer ce plage et de tester sur mon PC :

plage.FormatConditions(FormatConditions.Count).Interior.ColorIndex = 37

...et ça ne marche pas. Excel me renvoie une "erreur de compilation : variable non définie" avec la ligne ci-dessus surlignée en jaune.

Ah non, une fois plage.select effectué il faut remplacer tous les plage par Selection, il ne doit plus en rester :

Selection.FormatConditions(Selection.FormatConditions.Count).Interior.ColorIndex = 37

eric

Hello,

Je relance ce sujet car je me suis aperçu qu'une macro de recréation de MFC que j'avais créée il y a longtemps était fonctionnelle sur mon Mac.

Je la copie/colle des fois qu'elle puisse t'éclairer.

Au besoin, je peux envoyer le fichier sur lequel elle agit, mais il y aura un travail d'anonymisation qui peut me prendre du temps.

Voilà la macro :

Sub Effacer_et_Reconstruire_MFC()
'
    Selection.FormatConditions.Delete

    Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
       "=ET(L5C>43000;LC6<>"""";LC5<=L4C;LC6>=L5C)"
    Selection.FormatConditions(1).Interior.ColorIndex = 41

    Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
        "=ET(L5C>43000;LC4<=L4C;LC5>=L5C)"
    Selection.FormatConditions(2).Interior.ColorIndex = 37

    Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
        "=JOUR(L5C)<JOUR(L5C(-1))"
    With Selection.FormatConditions(3).Borders(xlLeft)
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = 3
    End With

End Sub

Bonjour,

désolé mais je vois encore la même chose que ce que je t'ai proposé en dernier :

Mettre une MFC formule en français et références type L1R1, ceci sur Selection.

Mais au fait, pour les tests tu lançais bien la macro principale MFC() qui effaçait les précédentes MFC puis appelait les 2 macros MFC_xxx ?

Ces 2 dernières n'incluaient pas l'effacement puisque réalisé auparavant.

En résumé voici le cumul des modifs pour se mettre au plus près de ton exemple.

Comme ça avançait petit à petit, peut-être oubliais-tu de remettre une modif antérieure, ou bien tu appliquais de façon incomplète.

Sub MFC1(plage As Range) ' MFC dates
    Application.ScreenUpdating = False
    plage.Select
    Selection.FormatConditions.Delete
    Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=ET(LC4<=L2C;LC5>=L3C)"
    Selection.FormatConditions(1).Interior.ColorIndex = 37
End Sub

Sub MFC2_4(plage As Range) ' MFC contenu
    Application.ScreenUpdating = False
    plage.Select
    Selection.FormatConditions.Delete
    Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=LC>5"
    Selection.FormatConditions(1).Interior.ColorIndex = 45
    Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=ET(LC>0;LC<5)"
    Selection.FormatConditions(2).Interior.ColorIndex = 6
    Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=LC=5"
    Selection.FormatConditions(3).Interior.ColorIndex = 15
End Sub

J'ai remis un .Delete même s'il est déjà fait, ça ne mange pas de pain. Il faut quand même garder le 1er qui est plus large.

MFC mises sur Selection, et dans le doute j'ai aussi remplacé Selection.FormatConditions.Count par son n° bien que tu n'aies jamais eu d'erreur dessus vu que tu n'atteignais pas cette ligne.

Là on ne peut pas plus proche, et les formules sont correctes puisque ok sur 2010.

Good luke

eric

Merci.

J'ai remplacé le code dans les 2 macros...mais ça coince encore avec une erreur d'exécution '5' : "Argument ou appel de procédure incorrect" sur la ligne

Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=ET(LC4<=L2C;LC5>=L3C)"

A tout hasard je recolle le code intégral des 3 macros pour voir si je n'ai pas oublié qqch comme tu le suggères :

Option Explicit

Sub MFC()
    ' reconstruire MFC F:x feuille active
    Const lig1 As Long = 6, col1 As Long = 6    ' 1ère cellule des MFC, à adapter
    Dim datas, pl1 As Range, pl2 As Range
    Dim lig As Long, derlig As Long, dercol As Long, ReferenceStyleSav As Long
    ReferenceStyleSav = Application.ReferenceStyle
    Application.ReferenceStyle = xlR1C1
    derlig = Cells(Rows.Count, 1).End(xlUp).Row
    dercol = Cells(3, Columns.Count).End(xlToLeft).Column
    Cells(lig1, col1).Resize(Rows.Count - derlig + 1, Columns.Count - dercol + 1).FormatConditions.Delete
    datas = [A1].Resize(derlig).Value
    For lig = 6 To UBound(datas)
        Select Case datas(lig, 1)
        Case "C"
            If pl1 Is Nothing Then Set pl1 = Cells(lig, col1).Resize(, dercol - col1 + 1) Else Set pl1 = Union(pl1, Cells(lig, col1).Resize(, dercol - col1 + 1))
        Case "D"
            If pl2 Is Nothing Then Set pl2 = Cells(lig, col1).Resize(, dercol - col1 + 1) Else Set pl2 = Union(pl2, Cells(lig, col1).Resize(, dercol - col1 + 1))
        End Select
    Next
    If Not pl1 Is Nothing Then MFC1 pl1
    If Not pl2 Is Nothing Then MFC2_4 pl2
    Application.ReferenceStyle = ReferenceStyleSav
End Sub

Sub MFC1(plage As Range) ' MFC dates
    Application.ScreenUpdating = False
    plage.Select
    Selection.FormatConditions.Delete
    Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=ET(LC4<=L2C;LC5>=L3C)"
    Selection.FormatConditions(1).Interior.ColorIndex = 37
End Sub

Sub MFC2_4(plage As Range) ' MFC contenu
    Application.ScreenUpdating = False
    plage.Select
    Selection.FormatConditions.Delete
    Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=LC>5"
    Selection.FormatConditions(1).Interior.ColorIndex = 45
    Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=ET(LC>0;LC<5)"
    Selection.FormatConditions(2).Interior.ColorIndex = 6
    Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=LC=5"
    Selection.FormatConditions(3).Interior.ColorIndex = 15
End Sub

Oui, nous sommes d'accord.

1) par curiosité met If Not pl1 Is Nothing Then MFC1 pl1 en commentaire pour voir s'il butte également sur la formule extrèmement simple "=LC>5"

2) comme je ne me rappelle plus trop tout ce qui a été testé essaie ensuite :

Sub MFC1bis(plage As Range) ' MFC dates
    Application.ScreenUpdating = False
    Application.ReferenceStyle = xlA1
    [F6:S8].Select
    Selection.FormatConditions.Delete
    Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=ET($D6<=F$2;$E6>=F$3)"
    Selection.FormatConditions(1).Interior.ColorIndex = 37
    Application.ReferenceStyle = xlR1C1
End Sub

à lancer tout seul directement, uniquement sur Mac, avec des dates en D6:E8 bien sûr

eric

Merci eriiic,

Avant de pouvoir rerereretester, comment je fais pour mettre If Not pl1 Is Nothing Then MFC1 pl1 en commentaire ?

Bonjour,

il faut mettre une apostrophe ' devant.

L'enlever pour remettre en service.

eric

Hello,

il faut mettre une apostrophe ' devant.

Ah OK, ça je savais, mais je n'avais pas compris ce que tu me demandais.

1) par curiosité met If Not pl1 Is Nothing Then MFC1 pl1 en commentaire pour voir s'il butte également sur la formule extrèmement simple "=LC>5"

C'est fait...et ça beugue toujours de la même façon

2) (...) essaie ensuite : (...)

C'est fait...et – après suppression de l'apostrophe testée en 1) – ça beugue de la même façon sur cette ligne :

Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=ET($D6<=F$2;$E6>=F$3)"

Il ne reste plus l'eau bénite sur l'UC à essayer...

J'ai déjà essayé........

Rechercher des sujets similaires à "creer mfc type predefini chaque ligne feuille"