Vérifier le nombre d'une cellule suit le nombre d'une autre cellule
Bonjour tout le monde,
Je suis actuellement en train de coder une macro en VBA, et on m'a demandé de vérifier une donnée sur les documents que je traite, mais je ne sais pas comment faire.
Les documents que je traite suivent un système de révision : ils sont d'abord émis en révision 01, puis en révision 02, etc.
La vérification qui m'est demandée est la suivante : quand un document est en revision 02, vérifier que la précédente était bien 01, idem revision 03 pour 02 précedemment, etc. J'ai pour cela deux colonnes, une avec la revision actuelle, appelée Revision Number, et une avec la précédente, appelée Previous Revision Number.
Etant donné qu'il peut y avoir un nombre infini de revisions pour un document, j'aimerai trouver une autre solution que faire :
Dim za As Long, aa As Integer, ba As Integer
aa = Sheets("Nom de la feuille").ListObjects("Table1").ListColumns("Revision Number").Index
ba = Sheets("Nom de la feuille").ListObjects("Table1").ListColumns("Previous Revision Number").Index
dl = Cells(Rows.Count, an).End(xlUp).Row
For za = 1 To dl
If ActiveSheet.ListObjects("Table1").DataBodyRange(za, aa).Value = "02" AND ActiveSheet.ListObjects("Table1").DataBodyRange(za, ba).Value ="01"
Else
ActiveSheet.ListObjects("Table1").DataBodyRange(za, aa).Interior.Color = vbRed
End If
Next za
Pour que les cellules incorrectes soient colorées en rouge dans chacun des cas.
Il y a également une exception : dans le cas où c'est la première revision d'une document, donc 01 dans "Revision Number", l'information dans la colonne "Previous Revision Number" peut être "F" ou la cellule peut être vide.
Est-ce que vous auriez une idée pour vérifier qu'à chaque fois, la cellule de la colonne "Previous Revision Number" soit "-1" de la colonne "Revision Number", tout en incluant l'exception ?
Merci d'avance à vous et bonne journée,
Aelyth
Bonjour,
Un essai à tester :
Option Explicit
Sub Test()
Dim Lig As Long, RN As Integer, PRN As Integer
With Sheets("Nom de la feuille").ListObjects("Table1")
RN = .ListColumns("Revision Number").Index
PRN = .ListColumns("Previous Revision Number").Index
For Lig = 1 To .DataBodyRange.Count
If .DataBodyRange(Lig, RN).Value * 1 > 1 Then
If .DataBodyRange(Lig, PRN).Value * 1 = .DataBodyRange(Lig, RN).Value - 1 Then
.DataBodyRange(Lig, RN).Interior.ColorIndex = xlNone 'Supprime couleur éventuelle
Else
.DataBodyRange(Lig, RN).Interior.Color = vbRed
End If
Else
.DataBodyRange(Lig, RN).Interior.ColorIndex = xlNone 'Supprime couleur éventuelle
End If
Next Lig
End With
End Sub
PS : essayez d'utiliser des noms de variable un peu plus explicites que aa
, ab
, etc
Bonjour,
Merci beaucoup de votre réponse ! Je vais essayer ça, toutefois, de ce que je comprends, cela ne prend pas en compte l'exception de la revision 01, si ?
Bonne journée !
Bonjour,
Merci beaucoup de votre réponse ! Je vais essayer ça, toutefois, de ce que je comprends, cela ne prend pas en compte l'exception de la revision 01, si ?
Bonne journée !
Normalement si : If .DataBodyRange(Lig, RN).Value * 1 > 1 Then
Le principe de tout ça est de convertir la référence texte ("01") en nombre valide avec un *1
. On peut alors réaliser des comparaisons mathématiques.
PS : c'est aussi réalisable en MFC, sans aide de VBA.
Je pense que je me suis mal exprimée sur l'exception : si le document est en revision 01, alors le résultat dans la colonne Previous Revision Number peut être F ou vide.
Je pense que je me suis mal exprimée sur l'exception : si le document est en revision 01, alors le résultat dans la colonne Previous Revision Number peut être F ou vide.
Actuellement, si le document est en révision 01, je ne vérifie pas le contenu de la cellule previsous revision correspondante. Si ce n'est pas ton souhait, il te reste juste à compléter la partie Else
de la 1ère structure If
.
Bonjour,
J'ai enfin eu le temps de tester la macro (désolée pour le temps de réponse...) et je constate un problème à l'éxécution : la macro saute les lignes suivantes :
Option Explicit
Sub Test()
Dim Lig As Long, RN As Integer, PRN As Integer
With Sheets("Nom de la feuille").ListObjects("Table1")
RN = .ListColumns("Revision Number").Index
PRN = .ListColumns("Previous Revision Number").Index
For Lig = 1 To .DataBodyRange.Count
If .DataBodyRange(Lig, RN).Value * 1 > 1 Then
If .DataBodyRange(Lig, PRN).Value * 1 = .DataBodyRange(Lig, RN).Value - 1 Then
.DataBodyRange(Lig, RN).Interior.ColorIndex = xlNone 'Supprime couleur éventuelle
Else
.DataBodyRange(Lig, RN).Interior.Color = vbRed
End If
Else
.DataBodyRange(Lig, RN).Interior.ColorIndex = xlNone 'Supprime couleur éventuelle
End If
Next Lig
End With
End Sub
Et je ne comprends pas du tout pourquoi. Une idée ?
Merci encore de ton aide et bonne journée !
Même chose en adaptant la macro ainsi :
Dim zak As Long, aak As Integer, bak As Integer
aak = Sheets("VendorDocument").ListObjects("Table1").ListColumns("Revision Number").Index
bak = Sheets("VendorDocument").ListObjects("Table1").ListColumns("Previous Revision Number").Index
For zak = 1 To dl
If Sheets("VendorDocument").ListObjects("Table1").DataBodyRange(zak, aak).Value * 1 > 1 Then
If Sheets("VendorDocument").ListObjects("Table1").DataBodyRange(zak, bak).Value * 1 = ActiveSheet.ListObjects("Table1").DataBodyRange(zak, aak).Value - 1 Then
Sheets("VendorDocument").ListObjects("Table1").DataBodyRange(zak, bak).Interior.ColorIndex = xlNone
Else
Sheets("VendorDocument").ListObjects("Table1").DataBodyRange(zak, aak).Interior.Color = vbRed
End If
Else
ActiveSheet.ListObjects("Table1").DataBodyRange(zak, aak).Interior.ColorIndex = vbBlue
End If
Next zak