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

VBA Access Discussion :

Expression régulière - recherche valeurs proches [AC-2016]


Sujet :

VBA Access

  1. #1
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mai 2021
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Mai 2021
    Messages : 9
    Points : 3
    Points
    3
    Par défaut Expression régulière - recherche valeurs proches
    Bonjour,

    Je suis débutant en VBA et Access, je m'y connais un peu en expression régulières, mais plutôt en python ^^

    Je cherche à faire quelque chose d'a priori assez simple :

    J'ai un formulaire d'ajout dont les valeurs seront saisies à la main (approximative donc),
    J'ai déjà traité le fait d'empêcher de saisir des doublons, mais pas les "quasi doublons".

    Par quasi-doublon, j'entends de saisir la même chaîne de caractère, mais avec un espace en plus, un caractère spécial qui diffère ou en majuscule au lieu de minuscule.

    Exemple : M381526-022 ≠ M381526_022 ≠ m381526-022 ≠ M381526 022
    Je vous ai mit la fonction que je compte utiliser pour mon test
    J'utilise une requête d'ajout en sortie de mon formulaire.

    Le problème, c'est que je ne sais pas où ni comment écrire mon VBA pour éviter ces quasi-doublons...
    Il faut que j'aille rechercher dans ma table cible toutes les valeurs d'un champ et les tester pour savoir si mon expression régulière match, ou pas.

    Je vous remercie par avance pour vos conseils,
    Simon

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Function AntiDoublon(strVal As String) As Boolean
     
    Dim reg As New VBScript_RegExp_55.RegExp
     
    reg.Pattern = "^[a-zA-Z][0-9]{6}.[0-9]{3}$"
    AntiDoublon = reg.Test(strVal)
     
    Set reg = Nothing
     
    End Function

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Pour les Regx, désolé mais j'y fait une alergie :-).

    Et attention Access n'est pas case sensitive comme Python donc pour Access "M"="m" est vrai.

    Ensuite la méthode la plus facile que je vois est de supprimer les caractères indésirables et ensuite de comparer le résultat et tu peux aussi forcer la case si cela est nécessaire mais rappel : Access s'en moque pour ses comparaisons.

    Ici un exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public function EpurerDonnnees(prmValeur as variant) as string
        dim result as string
        result = ucase(prmValeur) 'Met en majuscules
     
        'Élimine les caractères indésiribales
        result=replace(result,"_","")
        result=replace(result,"-","")
        result=replace(result," ","")
     
        EpurerDonnnees=result
    end function
    Après cela s'utilise comme une des fonctions interne d'Access.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  3. #3
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mai 2021
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Mai 2021
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par marot_r Voir le message
    Bonjour.

    Pour les Regx, désolé mais j'y fait une alergie :-).
    Tu m'étonnes xD

    Citation Envoyé par marot_r Voir le message
    Et attention Access n'est pas case sensitive comme Python donc pour Access "M"="m" est vrai.
    Ok ! C'est bon à savoir

    Citation Envoyé par marot_r Voir le message
    Ensuite la méthode la plus facile que je vois est de supprimer les caractères indésirables et ensuite de comparer le résultat et tu peux aussi forcer la case si cela est nécessaire mais rappel : Access s'en moque pour ses comparaisons.

    Ici un exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public function EpurerDonnnees(prmValeur as variant) as string
        dim result as string
        result = ucase(prmValeur) 'Met en majuscules
     
        'Élimine les caractères indésiribales
        result=replace(result,"_","")
        result=replace(result,"-","")
        result=replace(result," ","")
     
        EpurerDonnnees=result
    end function
    Après cela s'utilise comme une des fonctions interne d'Access.

    A+
    Je trouve ta solution intéressante, merci !
    Toutefois elle à le défaut de devoir être exhaustive sur tous les caractères à remplacer et sans pouvoir discriminer leur position dans la chaîne, deux points qui m'embête un peu...

    Y aurait-il une proposition qui comprend une expression régulière ?

  4. #4
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    2 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 878
    Points : 4 754
    Points
    4 754
    Par défaut
    Voici un tuto de Cafeine sur les REGEX en VBA. Peut-être pourra -t'il t'aider
    https://cafeine.developpez.com/access/tutoriel/regexp/
    "Always look at the bright side of life." Monty Python.

  5. #5
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour

    Toutefois elle à le défaut de devoir être exhaustive sur tous les caractères à remplacer et sans pouvoir discriminer leur position dans la chaîne, deux points qui m'embête un peu...
    Oui mais si tu n'as que des lettres et des chiffres tu peux faire un filtre sur le code Ascii et dans ce cas là passer en majuscules, c'est plus simple de ne tester qu'un seule code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    dim result as string
    dim c as string
     
    for i=0 to len(prmValeur)
       c=mid(prmValeur, i, 1)
       if asc(ucase(c)) < asc("A") or asc(ucase(c)) > asc("A") then
          c=""
       end if
       result=result & c
    next i
    Et si tu sais à quelle position et que cette position est fixe et tes données ont toujours la même longueur tu peux aussi par exemple pour "M381526 022" faire left([TonChamp],7) & mid([TonChamp],9) qui va couper le 8 ième caractères.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  6. #6
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mai 2021
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Mai 2021
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Merci marot_r pour ton complément !
    Avec ça, je pense que l'on a fait le tour de la question

    J'ai une version fonctionnelle de ce que je voulais faire, du coup je vous la poste ici :

    Sur clic du bouton "InsererVBA"
    Je contrôle le champ "Champ_collaborateur" dans mon formulaire "T_SO_I_collaborateur" et le sous-formulaire "T_SO_col_SF_Ajouter_Collaborateur"
    J'ajoute à la table "T_T_collaborateur", dans le champ "Collaborateur"
    J'ai des checks box "Coche_Operateur" et "Coche_SO" dont au moins une doit-être cochée
    J'utilise une requête d'ajout "T_R_Ajouter_Collaborateur"

    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
    Private Sub InsererVBA_Click()
     
        Dim N_collaborateur As String
        Dim Var As String
        Dim tT1 As Variant
        Dim tT2 As Variant
     
    'Restriction de saisie par l'utilisateur'
        N_collaborateur = StrConv(Me.Champ_collaborateur.Value, vbProperCase)
     
        If Me.Champ_collaborateur.Value = "" Or (Me.[Coche_Operateur] = 0 And Me.[Coche_SO] = 0) Then
     
            MsgBox ("Le nom d'utilisateur et au moins un privilège doivent être renseignés")
        Else
     
            If rControl(N_collaborateur, "[^a-z0-9-]") Then
                MsgBox ("Seuls les caractères alphanumériques et '-' sont autorisés")
            Else
     
        'Control d'absence de doublon'
                Me.Champ_collaborateur.Value = N_collaborateur
                If IsNull(DLookup("[Collaborateur]", "T_T_collaborateur", "[Collaborateur] = [Forms]![T_SO_I_collaborateur].[Form]![T_SO_col_SF_Ajouter_Collaborateur]![Champ_collaborateur]")) Then
                    DoCmd.SetWarnings False
                    DoCmd.OpenQuery ("T_R_Ajouter_Collaborateur")
                    Me.Champ_collaborateur.Value = ""
                    MsgBox ("Nouveau collaborateur " & N_collaborateur & " ajouté !")
                Else
     
                    MsgBox (N_collaborateur & " existe déjà !")
                End If
            End If
        End If
     
    End Sub
     
    Public Function rControl(strVal As String, rPatern As String) As Boolean
     
        Dim reg As New VBScript_RegExp_55.RegExp
        reg.IgnoreCase = True
     
        reg.Pattern = rPatern
        rControl = reg.Test(strVal)
     
        Set reg = Nothing
     
    End Function
     
    Public Function rReplace(strVal As String, rPatern As String, strSub As String) As String
     
        Dim reg As New VBScript_RegExp_55.RegExp
        reg.IgnoreCase = True
     
        reg.Pattern = rPatern
        rReplace = reg.Replace(strVal, strSub)
     
        Set reg = Nothing
     
    End Function

  7. #7
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour et merci de ce retour.
    Avec les RegEx c'est bon d'avoir un exemple de code fonctionnel comme référence.
    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2016] recherche valeur proche avec texte dans plage
    Par MickaM33 dans le forum Excel
    Réponses: 8
    Dernier message: 03/02/2017, 21h16
  2. [XL-2010] Recherche valeur proche sur 2 critères
    Par lemulo23 dans le forum Excel
    Réponses: 4
    Dernier message: 07/07/2015, 17h40
  3. expression régulière (Recherche dans fichier)
    Par Mirel dans le forum Langage
    Réponses: 4
    Dernier message: 16/04/2009, 14h13
  4. Expression régulière recherche de fichier
    Par david71 dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 12/09/2008, 12h53
  5. Réponses: 22
    Dernier message: 05/09/2006, 19h32

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