Je travaille sur un programme VBA qui permettrait à l'utilisateur de taper une adresse et de trouver l'emplacement en faisant correspondre les éléments de l'adresse à une base de données.
Malheureusement, j'ai un problème récurrent avec la sensibilité à la casse.
Par exemple, lorsque j'utilise ce code:
For i = 11 To lRowB
Range("B" & i).Activate
myResult = IsNumeric(Application.Match(ActiveCell.Value, manilaListRange, 0))
Il va comparer la valeur de la cellule active à une liste de mots de ma base de données. Le problème est que si dans ma cellule active le mot est "miami" ou "MIAMI" et que seul "Miami" est dans la base de données, cela ne fonctionnera pas ...
Autre exemple:
If Range("J6").Value = "tawi" Then
Range("J6").Value = "Tawi-Tawi"
End If
Même problème, seule la Parole écrite avec la même casse fonctionnera.
Comment puis-je me débarasser de cela? C'est particulièrement agaçant et je ne peux pas réécrire ma base de données dans tous les cas possibles!
Merci d'avance !
Vous pouvez émettre une déclaration au niveau du module:
Option Compare Text
Cela rend toutes les "comparaisons de texte" insensibles à la casse. Cela signifie que le code suivant affichera le message "ceci est vrai":
Option Compare Text
Sub testCase()
If "UPPERcase" = "upperCASE" Then
MsgBox "this is true: option Compare Text has been set!"
End If
End Sub
Voir par exemple http://www.ozgrid.com/VBA/vba-case-sensitive.htm . Je ne suis pas sûr que cela résoudra complètement le problème pour toutes les instances (telle que la fonction Application.Match
) mais il s’occupera de toutes les instructions if a=b
. En ce qui concerne Application.Match
- vous pouvez convertir les arguments en majuscules ou en minuscules à l'aide de la fonction LCase
.
Vous pouvez convertir les valeurs en minuscules et comparer.
Voici un exemple:
If LCase(Range("J6").Value) = LCase("Tawi") Then
Range("J6").Value = "Tawi-Tawi"
End If
Si la liste à comparer est longue (c'est-à-dire la plage manilaListRange dans l'exemple ci-dessus), il est judicieux d'utiliser la fonction de correspondance. Cela évite l'utilisation d'une boucle qui pourrait ralentir la procédure. Si vous pouvez vous assurer que manilaListRange est tout en majuscule ou en minuscule, cela me semble être la meilleure option. Il est rapide d'appliquer "UCase" ou "LCase" au fur et à mesure de votre match.
Si vous n'aviez pas le contrôle sur ManilaListRange, vous devrez peut-être recourir à la lecture en boucle de cette plage. Dans ce cas, il existe de nombreuses façons de comparer "recherche", "Instr", "remplacer", etc.
C'est un peu de bidouille mais fera l'affaire.
Function equalsIgnoreCase(str1 As String, str2 As String) As Boolean
equalsIgnoreCase = LCase(str1) = LCase(str2)
End Function