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

Tester une chaîne de caractèresLa 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";"")