Fonction test minuscule en vba

Résolu
Blaise56 Messages postés 4 Date d'inscription jeudi 19 septembre 2013 Statut Membre Dernière intervention 19 septembre 2013 - 19 sept. 2013 à 10:31
Moundir76 Messages postés 281 Date d'inscription dimanche 3 octobre 2010 Statut Membre Dernière intervention 16 mai 2014 - 20 sept. 2013 à 12:53
je cherche une fonction qui indique si un caractère est en minuscule ou en majuscule.
Merci d'avance

5 réponses

jordane45 Messages postés 38136 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 avril 2024 344
Modifié par jordane45 le 19/09/2013 à 10:45
Bonjour ( On commence toujours ainsi !!!)

Vous pouvez essayer ce code :
Sub test()
    Debug.Print testCasse("test de ma string")
    Debug.Print testCasse("AUTRE TEST")
    Debug.Print testCasse("Troisieme TEST")
End Sub
Function testCasse(Str1 As String)
Select Case Str1
    Case UCase(Str1)
         testCasse = "Majuscule"
    Case LCase(Str1)
        testCasse = "Minuscule"
    Case Else
        testCasse = "Autre"
End Select
End Function



Cordialement,
Jordane
0
Blaise56 Messages postés 4 Date d'inscription jeudi 19 septembre 2013 Statut Membre Dernière intervention 19 septembre 2013
19 sept. 2013 à 12:43
Merci pour votre réponse

J'ai modifié votre proposition pour en un booléen

Function TestMinus(Str1 As String) As Boolean

Select Case Str1
Case UCase(Str1)
TestMinus = False
Case LCase(Str1)
TestMinus = True
Case Else
TestMinus = False
End Select
End Function

et bonjour tout de même
0
Blaise56 Messages postés 4 Date d'inscription jeudi 19 septembre 2013 Statut Membre Dernière intervention 19 septembre 2013
19 sept. 2013 à 12:44
Merci pour vote aide.
0
jordane45 Messages postés 38136 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 avril 2024 344
Modifié par jordane45 le 19/09/2013 à 13:12
De rien ;-)

Par contre, si ce n'est que pour tester les minuscules, vous pouvez vous passer d'un select case;; un simple IF suffit.

Function TestMinus(Str1 As String) As Boolean
   If Str1 = LCase(Str1) Then TestMinus = True
End Function


Si la réponse vous convient, merci de passer cette question en RESOLU.

NB: Pour vos prochaines questions, pensez à utiliser la coloration syntaxique pour poster votre code
ceci est du code
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 19/09/2013 à 13:13
Bonjour,
j' "adore" les approximations du genre...
Ta fonction testminus, telle qu'écrite et dans l'ordre écrit, Blaise56, va te réserver une surprise de taille.
Fais donc des tests de "grattage" ===>>> tu vas trouver la raison de ma remarque, hein ...

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 sept. 2013 à 13:18
La voilà, ta fonction, cette fois-ci sans faille :
Function TestMinus(Str1 As String) As Boolean
 TestMinus = LCase(Str1) = Str1
End Function
0
jordane45 Messages postés 38136 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 avril 2024 344
19 sept. 2013 à 13:21
Salut Ucfoutu,
je ne comprend pas ta remarque concernant son code..
Sub test()
    Debug.Print TestMinus("test de ma string")
    Debug.Print TestMinus("AUTRE TEST")
    Debug.Print TestMinus("Troisieme TEST")
    Debug.Print TestMinus("1234")
    Debug.Print TestMinus("1234 FF")
    
End Sub

Function TestMinus(Str1 As String) As Boolean
Select Case Str1
 Case UCase(Str1)
     TestMinus = False
 Case LCase(Str1)
    TestMinus = True
 Case Else
    TestMinus = False
End Select
End Function

Donne :
Vrai
Faux
Faux
Faux
Faux
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 sept. 2013 à 13:28
Bonjour, jordame45,
tu n'as pas suffisamment "gratté".
Il se trouve, par exemple, que tous les caractères alphanumériques ont leur majuscule égale à leur minuscule.
Le code de Blaise56 ne peut donc être "bon" qu'en mettant :
Case LCase(Str1)
en tout premier choix dans le select case.
Essaye donc et tu vas comprendre ma remarque.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 19/09/2013 à 13:44
Et quand je parle des caractères alphanumériques, ils ne sont pas une liste exhaustive.
Ajouter à cette liste tous les caractères dont la majuscule et la minuscule sont identiques (ponctuations, espaces, etc ...)
J'insiste donc qant à la nécessité de modifier l'ordre de ces "case"
(le développement est toujours plein de surprises auxquelles il faut penser).
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 19/09/2013 à 13:44
Tiens... je vais te convaincre :
essaye avec
Debug.Print TestMinus("troisieme test")
et tu auras un "splendide" FAUX si tu ne bouleverses pas l'ordre des case.
Vu ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jordane45 Messages postés 38136 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 avril 2024 344
19 sept. 2013 à 15:54
allons.. une dernière pour être tranquil..

Function Regex_Minuscules(MaString As String) As Boolean
'--------------------------------------------------------
' Nécessite de cocher
' "Microsoft VBScript Regular Expressions 5.5"
' dans "OutilsRéférences".
'--------------------------------------------------------
    Dim RegEx As RegExp
    Set RegEx = New RegExp
    Dim matches As IMatchCollection2
    Dim match As Variant
    With RegEx
        .IgnoreCase = False
        .Global = True
        .Pattern = "[A-Z]"
    Set matches = .Execute(MaString)
    End With
    If matches.Count > 0 Then
        Regex_Minuscules = False
     Else
        Regex_Minuscules = True
     End If
End Function


Au moins comme ça on ne prend en compte QUE les LETTRES MAJUSCULES sans s'occuper de savoir si ce sont des chiffres ou des caractères spéciaux..

Donc si ma string ou mon caractère ne contient pas les lettres (en majuscule) entre A et Z .. alors c'est du minuscule...


NB: Vu qu'il faut ajouter une référence dans le VBE, voici un code qui vérifie si cette référence est active justement..et au cas où.. l'active
Sub Verif_Reference_Active()
    Debug.Print ReferenceActive("VBScript_RegExp_55")
    If ReferenceActive("VBScript_RegExp_55") = False Then
        'si pas active..on l'ajoute
        Application.VBE.ActiveVBProject.References.AddFromFile ("vbscript.dll3")
        Debug.Print "Activation.."
    End If
End Sub

Function ReferenceActive(Nom As String) As Boolean
' Avoir coché :Accès approuvé au modèle d'objet du projet VBA
' Dans la sécurité des macros
'--------------------------------------------------------------
  Dim i As Integer
    Dim NbreRef As Integer
           NbreRef = Application.VBE.ActiveVBProject.References.Count
       For i = 1 To NbreRef
        If Application.VBE.ActiveVBProject.References(i).Name = Nom Then
            ReferenceActive = True
            Exit Function
        End If
    Next i
End Function


0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 19/09/2013 à 18:52
Non, Jordane.
la majuscule de ù, par exemple, est Ù et non U
essaie donc : msgbox Ucase("ù")
Ne pas chercher midi à 14 heures

Et ne me dis pas que l'accent est oté en majuscules ou je t'envoies mon acte de naissance, hein. Je m'appelle MARQUÈS et non MARQUES
0
Blaise56 Messages postés 4 Date d'inscription jeudi 19 septembre 2013 Statut Membre Dernière intervention 19 septembre 2013
19 sept. 2013 à 18:49
Bonsoir,
Merci pour toutes vos réponses.
J'ai testé la première version avec des noms et des prénoms à différencier et donnés dans un ordre assez aléatoire.
Elle m'a donné toute satisfaction sur 200 occurrences.
Je vais essayer la version simplifiée.
Merci encore
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 20/09/2013 à 07:58
Ouais...
Je crois qu'une fois de plus, la sémantique a ici toute sa place.
Bien comprendre la différence importante entre ce qu'est une lettre majuscule et ce qu'est une lettre en capitale sera le début du chemin de la sagesse. Ce n'est pas parce-que les majuscules sont écrites en lettres capitales que les capitales sont des majuscules.
Une majuscule ne peut que concerner un caractère alphabétique, alors que la représentation en lettres capitales concerne la totalité des caractères (alphabétiques, alphanumériques, de ponctuation, spéciaux, etc ...)
On devine assez bien que Blaise56 ne voulait pas parler de majuscules, mais de lettres capitales. On le voit d'autant mieux que la fonction qu'il cherche à écrire ne concerne que la casse (et non le caractère majuscule de la lettre). Il suffit dès lors de vérifier (ce que je montre) que la transposition en casse basse du texte à contrôler aboutit à une représentation typographique rigoureusement identique à celle du texte originel. Et nous n'avons même pas à comparer avec des lettres capitales -et pourquoi donc une telle comparaison bien inutile puisque ce que l'on veut vérifier, c'est que c'est écrit en basse casse (et rien d'autre) ?.
Pour ceux qui auraient encore des difficultés à me suivre : Dans le prénom PIERRE (ainsi écrit) : seul le P est une majuscule, les autres lettres n'étant que des lettres écrites en casse haute.
Dans Pierre : P est une majuscule, représentée par une capitale, le reste étant écrit en casse basse
Dans pierre : ni majuscule, ni capitale
Notons au passage que certaines polices de caractères utilisent pour les caractères en basse casse une représentation typographique identique à celle des caractères écrits en casse haute. Ce qui n'enlève rien au fait que même ces polices distinguent casse basse et casse haute (il suffit de modifier la police pour se rendre compte de ce que cette distinction est bel et bien faite).
je vous laisse maintenant là.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
20 sept. 2013 à 09:44
Juste une dernière remarque :
s'il s'agit d'appliquer des règles à des noms et prénoms, c'est une toute autre paire de manches et c'est beaucoup plus complexe que cela peut le paraître.
Il vaudra bien mieux laisser l'utilisateur responsable de sa frappe car existent de trop nombreux pièges (divers et très variés) qui font que l'on ne peut "automatiser" un contrôle de l'espèce.
On ne pourra alors valablement qu'éviter la saisie de ce qui serait manifestement (et sans le moindre doute) incohérent. Ce qui était déjà assez complexe avec les noms français est devenu encore plus ardu avec l'apparition de noms étrangers dans les familles.
0
jordane45 Messages postés 38136 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 avril 2024 344
20 sept. 2013 à 11:16
Bon, pour être sur de bien prendre en compte TOUTES les lettres de TYPE MAJUSCULES (Accentuées ou non)..
Voici le regex modifié...
  .Pattern = "[A-ZÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝ]"


L'avantage des expressions régulières.. c'est qu'elles sont adaptables à nos besoins...

Et donc la fonction entière:
Function Regex_Minuscules(MaString As String) As Boolean
'--------------------------------------------------------
' Nécessite de cocher
' "Microsoft VBScript Regular Expressions 5.5"
' dans "OutilsRéférences".
'--------------------------------------------------------
    Dim RegEx As RegExp
    Set RegEx = New RegExp
    Dim matches As IMatchCollection2
    Dim match As Variant
    With RegEx
        .IgnoreCase = False
        .Global = True
        .Pattern = "[A-ZÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝ]"
    Set matches = .Execute(MaString)
    End With
    If matches.Count > 0 Then
        Regex_Minuscules = False
     Else
        Regex_Minuscules = True
     End If
End Function



Pour ce qui est de la nuance Majuscules / Capitales, il y a un bon articleà cet endroit là :
http://fr.wikipedia.org/wiki/Capitale_et_majuscule

Si maintenant Blaise nous avais demandé comment vérifier si la première lettre est bien en majuscule, on aurait pu simplement lui proposer de vérifier avec une formule : NomPropre ou en VBA avec:
Application.Proper(montexte)


voilou.. je pense que cette fois on a fait le tour de la question.
0
Rejoignez-nous