Sommeprod et Exact dans VBA

Résolu/Fermé
lantenac - Modifié le 6 sept. 2018 à 16:56
 lantenac - 6 sept. 2018 à 16:55
Bonjour,

Je cherche à créer une fonction personnalisée qui effectue un test simple sur une colonne de données, à savoir si pour chaque cellule il en existe d'autres qui ont la même écriture mais une casse différente. La formule que je tape directement dans excel est celle-ci :
=SI(SOMMEPROD(EXACT(F21;$F$21:$F$28)*1)=NB.SI($F$21:$F$28;F21);VRAI;FAUX)

En déroulant la formule, j'ai un vrai ou faux en face de chaque cellule ce qui me convient tout à fait.

J'aimerais créer une fonction personnalisée avec VBA qui fasse la même chose mais en un peu plus court. Je précise, ce qui sera certainement visible rapidement, que mes connaissances en VBA sont extrêmement basiques.
Le code que j'ai écrit est le suivant :
Function VerifieCasse(Cellule, Plage As Range)

    If WorksheetFunction.CountIf(Plage, Cellule) = WorksheetFunction.SumProduct(EXACT(Plage, Cellule) * 1) Then
    VerifieCasse = "Ok"
    Else
    VerifieCasse = "Problème"
    End If

End Function

Seulement ça ne marche pas (erreur #VALEUR!).
J'ai cru comprendre que c'était le EXACT qui posait problème, mais je ne sais pas comment le remplacer ou écrire quelque chose qui aurait un effet similaire.

Si quelqu'un avait une idée, je vous en serais très reconnaissant :-)

1 réponse

pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 643
6 sept. 2018 à 16:50
Bonjour,

J'ignore comment on traduit EXACT mais personnellement je n'aime pas trop utiliser les fonctions Excel en vba, je préfère une expression algorithmique classique d'ou ma proposition avec une petite boucle for :

Function VerifieCasse(Cellule, Plage As Range)
    For Each Celltest In Plage
        If Celltest.Value <> Cellule.Value And UCase(Celltest.Value) = UCase(Cellule.Value) Then
            'Les cellules sont identiques mais la casse est différente
            VerifieCasse = "Problème"
            Exit Function
        End If
    Next Celltest
    VerifieCasse = "Ok"
End Function

1
Pilas31,

Effectivement, votre solution est bien plus élégante et me semble fonctionner correctement.

Un grand merci !
0