Qui n’a pas été confronté à des heures de recherches parce-qu’un test sur une chaîne de caractères n’a pas produit le résultat escompté.
Scénario
Nous avons une liste de données comme l’illustre l’image ci-dessous et vous devez retrouver tous les travaux avec comme statut « Pending » pour les placer en « Invoice« .
La liste de données
La formule
Ces lignes de code qui suivent se trouvent dans une boucle où la variable Row est le numéro de la ligne testée.
If .Range("D" & Row) = "Pending" Then .Range("E" & Row) = "Invoice" Else .Range("E" & Row) = "" End If
Le test logique pourrait être également exprimé comme ci-dessous.
.Range("E" & Row) = IIf(.Range("D" & Row) = "Pending", "Invoice", "")
Le constat
Nous pouvons voir que certaines cellules ne sont pas sélectionnées.
Au premier constat, nous pouvons repérer que la cellule D15 est écrite en majuscule, la cellule D9 commence par un caractère espacé.
Par contre, nous ne voyons pas la raison pour laquelle les cellules D2 et D17 n’ont pas été prise en compte car à première vue, l’orthographe et la casse sont correctes.
Après une recherche approfondie, nous pourrons repérer qu’un ou plusieurs caractères espacés suivent le mot.
La solution
Transformer la valeur se trouvant dans les cellules D2 et suivantes en supprimant les caractères espacés de gauche et de droite en forçant la casse en minuscule. Soit
LCase(Trim(.Range("D" & Row)))
Ce qui donne comme test
If LCase(Trim(.Range("D" & Row))) = "pending" Then
La procédure complète
Sub Test() Dim Row As Long With ThisWorkbook.Worksheets("works") For Row = 2 To .Range("A1").CurrentRegion.Rows.Count If LCase(Trim(.Range("D" & Row))) = "pending" Then .Range("E" & Row) = "Invoice" Else .Range("E" & Row) = "" Next Row End With End Sub
Ou
Sub Test() Dim Row As Long With ThisWorkbook.Worksheets("works") For Row = 2 To .Range("A1").CurrentRegion.Rows.Count .Range("E" & Row) = IIf(LCase(Trim(.Range("D" & Row))) = "pending", "Invoice", "") Next Row End With End Sub
La formule en Excel
Gardons en mémoire que le VBA n’est pas toujours une voie à suivre et qu’une simple formule dans excel parfois suffit.
=SI(MINUSCULE(SUPPRESPACE(D2))="pending";"Invoice";"")
En fait, la formule qui suit suffit car le test logique d’excel n’est pas sensible à la casse.
=SI(SUPPRESPACE(D2)="pending";"Invoice";"")
Commentaires récents