Comment simplifier mon code

Bonsoir les gens.

Au travail, je fais tourner une macro et j'aimerai la simplifier quelque peu mais je n'y arrive pas.

J'ai une boucle qui recherche des informations diverses et change la mise en forme de la cellule où l'information se trouve.

Ça donne ceci:

If Cells(n, 7) = "MAG" then
Cells(n, 7).Interior.ColorIndex = 3
Cells(n, 7).Font.ColorIndex = 2
Cells(n, 7).Font.Bold = True
End If

J'ai une déclinaison de ces lignes pour plusieurs cellules et plusieurs mot à chercher avec plusieurs couleurs.

J'aimerai faire plutôt comme ceci:

Rouge = "couleur intérieure de la cellule en rouge", "le texte en gras", "le texte en blanc"
 pour arriver sur
If Cells(n, 7) = "MAG" Then
Cells(n, 7) = Rouge
End If

Si vous pouviez m'aider je vous serait reconnaissant.

Bonsoir,

je dirais : impossible. VBA est un langage orienté objet, vous ciblez un Objet ici le Range ou la cellule par l'instruction Cells, et après individuellement vous devez modifier ses propriété : le gras, la couleur de fond, la couleur d'écriture.

Une solution dans le fichier joint : Créer une cellule dans une feuille de votre classeur qui s'appelle "Rouge" pour suivre votre exemple, lui donner la couleur de fond rouge, l'écriture Grasse, couleur de police le Blanc, j'ai ajouté le centré.

Si vous trouvez une cellule avec le texte "Mag" alors le code copie en destination de cette cellule la cellule qui s'appelle "Rouge", ceci a pour conséquence d'effacer le contenue de la cellule testée, il suffit d'y inscrire alors "Mag" !

7testrouge.xlsm (14.99 Ko)

Si la valeur "Mag" est issue d'une formule, vous perdez la formule.

Sinon votre code peut-être "simplifié" comme ceci :

If Cells(n, 7) = "MAG" then
    With Cells(n,7)
        .Interior.ColorIndex = 3
        .Font.ColorIndes = 2
        .Font.Bold = True
    End With
End If

@ bientôt

LouReeD

Merci LouReeD.

C'est dommage que ce ne soit pas possible car ça aurait bien simplifié la chose.

Bonsoir Eluriand, LouReeD,

C'est possible. Voilà ci-dessous.

Sub Boucle()
'Boucle de recherche
For i = 1 To 10
If Cells(i, 7) = "Mag" Then Rouge (Cells(i, 7))
Next
End Sub

Function Rouge(Rg As Range)
'Fonction de formatage
Rg.Interior.ColorIndex = 3
Rg.Font.ColorIndex = 2
Rg.Font.Bold = True
End Function

Principe: La boucle d'exemple qui recherche le terme "Mag" pour le formater.

Et la fonction Rouge qui assure le formatage.

Comme on dit souvent : si c'est impossible ce n'est pas Excel !

J'y étais presque sur ce coup là ! Pas pensé à la fonction !

@ bientôt

LouReeD

Bonjour X Cellus.

Merci beaucoup pour ton aide.

Ça correspond exactement à ce que je souhaitais faire.

Je vous colle mon code après modification, si vous voyez des choses à dire n'hésitez pas, je suis un noob en VBA et du coup j'ai tendance à en écrire de trop.

Sub MiseEnForme()

Dim Ord As Object
Dim Rmax As Long
Dim n As Long

Set Ord = ThisWorkbook.Sheets("Ordered")

With Ord
    .Activate
    Rmax = .Cells(Rows.Count, 3).End(xlUp).Row
    For n = 7 To Rmax
        If .Rows(n).Hidden = False Then
        ActiveSheet.Cells(n, 7).Select

            '**********Mise en forme colonne C**********'

            If Cells(n, 3) = Cells(n + 1, 3) Then Cells(n, 3).Interior.ColorIndex = 50 'cellule en vert
            If Cells(n, 3) = Cells(n - 1, 3) Then Cells(n, 3).Interior.ColorIndex = 50 'cellule en vert

            '**********Mise en forme colonne D**********'

            If Cells(n, 4) <> "n/a" Then Rouge (Cells(n, 4))

            '**********Mise en forme colonne E**********'

            If Cells(n, 5) <> "CABB1B2" Then Rouge (Cells(n, 5))

            '**********Mise en forme colonne F**********'

            If Cells(n, 6) = "0:00 Hours" Then Gris (Cells(n, 6))

            '**********Mise en forme colonne G**********'

            Cells(n, 7) = Replace(Cells(n, 7), "-", " ")
            Cells(n, 7).NumberFormat = "m/d/yyyy"

            '**********Mise en forme colonne H**********'

            If Cells(n, 8) Like ("(*)") Then
                Cells(n, 8) = Mid(Cells(n, 8), 2, 11)
                Cells(n, 8) = Replace(Cells(n, 8), "-", " ")
                Cells(n, 8).NumberFormat = "d/m/yyyy"
            End If

            If Cells(n, 8) Like ("*UTC") Then
                Cells(n, 8) = Left(Cells(n, 8), 11)
                Cells(n, 8) = Replace(Cells(n, 8), "-", " ")
                Cells(n, 8).NumberFormat = "m/d/yyyy"
            End If

            '**********Mise en forme colonne J en fonction de la colonne K**********'

            If Cells(n, 11) Like "RDY*" Or Cells(n, 11) Like "rdy*" Then
                Cells(n, 10) = "RDY"
                Jaune (Cells(n, 10))
                Cells(n, 11).Interior.ColorIndex = 6
                Cells(n, 23) = "X"
                Rouge (Cells(n, 23))
            End If

            If Cells(n, 11) Like "RDY*BMCC*" Or Cells(n, 11) Like "rdy*bmcc" Or Cells(n, 11) Like "RDY*bmcc" Or Cells(n, 11) Like "rdy*BMCC" Then
                Cells(n, 10) = "BMCC"
                Bleu (Cells(n, 10))
                Cells(n, 11).Interior.ColorIndex = 33 'cellule en bleu
                Cells(n, 23) = "X"
                Rouge (Cells(n, 23))
            End If

            If Cells(n, 11) Like "IDT*" Or Cells(n, 11) Like "idt*" Then
                Cells(n, 10) = "IDT"
                Orange (Cells(n, 10))
                Cells(n, 11).Interior.ColorIndex = 44 'cellule en orange
                Cells(n, 23) = "X"
                Rouge (Cells(n, 23))
            End If

            If Cells(n, 11) Like "DUE*" Or Cells(n, 11) Like "due*" Then
                Cells(n, 10) = "DUE"
                Rose (Cells(n, 10))
                Cells(n, 11).Interior.ColorIndex = 38 'cellule en rose
                Cells(n, 23) = "X"
                Rouge (Cells(n, 23))
            End If

            '**********Mise en forme colonne N**********'

            If Cells(n, 14) Like "*KL*" Then Rouge (Cells(n, 14))

            '**********Mise en forme colonne P**********'

            If Cells(n, 16) = "GEN_PAR" Then Gris (Cells(n, 16))

            '*****************************Durée de vie du TRFX****************************

            If DateDiff("d", Cells(n, 7), Now) > 0 And DateDiff("d", Cells(n, 7), Now) <= 120 Then Cells(n, 7).Interior.Color = RGB(127, 255, 0)

            If DateDiff("d", Cells(n, 7), Now) > 120 And DateDiff("d", Cells(n, 7), Now) <= 220 Then Cells(n, 7).Interior.Color = RGB(107, 142, 35)

            If DateDiff("d", Cells(n, 7), Now) > 220 And DateDiff("d", Cells(n, 7), Now) <= 300 Then RougeClair (Cells(n, 7))

            If DateDiff("d", Cells(n, 7), Now) > 300 Then Rouge (Cells(n, 7))

       End If

    Next n

End With

End Sub

Bonjour,

une suggestion sans voir le fichier : certaines de ces "mise en forme" pourraient basculer directement sur la feuille avec les Mise en Forme Conditionnelle, non ?
Du coup le code serait réduit d'autant.

@ bientôt

LouReeD

Bonjour LouReeD.

Nous avions des formes conditionnelles mais ceci contribuait à alourdir le fichier (presque 2Mo pour moins d'une centaine de ligne) et surtout ralentissait Excel. Un copier/coller d'une cellule prenait jusqu'à plus d'une minute en fonction du nombre de lignes totales du fichier.

Du coup, on les as supprimé et remplacées par une macro.

Bonsoir,

souvent les MFC sur Excel 2007 et plus ont tendances à alourdir le fichier car ces dernières sont faites sur un ligne entière par exemple (plus de 16000 colonnes) ou bien des colonnes entières (plus d'1 000 000 de lignes)

Si vos données sont structurés dans des tableaux et que les MFC cible ces tableaux, alors non je ne pense pas que cela puisse monté à 2 Mo pour une centaines de lignes. Mais sans fichier pas facile à dire mais je pense que MFC pour des MFC c'est plus simple que du VBA.

@ bientôt

LouReeD

Rechercher des sujets similaires à "comment simplifier mon code"