Recopier le code VBA sur chaque feuille?
Bonjour à toutes et tous,
n'arrivant pas à résoudre mon problème de mise en forme conditionnelle dans mes tableaux, j'ai trouvé un code VBA qui me permet de contourner le problème.
Seulement voilà, je n'y connais pas grand chose en vba et donc je me pose la question suivante:
ce code doit être appliqué sur plusieurs feuilles de mon classeur, mais pour chaque feuille, les couleurs changent. Dois-je recopier ce code dans chaque feuille et modifier les références couleurs pour chaque feuille ou peut-on le mettre dans un module, et appeler la macro sur chaque feuille en ayant précisé sur chacune de ces feuilles les couleurs que l'on souhaite?
Merci d'avance pour votre aide!
Private Sub Worksheet_Change(ByVal Target As Range)
Dim derL As Long, x As Long, y As Byte, Verif As String, Sh As Worksheet
Set Sh = ActiveSheet '<-- nom de la feuille à adaper
derL = Sh.Cells.SpecialCells(xlCellTypeLastCell).Row '<-- trouve la dernière ligne utilisée
For x = 2 To derL Step 2 '<-- une ligne sur deux de la ligne 2 à la dernière ligne
Verif = ""
For y = 1 To 17 '<-- vérification de la colonne A à la colonne L
Verif = Verif & Sh.Cells(x, y) '<-- concaténation des valeurs de chaque cellule de la ligne dans la variable Verif
Next y
If Verif <> "" Then '<-- si la variable Verif n'est pas vide c'est qu'au moins une cellule de la ligne contient une valeur
Sh.Range(Sh.Cells(x, 1), Sh.Cells(x, 17)).Interior.ColorIndex = 41
Sh.Range(Sh.Cells(x, 1), Sh.Cells(x, 17)).Font.ColorIndex = 2
Sh.Range(Sh.Cells(x, 1), Sh.Cells(x, 17)).Borders.Weight = xlThin
Sh.Range(Sh.Cells(x - 1, 1), Sh.Cells(x - 1, 17)).Interior.ColorIndex = 37
Sh.Range(Sh.Cells(x - 1, 1), Sh.Cells(x - 1, 17)).Borders.Weight = xlThin
End If
Next x
End SubBonjour,
Essaie d'utiliser :
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
' ton code existant
End SubA placer dans le module 'ThisWorkbook'
Et tu supprimes la(les) macro(s) existante(s)
Bonjour Jean-Eric,
c'est ce que j'ai essayé de faire et ça fonctionne très bien,
le problème, c'est que je dois adapter le nombre de colonne à colorer car elles diffèrent d'une feuille à l'autre et je voudrais aussi pouvoir adapter la couleur en fonction des feuilles (par exemple bleu pour l'une et vert pour l'autre)
j'avais donc pensé déclarer des variables supplémentaires dans le code puis dans chaque page affecter la référence couleur souhaitée, mais ça marche pas... je dois mal m'y prendre!
Bonjour à tous,
La solution de Jean-Eric est parfaite lorsque la même procédure s'applique à toutes les feuilles ...
Dans la mesure où tu as manifestement des singularités à chaque feuille, il sera plus simple de recopier ton code "générique" dans chaque feuille ... puis de procéder aux modifications "spéciales" à chaque feuille ...
Re,
Si ce n'est qu'un nombre de colonnes, tu peux comme tu fais pour le nombre de lignes, calculer le nombre de colonnes.
Avec par exemple :
iCol=sh.cells(1,Columns.count).End(xlToLeft).columnEt modifier ta boucle
For y =1 to iColEtc...
Cdlt.
Bonjour,
vu que ton code fait toutes les lignes je ferais plutôt avec sheet_activate.
Un exemple avec des array :
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Dim derL As Long, x As Long, y As Byte, Verif As String
Dim numF As Long, feuilles, nbcol, couleur1
feuilles = Array("Feuil2", "Feuil3")
nbcol = Array(17, 24)
couleur1 = Array(41, 35)
For numF = 0 To UBound(feuilles)
If Sh.Name = feuilles(numF) Then Exit For
Next numF
If numF > UBound(feuilles) Then Exit Sub
Sh.Range(Sh.Cells(2, 1), Sh.Cells(2, nbcol(numF))).Interior.ColorIndex = couleur1(numF)
End SubPrincipe transposable sur SheetChange mais tu pourrais ne faire que la ligne où a eu lieu la modif (?)
eric
PS: fait un peu vite sans tester. Pas le temps actuellement de corriger mais le principe est là
PS2 : corrigé
Bonjour à vous!
Eriic, un grand merci pour ton code, c'est exactement ce que je cherchais à faire, sauf que... ca ne me colore que la ligne '2' et non toutes les lignes paires encodées (par exemple, les lignes 2,4,6,8 et 10)
J'ai essayé de me raccrocher au code que j'avais publié dans mon premier post, mais j'ai l'impression que cela n'a plus rien à voir...
Est-ce que tu peux me dire ce à quoi je dois regarder dans le code pour le modifier?
Merci d'avance!!!
Bonjour,
oui, ça ne fait que la ligne 2 car ta question était comment l'appliquer sur plusieurs feuilles, pas comment colorer les lignes paires qui sort d'on ne sait où....
Et tu ne réponds pas à la question : traiter toute la feuille ou seulement la ligne modifiée ?
Soit tu traites toute la feuille et tu y mets ton code qui balaie les ligne et les teste (ou bien lignes paires mais ce n'est pas du tout ce que tu faisais), soit tu ne contrôles que la ligne modifiée et tu changes d'évènement comme dit précédemment.
eric
Bonjour Eric,
excuse moi je me suis mal exprimé dans mon premier post, comme je parlais de mise en forme conditionnelle qui ne fonctionnais pas, dans ma tête c'était compréhensible que je souhaitais colorer une ligne sur deux... désolé.
Pour une raison que j'ignore les MFC permettant de colorer les lignes paires (ou impaires) ne fonctionnent pas sur tous mes tableaux. J'avais posté sur le sujet et les personnes qui y ont jeté un oeil n'ont pas compris non plus pourquoi ça e fonctionne pas!
J'ai donc trouvé un code (que j'ai posté en premier post) qui permet de colorer une ligne sur deux au fur et à mesure de l'encodage.
(je ne sais pas si c'est la bonne méthode pour traiter une ligne sur deux, mais le code que j'ai posté le fait)
Ce code est donc placé dans la feuille, dans l'évènement "change".
Il balaie en effet toute la feuille et colore une ligne sur deux.
Mon classeur contient plusieurs feuilles ou ce code doit être appliqué. Pour chaque feuille:
- le nombre de colonne est différent, mais il ne changera plus.
- le nombre de ligne est différent et il évolue au fur et a mesure des encodage de l'utilisateur.
La question initiale que je me posais était:
faut-il recopier à chaque fois ce code dans chaque feuille et modifier le nombre de colonne (le code initial gérant la dernière ligne encodée) et les références couleurs OU y'a-t-il un moyen, à partir d'un seul code de l'adapter aux différentes feuilles?
(ce que tu as parfaitement réalisé pour ton code en ligne 2)
-> sur base de ton code (qui s'adapte ou nombre de colonnes et défini dès le départ les couleurs de chaque feuilles) peut-on colorler toutes les lignes paires? Ce code devant s'adapter à chaque changement sur la feuille (donc si je comprend bien à placer dans l'évènement "change")
Encore une fois, je suis désolé si je ne me suis pas bien exprimé et je te remercie pour ton aide,
Oui, apparemment les MFC ne font pas bon ménage avec les listes.
Si on reprend le problème à la base, sur un changement en colonne A (ajout d'une ligne) tu veux mettre en couleur les lignes impaires.
On peut utiliser .interior.colorindex directement, ou si tu préfères, une autre MFC qui colorie toujours 1 ligne/2 même si la table est filtrée.
A mettre dans thisworkbook du classeur de l'autre topic :
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim numF As Long, feuilles, couleur1
If Target.Count = 1 And Target.Column = 1 Then
feuilles = Array("Encodage Présences", "Feuil3")
couleur1 = Array(39, 35)
For numF = 0 To UBound(feuilles)
If Sh.Name = feuilles(numF) Then Exit For
Next numF
If numF > UBound(feuilles) Then Exit Sub
With Target.Resize(, [A1].End(xlToRight).Column)
'.Interior.ColorIndex = couleur1(numF)
'ou
.FormatConditions.Delete
.FormatConditions.Add Type:=xlExpression, Formula1:="=MOD(SOUS.TOTAL(103;$A$1:$A" & Target.Row & ");2)=0"
.FormatConditions(1).Interior.ColorIndex = couleur1(numF)
End With
End If
End SubRegarde si ça te va.
eric
Bonjour Eriiic,
c'est exactement ce qu'il me fallait!!!!! Un tout grand merci!!!
Juste une question(qui n'a rien à voir avec le code):
comme tu peux le constater, je ne m'y connais pas vraiment en VBA...!
au niveau des codes, est-ce qu'il vaut mieux le mettre dans le workbook ou dans chaque feuille concernée? (voir dans des modules?)
Encore merci pour ton aide!
Bonjour,
Le mieux est de rester logique.
S'il doit concerner qu'une feuille, le mettre plutôt dans cette feuille.
S'il doit concerner plusieurs feuilles le mettre dans thisworkbook : un seul code à maintenir.
Et rien n'empêche de les écrire dans des modules qui regroupent les procédures par 'fonction', de les appeler depuis le module feuille ou thisworkbook. Une même procédure pourra aussi être appelée depuis 2-3 feuilles sans passer par thisworkbook.
Ca permet d'avoir des modules feuille ou thisworkbook plus légers et plus clairs où on voit facilement la gestion des événements, débarrassés des procédures assez longues.
Mais chacun a ses petites habitudes et improvise selon le besoin du moment.
eric
Merci pour ces infos!
Mon fichier fonctionne comme je le souhaite! je vais maintenant essayer d'organiser les différents code pour le rendre plus logique et plus simple!
Encore un grand merci pour ton aide!