Fonction test minuscule en vba [Résolu]

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

20 réponses

Répondre au sujet
jordane45 20570 Messages postés mercredi 22 octobre 2003Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention - Modifié par jordane45 le 19/09/2013 à 10:45
0
Utile
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
Commenter la réponse de jordane45
Blaise56 4 Messages postés jeudi 19 septembre 2013Date d'inscription 19 septembre 2013 Dernière intervention - 19 sept. 2013 à 12:43
0
Utile
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
Commenter la réponse de Blaise56
Blaise56 4 Messages postés jeudi 19 septembre 2013Date d'inscription 19 septembre 2013 Dernière intervention - 19 sept. 2013 à 12:44
0
Utile
1
Merci pour vote aide.
jordane45 20570 Messages postés mercredi 22 octobre 2003Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention - 19 sept. 2013 à 13:11
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
Commenter la réponse de Blaise56
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - Modifié par ucfoutu le 19/09/2013 à 13:13
0
Utile
7
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.
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 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.
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 19 sept. 2013 à 13:35
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).
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 19 sept. 2013 à 13:43
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 ?
jordane45 20570 Messages postés mercredi 22 octobre 2003Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention - 19 sept. 2013 à 13:52
Ce n''est valable que pour les caractères spéciaux et les chiffres (ce qui est normal)
    
  !  "  #  $  %  &  '  (  )  *  +  ,  -  . 
 /  0  1  2  3  4  5  6  7  8  9  
:  ;  <  =  >  ?  @  [    ]  ^  _  '  {  |  } 
 ~    €     '  "  ...  +  #  ^  0/00  <           '  '  "  "  * 
 -  --  ~  (TM)  >        ¡  ¢  £  ¤  ¥  ¦  §  ¨  ©  ª 
 «  ¬  ­  ®  ¯  °  ±  ²  ³  '  µ  ¶  ·  ¸  ¹  º  »  
¼  ½  ¾  ¿  ×  ß  ÷

       

Tu peux tester ça pour t'en assurer :
Sub test()
Debug.Print " CARACTERE  |  MINUSCULE  | MAJUSCULE "
Dim ListCar As String
    For c = 0 To 255
      myChar = Chr(c)
      If myChar = UCase(myChar) Then
            maju = True
    Else
        maju = False
    End If
      If myChar = LCase(myChar) Then
        minu = True
      Else
        minu = False
     End If
     Debug.Print c & " - " & myChar & "  | " & minu & "   |   " & maju
     If minu = maju Then
     ListCar = ListCar & "  " & myChar
     End If
    Next
Debug.Print "-----------------------"
Debug.Print ListCar
End Sub
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 19 sept. 2013 à 13:56
Oui, bien sûr...
allons allons ===>>> voilà (mis plus haut) qui est ultra-simple, clair et sans faille :
Function TestMinus(Str1 As String) As Boolean
 TestMinus = LCase(Str1) = Str1
End Function
Commenter la réponse de ucfoutu
jordane45 20570 Messages postés mercredi 22 octobre 2003Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention - 19 sept. 2013 à 15:54
0
Utile
7
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


ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 20 sept. 2013 à 07:24
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à.
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 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.
jordane45 20570 Messages postés mercredi 22 octobre 2003Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention - 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.
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 20 sept. 2013 à 11:49
Le tour de la question a en effet été fait. LOL
S'il s'agit toutefois de vérifier la saisie de noms et prénoms, je maintiens ce que j'ai dit plus haut (peine perdue, regexp ou pas). On pourra au mieux alerter l'utilisateur, mais il faudra le laisser maître de sa décision.
Moundir76 286 Messages postés dimanche 3 octobre 2010Date d'inscription 16 mai 2014 Dernière intervention - 20 sept. 2013 à 12:53
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

Très bonne remarque soulevée par Ucfoutu ! C'est vrai qu'on à tellement l'habitude qu'on ne pense pas à la différence.
Commenter la réponse de jordane45

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.