Microsoft 365 macro de comparaison

bd.afaf

XLDnaute Junior
Bonjour Forum,

je veux faire une macro selon le concept suivant : si le mois d'avant est payé et que le mois prochain remonte un montant qui n'est pas payé, de mettre ce montant en gras et en rouge. j'ai donné le résultat que je souhaite avoir avec une macro ( les montants en rouge) .

Voici mon tableau comme exemple:
 

Pièces jointes

  • Classeur3.xlsx
    15.9 KB · Affichages: 6

soan

XLDnaute Barbatruc
Inactif
@bd.afaf

je ne comprends pas ; après exécution de ma macro, j'ai ceci :

Image.jpg


en colonne H, il y a 4 montants rouges, les mêmes qu'en colonne U :
c'est bien comme ton "RESULTAT DEMANDE". (voir cellule N2)



ajout : je ne vois aucune cellule où il y a "déjà payé" ; comme quoi tu n'as pas fourni un fichier exemple représentatif de ton fichier d'origine ! :confused: (alors après, ne t'étonnes pas si la macro qu'on te propose ne fais pas tout ce que tu attendais ; la macro n'est pas devin, ni moi non plus ! 😄)

soan
 
Dernière édition:

bd.afaf

XLDnaute Junior
@bd.afaf

je ne comprends pas ; après exécution de ma macro, j'ai ceci :

Regarde la pièce jointe 1139591

en colonne H, il y a 4 montants rouges, les mêmes qu'en colonne U :
c'est bien comme ton "RESULTAT DEMANDE". (voir cellule N2)

soan
oui c'est ce que j'ai, je veux modifié le code pour faire 2 exception; "payé" et "Déja payé"
parce que j'ai ajouté le deja payé dans mon tableau
 

Pièces jointes

  • Classeur33.xlsx
    15.4 KB · Affichages: 2

soan

XLDnaute Barbatruc
Inactif
@bd.afaf

autre essai :

fais Ctrl e ➯ travail effectué ; d'où ce résultat :

Image.jpg


code VBA :
VB:
Option Explicit

Sub Essai()
  Dim dlg&, lig&
  With Worksheets("Feuil2").ListObjects("Tableau2")
    If .DataBodyRange Is Nothing Then Exit Sub
    dlg = .ListRows.Count: Application.ScreenUpdating = 0
    For lig = 1 To dlg
      With Cells(lig + 4, 6)
        If InStr(.Value, "payé") > 0 And .Offset(, 2) <> 0 Then
          With Cells(.Row, 8).Font
            .Color = -16776961: .Bold = -1
          End With
        End If
      End With
    Next lig
  End With
End Sub
soan
 

Pièces jointes

  • Classeur33.xlsm
    23.7 KB · Affichages: 3
Dernière édition:

bd.afaf

XLDnaute Junior
@bd.afaf

autre essai :

fais Ctrl e ➯ travail effectué ; d'où ce résultat :

Regarde la pièce jointe 1139597

code VBA :
VB:
Option Explicit

Sub Essai()
  Dim dlg&, lig&
  With Worksheets("Feuil2").ListObjects("Tableau2")
    If .DataBodyRange Is Nothing Then Exit Sub
    dlg = .ListRows.Count: Application.ScreenUpdating = 0
    For lig = 1 To dlg
      With Cells(lig + 4, 6)
        If InStr(.Value, "payé") > 0 And .Offset(, 2) <> 0 Then
          With Cells(.Row, 8).Font
            .Color = -16776961: .Bold = -1
          End With
        End If
      End With
    Next lig
  End With
End Sub
soan
Bonjour soan,
ça marche bien, si tu peux m'expliquer ce que signifie ces lignes
VB:
   For lig = 1 To dlg

      With Cells(lig + 4, 6)

        If InStr(.Value, "payé") > 0 And .Offset(, 2) <> 0 Then

          With Cells(.Row, 8).Font
 

soan

XLDnaute Barbatruc
Inactif
Bonjour bd.afaf,

ça marche bien, si tu peux m'expliquer ce que signifie ces lignes

For lig = 1 To dlg : dlg est la dernière ligne du tableau structuré, donc : de la 1ère ligne à la dernière ligne de "Tableau2".

With Cells(lig + 4, 6) : avec la cellule de la ligne lig + 4, colonne 6 ; pourquoi +4 ? car la 1ère ligne de "Tableau2" est la ligne 5 de "Feuille2" : il y a au-dessus 3 lignes vides (lignes 1 à 3), et la ligne d'en-têtes est en ligne 4 ; la colonne 6 est la colonne F ; donc : pour la 1ère ligne de "Tableau2", on référence F5 ; pour la 2ème ligne de "Tableau2", on référence F6 ; pour la 3ème ligne de "Tableau2", on référence F7 ; etc... ça permet de lire successivement toutes les valeurs de la colonne "Fevrier".

If InStr(.Value, "payé") > 0 And .Offset(, 2) <> 0 Then : si la valeur lue dans la colonne "Fevrier" contient "payé" (donc pour "payé" et pour "Déjà payé") et que la valeur de la cellule située 2 colonnes à droite est différente de 0, alors... (alors plus bas on va mettre en rouge et en gras) ; InStr(.Value, "payé") : InStr est l'abréviation de InString : recherche d'un texte dans une chaîne de caractères (voir l'Aide Excel pour plus de détails) ; .Offset(, 2) : 1er paramètre omis ➯ même ligne ; 2ème paramètre = 2 ➯ 2 colonnes à droite ; ça fait que si on est en train de lire F5 (1ère valeur de "Fevrier" = 645), alors on teste la valeur de H5 (qui est "payé") ; or un texte ("payé" ou autre) a la valeur 0 ; ça tombe bien puisque pour des nombres d'autres lignes de la colonne H, c'est seulement s'ils sont différents de 0 (positifs ou négatifs), qu'on va les mettre en rouge gras ; ensuite, quand on va lire F6, c'est H6 qu'on va tester ; puis quand on va lire F7, c'est H7 qu'on va tester, etc...

With Cells(.Row, 8).Font : avec la cellule de la ligne .Row, colonne 8 ; la colonne 8 est la colonne H ; la ligne .Row est la même ligne que celle de la cellule du 1er With ; c'est donc lig + 4 (déjà expliqué plus haut) ; donc si on est en train de lire une valeur de la colonne F, c'est bien une valeur de la colonne H dont on va modifier la présentation.

.Color = -16776961 : en rouge ; .Bold = -1 : idem que .Bold = True : en gras.​

soan
 

bd.afaf

XLDnaute Junior
Bonjour bd.afaf,



For lig = 1 To dlg : dlg est la dernière ligne du tableau structuré, donc : de la 1ère ligne à la dernière ligne de "Tableau2".

With Cells(lig + 4, 6) : avec la cellule de la ligne lig + 4, colonne 6 ; pourquoi +4 ? car la 1ère ligne de "Tableau2" est la ligne 5 de "Feuille2" : il y a au-dessus 3 lignes vides (lignes 1 à 3), et la ligne d'en-têtes est en ligne 4 ; la colonne 6 est la colonne F ; donc : pour la 1ère ligne de "Tableau2", on référence F5 ; pour la 2ème ligne de "Tableau2", on référence F6 ; pour la 3ème ligne de "Tableau2", on référence F7 ; etc... ça permet de lire successivement toutes les valeurs de la colonne "Fevrier".

If InStr(.Value, "payé") > 0 And .Offset(, 2) <> 0 Then : si la valeur lue dans la colonne "Fevrier" contient "payé" (donc pour "payé" et pour "Déjà payé") et que la valeur de la cellule située 2 colonnes à droite est différente de 0, alors... (alors plus bas on va mettre en rouge et en gras) ; InStr(.Value, "payé") : InStr est l'abréviation de InString : recherche d'un texte dans une chaîne de caractères (voir l'Aide Excel pour plus de détails) ; .Offset(, 2) : 1er paramètre omis ➯ même ligne ; 2ème paramètre = 2 ➯ 2 colonnes à droite ; ça fait que si on est en train de lire F5 (1ère valeur de "Fevrier" = 645), alors on teste la valeur de H5 (qui est "payé") ; or un texte ("payé" ou autre) a la valeur 0 ; ça tombe bien puisque pour des nombres d'autres lignes de la colonne H, c'est seulement s'ils sont différents de 0 (positifs ou négatifs), qu'on va les mettre en rouge gras ; ensuite, quand on va lire F6, c'est H6 qu'on va tester ; puis quand on va lire F7, c'est H7 qu'on va tester, etc...

With Cells(.Row, 8).Font : avec la cellule de la ligne .Row, colonne 8 ; la colonne 8 est la colonne H ; la ligne .Row est la même ligne que celle de la cellule du 1er With ; c'est donc lig + 4 (déjà expliqué plus haut) ; donc si on est en train de lire une valeur de la colonne F, c'est bien une valeur de la colonne H dont on va modifier la présentation.

.Color = -16776961 : en rouge ; .Bold = -1 : idem que .Bold = True : en gras.​

soan
Merci beaucoup, c'est trés bien détaillé ta réponse 👌
 

Statistiques des forums

Discussions
311 725
Messages
2 081 940
Membres
101 845
dernier inscrit
annesof