IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Sélection de caractère dans une cellule


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    314
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2002
    Messages : 314
    Par défaut Sélection de caractère dans une cellule
    Bonjour,
    J'aimerais, dans la cellule active que seul les caractères "0123456789+" soit autorisé.

    Je fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim cp As Variant
     
     cp = InStr(dix, "0123456789+")
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim cp As Variant
     
     cp = InStr(1,dix, "0123456789+")
    Ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim cp As Variant
     
     cp = InStr(1, dix, "0123456789+",1)
    Cela me retourne invariablement 0 (même si Dix est égal à un caractère de la chaine)
    J'ai aussi tester avec cp en integer

    Merci
    FikoU

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 186
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Personnellement je passerais par la validation de données dont c'est le rôle de restreindre l'encodage suivant critères.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    314
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2002
    Messages : 314
    Par défaut
    Merci pour cette réponse,
    Je débute en VBA je ne connais pas la validation de données.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    314
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2002
    Messages : 314
    Par défaut
    Validation de données = liste déroulantes ?
    Si oui ce la ne va pas dans mon cas, la saisie doit être "rapide" environ 300 cellules à renseigner par lot de 5 cellules...
    FikoU

  5. #5
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 186
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    La Validation de données est une fonctionnalité native d'excel ce n'est pas du VBA.
    Pour activer sa boîte de dialogue, il suffit de cliquer sur la commande Validation de données du groupe Outils de données de l'onglet [Données]
    Validation de données = liste déroulantes ?
    La validation de données ne se limite pas aux liste déroulante

    Après avoir sélectionné les cellules concernées, il vous suffira de restreindre l'encodage à des nombres entiers au-dessus de la valeur -1.

    Vous pouvez également définir une restriction personnalisée mais il me semble que dans votre cas, ce n'est pas nécessaire.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    314
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2002
    Messages : 314
    Par défaut
    J'ai réussi je ne peux entrer que des chiffres entre 0 et 9
    J'aurais voulu aussi insérer le +.
    Si on tape + il est affiché 10 (en écrivant ce message je me demande si c'est bien utile)
    Merci
    FikoU

  7. #7
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 260
    Par défaut
    Hello,
    voir ici pour employer une fonction personnalisée utilisant les expressions régulières et utiliser cette fonction dans la validation des données. Il y a un classeur exemple à télécharger.
    Nom : Fikou1.png
Affichages : 375
Taille : 28,5 Ko
    Nom : Fikou2.png
Affichages : 372
Taille : 16,6 Ko
    Nom : Fikou3.gif
Affichages : 368
Taille : 189,4 Ko

    Ami calmant, J.P

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    314
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2002
    Messages : 314
    Par défaut
    Bonjour,
    Merci pour vos réponses.

    J'ai pas tout compris surtout que je ne parle pas anglais, mais suite à un empêchement, je n'ai pu y consacrer beaucoup de temps.
    Si je définis en A1 une formule, je peux l'appliquer à des plages de cellules.
    Bon dimanche
    FikoU

  9. #9
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 186
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Peut-être n'ai-je rien compris à votre demande mais la simple application d'une validation de données en limitant l'encodage au chiffre de 0 à 9 ainsi que le + ,placé devant, suffit largement

    Illustration d'une Validation de données en autorisant les "Nombre entier" dont la valeur est supérieure à -1 appliqué aux colonnes Qté et Prix

    Nom : 2305007 dvp DataValidation.png
Affichages : 360
Taille : 33,8 Ko
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  10. #10
    Rédacteur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2013
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Août 2013
    Messages : 1 041
    Par défaut
    Bonjour,
    J’ai trouvé la solution apportée par jurassic-pork très intéressante car elle permet d'outrepasser les contrôles offerts par Excel dans la validation des données.
    Contrôles relativement limités car par exemple il n’est possible que de contrôler la saisie des entiers : ce qui exclut le contrôle sur les nombres décimaux comme 12,1. Sans parler de la saisie d’une adresse courriel où le contrôle de la validation est impossible.

    Je le sais bien, il suffit de mettre une procédure événementielle à chaque changement de sélection pour contrôler une saisie, ou de passer par un formulaire, ou autre artifice…

    Sachant que l’intérêt de contrôler une saisie est de s’assurer de la cohérence des données : par exemple certains utilisateurs vont saisir un accent dans un nom de famille, d’autres pas, d’où un problème lorsqu’il faut regrouper les données, ou faire des « RechercheV ».

    C’est pourquoi j’ai souhaité approfondir le sujet car l’utilisation des expressions régulières permet de répondre à tous ces besoins, en me demandant s’il était possible d’aller plus loin, c’est-à-dire en contrôlant la saisie (prénom n’acceptant que des lettres entre « A » et « Z » et les espaces, mais sans accent, guillemet et autres caractères spéciaux, idem pour le nom de famille) mais aussi en forçant automatiquement le format de la restitution : en mettant le prénom avec la première lettre en majuscule et les autres en minuscule, et le nom de famille en majuscule, que la saisie soit faite par l’utilisateur en majuscule ou minuscule.

    Le but étant de gagner en efficacité et en temps de développement : inutile ici de gérer des cas particuliers (par un développement personnalisé) puisque tout est pris en compte par la fonction.


    J’ai un peu galéré mais j’ai trouvé une astuce…

    Première étape :
    Création d’une fonction nommée arbitrairement : « Public Function EstValide() As Variant »
    Que nous détaillerons plus loin.
    J'ai aussi repris la fonction RegExpMatch du message précédent.

    Deuxième étape :
    Dans le gestionnaire de noms, créer un nom nommé arbitrairement : « Controle_Validation »
    Qui fait référence à : « =EstValide() »

    Nous pouvons maintenant paramétrer les conditions de validations des cellules (menu « Données » / « Validation des données »).
    Nous y indiquerons à la fois le format de saisi admis et le format de restitution désiré.

    Dans la cellule où est saisi le nom de famille :
    - Onglet « Options »
    o Autoriser : « Personnalisé »
    o Case « Ignorer si vide » : non cochée
    o Formule : « =Controle_Validation »
    - Onglet « Message de saisie »
    o Titre : « > »
    o Message de saisie : « ^[A-Za-z ]{1,}$ »
    Puis décochez la case « Quand la cellule est sélectionnée ».
    - Onglet « Alerte d’erreur » : libre à vous de mettre ce que vous souhaitez.

    Dans la cellule où est saisi le prénom : Idem mais en titre mettre « >> » au lieu de « > »

    La fonction « Public Function EstValide() As Variant » est appelée chaque fois qu’une saisie est réalisée. Elle va prendre comme référence les informations enregistrées dans le « message du titre » pour le modèle de saisie admis et le « titre » comme modèle de format à appliquer.

    J’ai un peu triché en appliquant des modèles personnels…
    Si le modèle est :
    - « IsNumeric » alors j’applique la fonction du VBA « IsNumeric » ;
    - « Mail » alors j’applique le modèle « ^[\w\.\-]+@[A-Za-z0-9]+[A-Za-z0-9\.\-]*[A-Za-z0-9]+\.[A-Za-z]{2,24}$ » ;
    - « Password » alors j’applique le modèle « ^(?=.*[A-Za-z])(?=.*\d)(?=.*[@$!%*#?&_-])[A-Za-z\d@$!%*#?&_-]{8,}$ » ;
    - « Name= » alors j’applique le modèle de la cellule du nom indiqué à la suite de « Name= ». Ce qui permet de faire référence à une cellule qui contient le modèle et une plus grande souplesse dans la maintenance.
    Dans les autres cas j’applique le modèle indiqué.
    Vous pouvez compléter par d'autres modèles de votre choix...

    Idem pour le format où j’ai triché sur le format « >> » qui met la première lettre en majuscule en utilisant la fonction « Application.Proper ».
    Là aussi vous pouvez compléter par d'autres formats personnalisés...


    Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    ' https://www.ablebits.com/office-addins-blog/excel-data-validation-regex/
    ' https://www.ablebits.com/office-addins-blog/regex-match-excel/#regexpmatch-function
    ' https://learn.microsoft.com/fr-fr/dotnet/standard/base-types/regular-expression-language-quick-reference
    ' https://www.developpez.net/forums/newreply.php?do=postreply&t=2150525
     
    Option Explicit
     
    '---------------------------------------------------------------------------------------
    Public Function EstValide() As Variant
    '---------------------------------------------------------------------------------------
    ' Vérifie la validation d'une saisie dans une cellule en utilisant la technique
    ' des expressions régulières. Pour cela on va utiliser la "Validation des données" classique
    ' mais en utisant une formule qui fait référence à un nom qui fait lui même référence à une
    ' fonction. Le modèle de l'expression régulière sera enregistré dans le message de saisie.
    ' En plus il est possible d'indiquer un format à appliquer à la saisie. Dans ce cas il
    ' faut l'enregistrer dans le titre du message de saisie (sans les guillemets).
    '---------------------------------------------------------------------------------------
    ' Exemple:
    ' Dans le gestionnaire des noms créez "Controle_Validation" qui fait référence à "=EstValide()"
    ' Et dans la validation (Données/validation des données):
    ' - la case "Ignorer si vide" doit être décochée,
    ' - la formule personnalisée doit contenir "=Controle_Validation",
    ' - le message de saisie doit contenir le modèle de l'expression régulière,
    ' - puis décochez "Quand la cellule est sélectionnée".
    '---------------------------------------------------------------------------------------
    ' Remarques:
    ' J'ai prévu des "modèles" personnalisés, pour savoir si la valeur est numérique il faut
    ' enregistrer le modèle "IsNumeric".
    ' Pour la saisie d'un mail enregistrez "Mail".
    ' Pour la saisie d'un mot de passe enregistrez "Password". (8 caractères minimum dont une
    ' lettre, un chiffre, un caractère spécial.
    ' Vous pouvez compléter par d'autres modèles...
    ' Pour faire référence à une cellule nommée: enregistrez "Name=" suivi du nom de la cellule.
    ' Concernant le format, voir la documentation de MicroSoft :
    ' https://learn.microsoft.com/fr-fr/office/vba/language/reference/user-interface-help/format-function-visual-basic-for-applications
    ' J'ai ajouté un format personnel: ">>" qui met la première lettre en majuscule (Proper).
    '---------------------------------------------------------------------------------------
    Dim Modèle As String
    Dim MonFormat As String
     
    ' Récupère le modèle de l'expression régulière enregistré dans le message de saisie
    ' de "Données/validation des données/message de saisie" de la cellule:
    Modèle = ActiveCell.Validation.InputMessage
    ' Récupère le format à appliquer à la saisie enregistré dans le titre
    ' de "Données/validation des données/message de saisie" de la cellule:
    MonFormat = ActiveCell.Validation.InputTitle
     
    ' S'il faut faire référence à une cellule:
    If Left(Modèle, 5) = "Name=" Then
        Modèle = Replace(Modèle, "Name=", "")
        Modèle = Range(Modèle).Value
    End If
     
    ' Suivant le modèle indiqué:
    Select Case Modèle
        Case "": EstValide = True
        Case "IsNumeric": EstValide = IsNumeric(ActiveCell.Value)
        Case "Mail": EstValide = RegExpMatch(ActiveCell, "^[\w\.\-]+@[A-Za-z0-9]+[A-Za-z0-9\.\-]*[A-Za-z0-9]+\.[A-Za-z]{2,24}$")
        Case "Password": EstValide = RegExpMatch(ActiveCell, "^(?=.*[A-Za-z])(?=.*\d)(?=.*[@$!%*#?&_-])[A-Za-z\d@$!%*#?&_-]{8,}$")
        Case Else: EstValide = RegExpMatch(ActiveCell, Modèle)
    End Select
     
    ' Gestion du format:
    If MonFormat <> "" Then
        DoEvents
        Dim M
        M = ActiveCell.Value
        ActiveCell.Value = EstValide
        If ActiveCell.Value = True Then
            Select Case MonFormat
                Case ">>":  M = Application.Proper(M)
                Case Else: M = Format(M, MonFormat)
            End Select
        End If
        ActiveCell.Value = M
    End If
     
    End Function
     
    '---------------------------------------------------------------------------------------
    Private Function RegExpMatch(Input_Range As Range, Pattern As String, Optional Match_Case As Boolean = True) As Variant
    '---------------------------------------------------------------------------------------
    Dim arRes() As Variant 'array to store the results
    Dim iInputCurRow, iInputCurCol, cntInputRows, cntInputCols As Long 'index of the current row in the source range, index of the current column in the source range, count of rows, count of columns
    Dim RegEx
     
    On Error GoTo ErrHandl
    RegExpMatch = arRes
     
    Set RegEx = CreateObject("VBScript.RegExp")
    RegEx.Pattern = Pattern
    RegEx.Global = True
    RegEx.MultiLine = True
    If True = Match_Case Then
        RegEx.ignorecase = False
    Else
        RegEx.ignorecase = True
    End If
     
    cntInputRows = Input_Range.Rows.Count
    cntInputCols = Input_Range.Columns.Count
    ReDim arRes(1 To cntInputRows, 1 To cntInputCols)
     
    For iInputCurRow = 1 To cntInputRows
        For iInputCurCol = 1 To cntInputCols
            arRes(iInputCurRow, iInputCurCol) = RegEx.test(Input_Range.Cells(iInputCurRow, iInputCurCol).Value)
        Next
    Next
     
    RegExpMatch = arRes
     
    Exit Function
    ErrHandl:
        RegExpMatch = CVErr(xlErrValue)
    End Function
    '---------------------------------------------------------------------------------------
    '---------------------------------------------------------------------------------------


    Notes techniques :
    - Je n’ai pas trouvé comment récupérer le résultat de la validation, donc l’usage curieux de « ActiveCell.Value » comme passage temporaire du résultat, puis sa modification…
    - ca marche sur ma version d’Excel, pas testé sur d’autres.


    Le fichier pour vos tests : Classeur1.xlsm



    En attendant vos remarques sur cette façon de faire.
    Bonne programmation.

  11. #11
    Rédacteur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2013
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Août 2013
    Messages : 1 041
    Par défaut
    Bonjour,
    J'ai complété la fonction EstValide() pour prendre en compte un montant minimal et maximal pour la saisie d'un nombre décimal:
    Le modèle est "IsNumeric: ValeurMini ; ValeurMaxi". Exemple: IsNumeric: -99,99 ; 99,99

    Et la possibilité de l'arrondir à la précision désirée en indiquant dans le titre un nombre entre 0 et 15.
    J'ai aussi ajouté la possibilité d'utiliser l'opérateur LIKE. Enregistrez "Like=" suivi de la règle.
    LIKE est beaucoup moins puissant que les expressions régulières mais plus simple à comprendre et peut être utilisé sur des règles simples de longueur fixe.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    =VBA' https://www.ablebits.com/office-addins-blog/excel-data-validation-regex/
    ' https://www.ablebits.com/office-addins-blog/regex-match-excel/#regexpmatch-function
    ' https://learn.microsoft.com/fr-fr/dotnet/standard/base-types/regular-expression-language-quick-reference
     
    Option Explicit
     
    '---------------------------------------------------------------------------------------
    Public Function EstValide() As Variant
    '---------------------------------------------------------------------------------------
    ' Vérifie la validation d'une saisie dans une cellule en utilisant la technique
    ' des expressions régulières. Pour cela on va utiliser la "Validation des données" classique
    ' mais en utisant une formule qui fait référence à un nom qui fait lui même référence à une
    ' fonction. Le Modèle de l'expression régulière sera enregistré dans le message de saisie.
    ' En plus il est possible d'indiquer un format à appliquer à la saisie. Dans ce cas il
    ' faut l'enregistrer dans le titre du message de saisie (sans les guillemets).
    '---------------------------------------------------------------------------------------
    ' Exemple:
    ' Dans le gestionnaire des noms créez "Controle_Validation" qui fait référence à "=EstValide()"
    ' Et dans la validation (Données/validation des données):
    ' - la case "Ignorer si vide" doit être décochée,
    ' - la formule personnalisée doit contenir "=Controle_Validation",
    ' - le titre peut contenir le format de restitution (pour les chaînes),
    ' - le message de saisie doit contenir le Modèle (de l'expression régulière ou personnalisé),
    ' - puis décochez "Quand la cellule est sélectionnée".
    '---------------------------------------------------------------------------------------
    ' Remarques:
    ' J'ai prévu des modèles personnalisés: pour limité la saisie à une valeur numérique il faut
    ' enregistrer le modèle "IsNumeric". Pour préciser une valeur Minimale et Maximale alors
    ' enregistrez le modèle "IsNumeric: ValeurMini ; ValeurMaxi". Exemple: "IsNumeric: -99.99 ; 99.99"
    ' Pour la saisie d'un mail enregistrez "Mail".
    ' Pour la saisie d'un mot de passe enregistrez "Password". (règle = 8 caractères minimum dont une
    ' lettre, un chiffre, un caractère spécial.
    ' Pour faire référence à une cellule nommée: enregistrez "Name=" suivi du nom de la cellule.
    ' Pour utiliser l'opérateur LIKE: enregistrez "Like=" suivi de la règle.
    ' LIKE est beaucoup moins puissant que les expressions régulières mais plus simple à comprendre
    ' et peut être utilisé sur des règles simples de longueur fixe.
    ' Vous pouvez compléter par d'autres modèles...
    ' Quatre formats sont disponibles (vous pouvez en inventer d'autres):
    ' ">>" : met la première lettre en majuscule (Proper) et le reste en minuscule.
    ' ">"  : met tout en majuscule
    ' "<"  : met tout en mininuscule.
    ' "n"  : où n est entre 0 et 15 pour arrondi au nombre de décimales si le modèle est "IsNumeric"
    '---------------------------------------------------------------------------------------
    Dim Modele As String
    Dim MonFormat As String
     
    ' Par défaut la fonction renvoie FAUX:
    EstValide = False
     
    ' Récupère le modèle de l'expression régulière enregistré dans le message de saisie
    ' de "Données/validation des données/message de saisie" de la cellule:
    Modele = ActiveCell.Validation.InputMessage
    ' Récupère le format à appliquer à la saisie enregistré dans le titre
    ' de "Données/validation des données/message de saisie" de la cellule:
    MonFormat = ActiveCell.Validation.InputTitle
     
    ' S'il faut faire référence à une cellule:
    If Left(UCase(Modele), 5) = "NAME=" Then
        Modele = Replace(Modele, "Name=", "", , , vbTextCompare)
        Modele = Range(Modele).Value
    End If
     
    ' Suivant le modèle indiqué:
    Select Case True
        Case Modele = "": EstValide = True
        Case Left(UCase(Modele), 9) = "ISNUMERIC"
            Dim v
            Modele = Replace(Modele, ".", ",")
            Modele = Replace(Modele, " ", "")
            Modele = Replace(Modele, ":", ";")
            v = Split(Modele, ";")
            If IsNumeric(ActiveCell.Value) = True Then
                If MonFormat <> "" Then ActiveCell.Value = Round(ActiveCell.Value, val(MonFormat))
                If UBound(v) = 0 Then
                    EstValide = True
                Else
                    If ActiveCell.Value >= CDec(v(1)) And ActiveCell.Value <= CDec(v(2)) Then EstValide = True
                End If
            End If
        Case UCase(Modele) = "MAIL": EstValide = RegExpMatch(ActiveCell, "^[\w\.\-]+@[A-Za-z0-9]+[A-Za-z0-9\.\-]*[A-Za-z0-9]+\.[A-Za-z]{2,24}$")
        Case UCase(Modele) = "PASSWORD": EstValide = RegExpMatch(ActiveCell, "^(?=.*[A-Za-z])(?=.*\d)(?=.*[@$!%*#?&_-])[A-Za-z\d@$!%*#?&_-]{8,}$")
        Case Left(UCase(Modele), 5) = "LIKE=": EstValide = ActiveCell.Value Like Mid(Modele, 6)
        Case Else: EstValide = RegExpMatch(ActiveCell, Modele)
    End Select
     
    ' Gestion du format (pour les chaînes):
    If MonFormat <> "" Then
        DoEvents
        Dim M
        M = ActiveCell.Value
        ActiveCell.Value = EstValide
        If ActiveCell.Value = True Then
            Select Case MonFormat
                Case ">>":  M = Application.Proper(M)
                Case ">": M = UCase(M)
                Case "<": M = LCase(M)
            End Select
        End If
        ActiveCell.Value = M
    End If
     
    End Function
     
    '---------------------------------------------------------------------------------------
    Private Function RegExpMatch(Input_Range As Range, Pattern As String, Optional Match_Case As Boolean = True) As Variant
    '---------------------------------------------------------------------------------------
    Dim RegEx
     
    On Error GoTo ErrHandl
    RegExpMatch = False
     
    Set RegEx = CreateObject("VBScript.RegExp")
    RegEx.Pattern = Pattern
    RegEx.Global = True
    RegEx.MultiLine = True
    RegEx.Ignorecase = Not Match_Case
     
    RegExpMatch = RegEx.test(Input_Range.Value)
     
    Exit Function
    ErrHandl:
        RegExpMatch = CVErr(xlErrValue)
    End Function
    '---------------------------------------------------------------------------------------
    '---------------------------------------------------------------------------------------

Discussions similaires

  1. Recherche de caractères dans une cellule
    Par sebeni dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 23/05/2007, 08h49
  2. Réponses: 1
    Dernier message: 06/05/2007, 18h42
  3. Chaîne de caractères dans une cellule de matrice
    Par jmbonnaz dans le forum MATLAB
    Réponses: 4
    Dernier message: 04/05/2007, 15h53
  4. limite Caractère dans une cellule Excel 2000
    Par Vetchostar dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 07/03/2007, 15h36
  5. Réponses: 1
    Dernier message: 06/12/2006, 10h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo