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 IfJ'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 IfSi 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" !
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 FunctionPrincipe: 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 SubBonjour,
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