Mise en forme conditionnelle selon feuille précédente
Bonjour,
Après une recherche infructueuse, j'en appelle à votre expertise !
Allons droit au but alors :
Mon fichier excel se compose de plusieurs feuilles nommées "S1", "S2", "S3", [...] "S999". Il sert à recenser les pertes en valeur et en volume de produits vendus.
J'ai dans ce même fichier un tableau avec une colonne comportant des numéros d'article ("5212", "4656", "5499", etc.).
J'aimerais, grâce à une mise en forme conditionnelle, que les lignes de mon tableau soient surlignées lorsque le numéro d'article est déjà présent dans la feuille précédente.
J'entends par là que si la valeur est un doublon de la feuille "S" -1 à la feuille "S" en cours (par
exemple le numéro d'article 555 de la semaine 30 était déjà présent en semaine 29), il faudrait que la ligne soient automatiquement surlignée afin de repérer facilement les articles qui perdurent d'une semaine à l'autre.
Les feuilles sont exactement les mêmes en termes de mise en forme. Les cellules sont toutes à la même place.
Débutant excel, j'ai tout de même réussi après recherches à faire appel à la valeur d'une cellule de la semaine précédente en utilisant la fonction INDIRECT et en lui faisant comprendre d'aller chercher dans la feuille "S" avec -1 à la valeur de la semaine.
Par contre, pour ce qui est de ma demande sur la mise en forme conditionnelle, je suis complètement paumé.
Merci d'avance à toutes et tous pour votre aide,
Très bonne soirée,
Lucas
Bonsoir Lucas, bonsoir le forum,
Avec une mise en forme conditionnelle je ne sais pas faire mais par VBA je pense que c'est réalisable. Si ça t'intéresse, il me faut juste savoir :
superluke a écrit :J'ai dans ce même fichier un tableau avec une colonne comportant des numéros d'article ("5212", "4656", "5499", etc.).
C'est quelle colonne précisément ?... Et un petit fichier exemple avec juste un onglet et quelques lignes de données...
Bonjour
Bonjour ThauTheme alias Robert ?
Il y a une possibilité avec des formules XL4 nommées et elle fonctionne en MFC mais il faut sauvegarder le classeur en xlsm ou xlsb et activer les macros à l'ouverture.
999 feuilles : je n'imagine pas la gestion d'un truc pareil...
Bonsoir,
Merci pour l'accueil et pour la réponse.
Je n'ai pas le fichier que je travaille sous la main mais je joins un exemple qui se rapproche de ce que je voudrais faire (ce que j'aurais probablement du faire dès le départ).
J'aimerais que pour la feuille S2 apparaîssent en surligné les lignes des articles présents dans la feuille S1 (c'est à dire les lignes des articles "55032", "55066", "55084" et 55099").
Sachant que les feuilles des semaines à venir ne sont pas encore créées, il est super important que la formule aille chercher les données en S -1 afin que les personnes amenées à utiliser le fichier ne se soucient d'absolument rien mis à part saisir des données.
En espérant avoir été clair,
Encore une fois merci d'avance,
Lucas
Bonsoir le fil, bonsoir le forum,
@Chris : oui ! C'est le bon alias...
@Superluke : En pièce jointe ton fichier modifié. À tester sur ton vrai fichier. Il te suffira de copier le code ci-dessous et de le coller dans la composant ThisWorkbook de celui-ci.
Le code :
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Dim NI As Integer 'déclare la variable NI (Numéro d'Index)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim TVP As Variant 'déclare la variable TVP (Tableau des Valeurs Pécédent)
Application.ScreenUpdating = False 'empêche le rafraîchissement d'écran
NI = ActiveSheet.Index 'définit le numéro d'index de l'onglet actif
Sheets(NI).Range("G13").CurrentRegion.Interior.ColorIndex = xlNone
If NI > 1 Then 'condition : si le numéro d'index est supérieur à 1
TV = Sheets(NI).Range("G13").CurrentRegion 'définit le tableau des valeur TV
TVP = Sheets(NI - 1).Range("G13").CurrentRegion 'définit le tableau des valeur précédent TVP
For I = 1 To UBound(TV, 1) 'boucle 1 : sur toutes les lignes I du tableau des valeurs TV
For J = 1 To UBound(TVP, 1) 'boucle 2 : sur toutes les lignes J du tableau des valeurs précédent TVP
'si la données ligne I colonne 1 de TV est égale à la donnée ligne J colonne 1 de TVP
'colore la celllue ligne I+12, colonne 7 de l'onglet actif en rouge, sort de la boucle 2
If TV(I, 1) = TVP(J, 1) Then Sheets(NI).Cells(I + 12, 7).Interior.ColorIndex = 3: Exit For
Next J 'prochaine ligne de la boucle 2
Next I 'prochaine ligne de la boucle 1
End If 'fin de la condition
End SubLe fichier :
Bonjour,
Réponse un petit peu tardive.
Tout d'abord merci beaucoup pour ton aide. C'est exactement ce je cherchais. C'est aussi la première fois que j'utilise VBA donc c'est super cool de découvrir tout ça.
J'essaie depuis un petit moment de comprendre afin d'utiliser le code fourni pour l'appliquer à mon fichier. C'est pour cela que je ne reviens que maintenant vers vous.
Sans vouloir paraitre pessimiste, je ne pense pas être en mesure d'apporter les modifications nécessaires afin que tout colle. J'ai pas mal d'erreurs qui apparaissent lorsque j'apporte une modification ou autre (je ne comprends pas bien l'utilisation de la valeur "I" et "J" qui doit correspondre à ligne et colonne ?). Je n'arrive pas non plus à étendre la coloration à toute la ligne ou encore à définir une limite des lignes à traiter. Bref, difficile de déchiffrer en un court laps de temps pour un novice tel que moi.
Je pense que le plus simple est de joindre deux onglets de mon tableur afin qu'une personne bien plus experte que moi dans ce domaine l'applique. Je pourrai ensuite comparer avec le premier code fourni et ce que j'essayais de faire afin de repérer ce qui correspond à quoi.
Pour résumer : je n'arrive pas à définir les lignes exactes à traiter ni à surligner la ligne entière (cad de la cellule F4 à la cellule I4 pour la première ligne par exemple). Je coince au niveau de l'utilisation de "I" et "J".
Désolé d'en demander autant,
En tout cas merci beaucoup pour l'aide super rapide,
J'y retourne !
Lucas
edit 1 : je n'ai besoin que du tableau du haut pour la surbrillance des doublons (le tableau avec les 20 articles, de la ligne 1 à 23)
Re,
Hé oui ! Toujours fournir un exemple reflétant la réalité de ton tableau, sinon ce n'est que temps perdu !...
Le code adapté à ton fichier avec des commentaires plus fournis :
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Dim NI As Integer 'déclare la variable NI (Numéro d'Index)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim TVP As Variant 'déclare la variable TVP (Tableau des Valeurs Pécédent)
Dim I As Integer 'déclare la variable I (Incrément de ligne)
Dim J As Integer 'déclare la variable J (Incrément de ligne)
Application.ScreenUpdating = False 'empêche le rafraîchissement d'écran (pour éviter d'avoir les couleurs qui s'affichent ligne par ligne)
NI = ActiveSheet.Index 'définit le numéro d'index de l'onglet actif
Sheets(NI).Range("F4").CurrentRegion.Interior.ColorIndex = xlNone 'supprime la couleur si il y en a
'Range("F4").Currentregion représente la plage des cellules contiguës à F4 sans rencontrer de ligne ou de colonne vide, cela équivaut à F4:I23
'si tes tableaux sont toujours F4:I23, on peut remplacer dans le code [Range("F4")].CurrentRegion par [Range("F4:I23")]
If NI > 1 Then 'condition : si le numéro d'index est supérieur à 1 (sinon plantage pour l'onglet [0])
'les variables tableau (TV et TVP) contiennent les mêmes valeurs que les cellules auxquelles elles se réfèrent mais leur accès est
'dix fois plus rapide que de lire directement dans la cellule. L'accès à une donnée du tableau se fait par sa référence
'ligne / colonne. TV(1, 1) représente la donnée ligne 1 colonne 1 de TV soit, dans l'onglet, la cellule F4 (ligne 1+3, colonne 6)
TV = Sheets(NI).Range("F4").CurrentRegion 'définit le tableau des valeurs TV ou Sheets(NI).Range("F4:I23")
TVP = Sheets(NI - 1).Range("F4").CurrentRegion 'définit le tableau des valeurs précédent TVP ou Sheets(NI - 1).Range("F4:I23")
'Attention ! la ligne 1 du tableau des valeurs (TV ou TVP) correspond de fait à la ligne 4 dans l'onglet
'c'est pourquoi quand on repère un doublon on colore la ligne I+3 dans l'onglet !
'UBound (TV, 1) représente la dernière ligne de TV, comme UBound(TV, 2) représenterait la dernière colonne de TV
For I = 1 To UBound(TV, 1) 'boucle 1 : sur toutes les lignes I du tableau des valeurs TV
For J = 1 To UBound(TVP, 1) 'boucle 2 : sur toutes les lignes J du tableau des valeurs précédent TVP
'si la donnée ligne I colonne 1 de TV est égale à la donnée ligne J colonne 1 de TVP
'colore la cellule ligne I+3, colonne 6 (=> colonne F) de l'onglet actif en orange, sort de la boucle 2
'avec Resize(1, 4) on redimensionne la cellule à une ligne, 4 colonnes, cela permet de colorer la ligne entière
'pour les couleurs, essaie en remplaçant le numéro [44] par une valeur entre 1 et 56...
If TV(I, 1) = TVP(J, 1) Then Sheets(NI).Cells(I + 3, 6).Resize(1, 4).Interior.ColorIndex = 44: Exit For
'Exit For car il est inutile de continuer à chercher un doublon dans le tableau précédent de la boucle 2, on gagne du temps
Next J 'prochaine ligne de la boucle 2
Next I 'prochaine ligne de la boucle 1
End If 'fin de la condition
End SubBonjour ThauThème,
Tout simplement génial.
Un grand merci pour tous les commentaires qui vont franchement m'être utile.
Et excuse-moi d'avoir fourni un exemple avec lequel je n'ai pas su me débrouiller. Je le saurai pour la prochaine fois.
Ravi d'avoir découvert ce forum !
Je te souhaite une excellente journée, ainsi qu'à tous ceux qui passent par là.
Lucas