[VBA] Correction auto ne tenant pas compte de la casse

Bonjour,

Pour corriger automatiquement des cellules, j'utilise ce code là :

Dim lrdic&, lrco&, t&, j&, p&
Dim dic As Worksheet, co As Worksheet
Dim N%
Dim d() As String

Set dic = Worksheets("Bibliothèque")
Set co = Worksheets("Correspondances")

With dic
    lrdic = .Cells(.Rows.Count, 1).End(xlUp).Row ' compte le nombres de lignes utilisées dans table
    ReDim Preserve d(2, lrdic + 1) ' défini un tableau à 2 dimensions (2 , Nb de lignes)
        For p = 1 To lrdic
            d(1, p) = .Cells(p, 1).Value 'boucle qui charge dans le tableau les anciens codes et les nouveaux
            d(2, p) = .Cells(p, 2).Value
        Next p
End With

With co
lrco = .Cells(.Rows.Count, 1).End(xlUp).Row ' compte le nombre de lignes utilisées dans base

    For t = 1 To lrco ' boucle sur nombre de lignes de base
    For j = 1 To lrdic ' boucle sur nombre de lignes de table

    If d(1, j) = .Cells(t, 3).Value Then _
    .Cells(t, 3).Value = d(2, j) ' compare la valeur ancienne du tableau avec le contenu de la cellule colonne a de base
    Next j ' change la valeur si la comparaison est vrai
    Next t
    .Activate
End With

Il fonctionne bien, mais il tiens compte de la casse, ce qui pose des problème.

Je viens poser la question ici, afin de savoir s'il est possible ou pas de ne pas tenir compte de la casse.

Si ça n'est pas possible, alors il faudra que je m'assure que chaque cellule commence par une majuscule.

Dans mon cas, si j'ai "cale vulg", il doit être transformé par "Cale arve" mais ne l'est pas, car la première lettre n'est pas une majuscule.

Je joins un document, si vous souhaitez voir comment s'exécute le code.

Ne sachant pas trop comment ne pas prendre en compte la casse, je risque d'opter pour le passage de toutes les premières lettre des codes en majuscule.

Bonne journée !

bonjour,

voici une macro qui transforme la premiere lettre d'un nom en majuscule

Public Function nom_propre(nom As String) As String

Dim premiere_lettre As String

premiere_lettre = UCase(Left$(nom, 1))

nom_propre = premiere_lettre & Right$(nom, Len(nom) - 1)

End Function

Bonjour,

une proposition d'adaptation de ton code

Private Sub CommandButton1_Click()
    Dim lrdic&, lrco&, t&, j&, p&
    Dim dic As Worksheet, co As Worksheet
    Dim N%
    Dim d() As String

    Set dic = Worksheets("Bibliothèque")
    Set co = Worksheets("Correspondances")

    With dic
        lrdic = .Cells(.Rows.Count, 1).End(xlUp).Row    ' compte le nombres de lignes utilisées dans table
        d = .Cells(1, 1).Resize(lrdic, 2) 'charge table d à partir de la plage de conversion
    End With
    With co
        lrco = .Cells(.Rows.Count, 1).End(xlUp).Row    ' compte le nombre de lignes utilisées dans base
        Set plage = .Cells(2, 3).Resize(lrco, 1)
        For j = 1 To lrdic    ' boucle sur nombre de lignes de table d
            plage.Replace d(1, j), d(2, j), lookat:=xlWhole, MatchCase:=False
        Next j
    End With
End Sub

Bonjour,

En tête du module de l'UserForm, tu inscris :

Option Compare Text

afin que ça ne tienne pas compte de la casse !

Bonjour,

Merci pour vos propositions.

J'ai malheureusement une erreur "Incompatibilité de type" sur cette ligne :

d = .Cells(2, 1).Resize(lrdic, 2)

Je suis curieux de savoir ce qui fait clocher cette partie du code, car il m'a l'air beaucoup plus efficace que celui que j'utilise pour le moment (vitesse d'exécution).

Merci Theze, ça marche !

Est-ce que si j'utilise Option Compare Text dans un UF qui contient de nombreux autres sub, cela ne va pas engendrer des erreurs dans leur exécution ?

A partir du moment que tu inscris Option Compare Text, ça impacte tout le module (et non les autres) donc toutes les procédures dans ce module qui effectuent des comparaisons de texte !

Sinon, tu as la fonction de comparaison de texte StrComp() (dans ce cas, tu peux supprimer "Option Compare Text") où tu peux préciser le type de comparaison que tu souhaites donc, pour toi ça serait :

If StrComp(d(1, j), .Cells(t, 3).Value, vbTextCompare) = 0 Then

Bonjour,

apparemment je n'ai pas mis la bonne version.

Private Sub CommandButton1_Click()
    Dim lrdic&, lrco&, t&, j&, p&
    Dim dic As Worksheet, co As Worksheet
    Dim N%
    Dim d

    Set dic = Worksheets("Bibliothèque")
    Set co = Worksheets("Correspondances")

    With dic
        lrdic = .Cells(.Rows.Count, 1).End(xlUp).Row    ' compte le nombres de lignes utilisées dans table
        d = .Cells(1, 1).Resize(lrdic, 2) 'charge table d à partir de la plage de conversion
    End With
    With co
        lrco = .Cells(.Rows.Count, 1).End(xlUp).Row    ' compte le nombre de lignes utilisées dans base
        Set plage = .Cells(2, 3).Resize(lrco, 1)
        For j = 1 To lrdic    ' boucle sur nombre de lignes de table d
            plage.Replace d(j, 1), d(j, 2), lookat:=xlWhole, MatchCase:=False
        Next j
    End With
End Sub

Merci pour votre aide ! Vos deux solutions fonctionnent très bien dans mon document.

Rechercher des sujets similaires à "vba correction auto tenant pas compte casse"