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

Access Discussion :

Recherche VBA sur caractère accentué et non accentué [AC-2010]


Sujet :

Access

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2013
    Messages : 53
    Points : 33
    Points
    33
    Par défaut Recherche VBA sur caractère accentué et non accentué
    Bonjour,

    J'ai un problème pour la création d'une requête VBA pour la recherche de nom avec des caractères accentués et non accentués.
    Ma base Access Mariages est divisée en autant de lettre de l'alphabet MariagesA MariagesB ect… pour une question de rapidité d'accès.
    H5 étant le champ des Noms
    J'ai un formulaire Visualisation rapideMT avec une liste déroulante Choix nom époux et un bouton de commande qui lance la requête et l'affichage des résultats Temp_MariagesN étant la table des résultats de la requête.
    Actuellement j'ai une requête qui fonctionne très bien:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ChoixNom = [Choix nom époux]  ' nom complet
    ChoixNomEpx = Left([Choix nom époux], 1)  ' Renvoie la lettre à gauche "B".
    MyCharM = "MARIAGES" & ChoixNomEpx ' nom de la table suivi de la 1ère lettre du nom
    requete = "INSERT INTO Temp_MariagesN"
    requete = requete & " SELECT * FROM " & MyCharM & " " 
    requete = requete & " WHERE ((" & MyCharM & ".H5)=[Formulaires]![Visualisation rapideMT]![Choix nom époux])"
    Dans mes tables j'ai des noms qui sont accentués et d'autres non. Je voudrais en choisissant un seul nom dans la liste déroulante que tous les noms accentués ou pas soient insérés dans la table Temp_MariagesN.
    Sur internet j'ai trouvé la sélection suivante:
    Sous SQL Server et Access :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * from table WHERE champ4 like 'r%r[eéèêë][uúùûü][nñ][iìíîï][oóòôö]n%'
    qui pourrait devenir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * from " & MyCharM & ". WHERE ((" & MyCharM & ".H5)=[ like 'r%r[eéèêë][uúùûü][nñ][iìíîï][oóòôö]n%'
    Mais je ne sais pas ou insérer cette nouvelle ligne dans ma requête actuelle et ou définir le nom recherché ChoixNom.
    Pouvez-vous m'aider SVP.
    Merci

  2. #2
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 006
    Points : 24 600
    Points
    24 600
    Par défaut
    Bonjour,

    Il s'agit de remplacer la condition Where donc à la place de celle en place :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    requete = requete & " WHERE ((" & MyCharM & ".H5)=[Formulaires]![Visualisation rapideMT]![Choix nom époux])"
    deviendrait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    requete = requete & " WHERE " & MyCharM & ".H5 LIKE ""*[eéèêë][uúùûü][nñ][iìíîï][oóòôö]*"""
    Par contre plus question d'utiliser le choix sur nom époux avec cette syntaxe.

    Voir mon tuto sur le Like pour comprendre ce que cette syntaxe signifie. http://loufab.developpez.com/tutorie...operateurlike/

    Cordialement,
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2013
    Messages : 53
    Points : 33
    Points
    33
    Par défaut
    Bonjour,

    Merci de votre réponse.

    1- J'ai fait la modification indiquée et avec [A-Z] et cela fonctionne bien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    requete = requete & " WHERE " & MyCharM & ".H5 LIKE ""*[A-Z]*"""
    Mais il y a un nouveau problème l'instruction INSERT INTO me ramène toute la table et non le patronyme choisi. Je n'arrive pas à remplir ma table avec seulement les noms sélectionnés accentué ou pas. Cette table est choisie en fonction de la première lettre du patronyme.

    Amicalement ACN


    2- Après pas mal d'essais, je n'arrive pas à combiner les 2 possibilités à savoir le choix du Nom "ChoixNom"et la fonction [A-Z]
    Simplification, plus besoin de la ligne avec le nom du formulaire.

    Les 2 descriptions fonctionnent bien indépendamment avec le choix du nom dans la liste déroulante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    requete = "INSERT INTO Temp_MariagesN"
    requete = requete & " SELECT * FROM " & MyCharM & " "
    requete = requete & " WHERE " & MyCharM & ".H5 LIKE ""*[A-Z]*"""
    marche mais rapatrie toutes la table choisie et non le seul patronyme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    requete = "INSERT INTO Temp_MariagesN"
    requete = requete & " SELECT * FROM " & MyCharM & " "
    requete = requete & " WHERE " & MyCharM & ".H5 LIKE '" & ChoixNom & "' "
    marche rapatrie seulement le Nom choisi mais pas de caractère accentué
    J'espère que vous trouverez le moyen de combiner la fonction LIKE avec le choix du Nom et le [A-Z]
    Amicalement ACN

  4. #4
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 006
    Points : 24 600
    Points
    24 600
    Par défaut
    Que donne ta requête une fois composée ?

    C'est par là qu'il faut commencer.
    Il y a un tuto concernant le débogage de requête en VBA.
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2013
    Messages : 53
    Points : 33
    Points
    33
    Par défaut
    Bonjour,

    J'ai fait plusieurs essais en prenant comme nom Derre (et il y a aussi des Derré dans ma base.
    Le résultat est assez curieux: pour Derre j'ai comme résultat Derreau et Derres et il manque toute la série des Derre et Derré
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    requete = requete & " WHERE " & MyCharM & ".H5 LIKE ""derre[aàâ-cç-eéèêë-iìíîï-oóòôö-uúùûü-z]*"" "
    2 Si je fais avec derr (le e final étant enlevé) et la requête suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    requete = requete & " WHERE " & MyCharM & ".H5 LIKE ""derre[aàâ-cç-eéèêë-iìíîï-oóòôö-uúùûü-z]*"" "
    tous les Derre et Derré (et d'autre avec des a ou o à la suite des rr s'affiche ce qui est normal).
    Pourquoi faut-il faire la requête avec Derr et nom Derre?*
    Maintenant je change le nom par clement avec la même requête, résultat : Clementeau
    Si je veux voir tous les Clement, avec toute la suite après le m il faut la requête avec clem comme nom et le Clément n'est pas dedans alors que le caractère accentué vient bien avec le nom derr.
    Si je fais la requête avec clém le résultat donne clément seul.
    J'en déduit que la recherche ne se fait que sur la première lettre trouvée (en l'occurrence le e);
    Autre exemple: même requête avec comme nom fouche résultat tous les noms avec tous les Foucher, Fouchet mais pas de Fouche; si je veux le nom fouche il faut mettre fouch dans la requête et la j'ai même le Fouché.
    Il y a quand même un peu de progrès … mais cela complique bien la définition de la requête car s'il faut supprimer des lettres dans le nom cela devient bien compliqué. La réponse n'est pas la même suivant le patronyme recherché.
    Amicalement ACN

  6. #6
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 006
    Points : 24 600
    Points
    24 600
    Par défaut
    Si l'opérateur Like ne tient pas compte de la casse, il n'en est pas de même pour les accents.

    Ainsi si tu tapes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM nom like "clément*"
    Les résultats seront : clément, clémenteau, clémentine...
    mais pas : clement...

    Pour avoir les clément... comme les clement..., clêment, clément il faut le lui indiquer comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM nom like "cl[eèéê]ment*"
    Tu peux également utiliser cette syntaxe :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM nom like "cl?ment*"
    Mais dans ce cas, en plus de tous les clé clè... tu auras clo, clu, cli... avec ou sans accent.

    On peut enfin imaginer une fonction VBA pour remplacer les caractères "accentuables" à l'aide de 2 fonctions de traitement de chaine Instr() et Replace(). instr() pour détecter le le caractère accentué et replace() pour remplacer le e par [eèéê].

    Dans le cas du Derre il faut écrire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM nom like "derr[eèéê]*"
    Ce qui est entre crochet ne remplace QUE le caractère qui est à cette position.

    Ainsi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM nom like "derr[eèéê]e*"
    te donnera Derree, Derrèe, Derrêe mais pas Derrêê ni Derreê

    As-tu compris le fonctionnement ? A noter que tout cela est expliqué avec nombre d'exemple dans mon tuto.

    Cordialement,
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2013
    Messages : 53
    Points : 33
    Points
    33
    Par défaut
    Merci de cette réponse.
    J'ai bien compris le fonctionnement mais cela ne simplifie pas le système de recherche car il faudrait décomposer le nom en fonction de son orthographe.
    Comment font les logiciel qui effectue une recherche sur les caractères accentués avec seulement le choix sur d'un nom comme Clément qui peut être saisi avec Clement ou Clément et il y a aussi Chalon ou Châlon et qui remplace à n'importe quelle place dans le nom. Cela se produit le plus fréquemment avec toutes les variations de e.
    Amicalement ACN

  8. #8
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 006
    Points : 24 600
    Points
    24 600
    Par défaut
    En effet, je comprend parfaitement ton problème qui se pose pour chacun d'entre nous et dans la majorité des SGBDs (mais pas tous) supportant le LIKE.

    L'objet de la recherche doit passer au travers d'un convertisseur maison. Une fonction utilisateur (convertaccent() ?) qui va remplacer les e a i o u (n..) par [eéèê], [aâ]...

    Ainsi lorsque tu crées ta requête cela donnera ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    requete = requete & " WHERE " & MyCharM & ".H5 LIKE '" & ConvertAccent(ChoixNom) & "' "
    On peut également choisir de simplifier le traitement mais pas affiner la recherche en remplaçant par "?"

    Pour faire appel à une telle fonction il faut qu'elle soit déclarée dans un module standard et qu'elle soit publique.

    cordialement,
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2013
    Messages : 53
    Points : 33
    Points
    33
    Par défaut
    Merci de votre réponse,

    Là cela ce complique pour moi car je ne suis pas un spécialiste du VBA. En cherchant j'ai trouvé un code de babaothe qui propose une function Private et non Public traduiremajsansacc que j'ai renommée en ConvertAceent
    Avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    requete = requete & " WHERE " & MyCharM & ".H5 LIKE '" & ConvertAccent(ChoixNom) & "' "
    cela me réponds Erreur de compilation Variable ou procédure attendue et non un module. Que la fonction soit déclarée en Private ou Public.
    Voilà la fonction: peut-être à voir les caractères de remplacement par la suite.
    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
    Public Function ConvertAccent(ByVal c As String) As String
    Dim eclate() As Byte, i As Integer
    eclate = StrConv(UCase(c), vbFromUnicode)
    For i = 0 To UBound(eclate)
     Select Case eclate(i)
    'on va traiter (pour accélérer) dans l'ordre de plus grende probabilité d'occurrence
    ' pour les accents : d'abord si pas d'accent, puis les E, puis les A, puis les I, puis les U
    ' on met le case de la cédille avant celui du I accentué
    ' les o accentués, y accentué et ñ, moins fréquents, seront les derniers.
    Case Is < 192
    'on ne fait rien
    Case 200 To 203
    eclate(i) = 69
    Case 192 To 197
    eclate(i) = 65
    Case 199
    eclate(i) = 67
    Case 204 To 207
    eclate(i) = 73
    Case 217 To 220
    eclate(i) = 85
    Case 210 To 214
    eclate(i) = 79
    Case 209
    eclate(i) = 78
    Case 221
    eclate(i) = 89
    End Select
    ConvertAccent = ConvertAccent & Chr(eclate(i))
    Next
    End Function
    J'espère grace à vous arriver à un résultat.
    Merci encore;
    Amicalement ACN

    La nuit portant conseil je me rend compte que le module ConvertAccent n'apporte pas la réponse à ce que je désire. En effet il convertit à la lecture les lettres accentuées en non accentuées. Moi ce que je veux c'est sélectionner le NOM avec lettre accentuée ou non accentuée. Sachant que dans ma base de données le champ NOM est toujours en majuscule. Reste à trouver le convertisseur maison!.

  10. #10
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 006
    Points : 24 600
    Points
    24 600
    Par défaut
    Je n'avais pas trop le temps de te rediger une petit fonction mais en voici une plus compréhensible (à compléter à l'envie).

    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
    Function ConvertAccForLike(strValue As String) As String
    If InStr(1, strValue, "a") > 0 Then
        strValue = Replace(strValue, "a", "[aàâä]")
    End If
    If InStr(1, strValue, "e") > 0 Then
        strValue = Replace(strValue, "e", "[eéèêë]")
    End If
    If InStr(1, strValue, "i") > 0 Then
        strValue = Replace(strValue, "i", "[iîï]")
    End If
    If InStr(1, strValue, "o") > 0 Then
        strValue = Replace(strValue, "o", "[oôö]")
    End If
    If InStr(1, strValue, "u") > 0 Then
        strValue = Replace(strValue, "u", "[uùûü]")
    End If
    ConvertAccForLike = strValue
    End Function
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2013
    Messages : 53
    Points : 33
    Points
    33
    Par défaut
    Merci beaucoup pour votre intervention.
    Cela fonctionne parfaitement. J'ai ajouté le * pour avoir une recherche élargie sur le nom.
    Il ne me reste plus qu'à continuer les modif pour les recherches sur le prénom.
    Je communique le code final complet sur la recherche par le NOM avec la sélection dans une liste déroulante, cela pourra peut-être servir à une autre personne.
    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
    Private Sub Commande40_Click()
    On Error GoTo Err_Bouton40_Click
        Dim requete As String
        Dim DocName As String
        Dim ChoixNomEpx As String
        Dim MyCharM As String
        Dim ChoixNom As String
        Dim Message, Title, Default   
        VideTableVisualisationMariage 'Module vide table
        DoCmd.SetWarnings False 'suppression code d'erreur
         If Forms![Visualisation rapideMT]![Choix nom époux] = "*" Then
         MsgBox "Renseigner le Nom de l'Epoux ", 16
          Exit Sub
          Else:
          ChoixNom = [Choix nom époux]    ' nom complet
          ChoixNomEpx = Left([Choix nom époux], 1)  ' Renvoie la lettre à gauche "B".
          ChoixNom = ChoixNom & "*"   ' recherche sur les extension du nom
          MyCharM = "MARIAGES" & ChoixNomEpx ' nom de la table suivi de la 1ère lettre du nom
         requete = "INSERT INTO Temp_MariagesN"
         requete = requete & " SELECT * FROM " & MyCharM & " "
         requete = requete & " WHERE " & MyCharM & ".H5 LIKE '" & ConvertAccForLike(ChoixNom) & "' "
        End If
       DoCmd.RunSQL requete ' Exécute la requéte
    Exit_Bouton40_Click:
        Exit Sub
    Err_Bouton40_Click:
        Resume Exit_Bouton40_Click
    End Sub
    A la suite j'aurai la même chose à faire sur une autre application Access mais avec un système de recherche plus compliqué.
    Merci encore de votre patience et vous êtes le meilleur vous et tous ceux qui participe à l'entraide de Devellopez.com

  12. #12
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 006
    Points : 24 600
    Points
    24 600
    Par défaut
    Merci et bonne continuation.
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2013
    Messages : 53
    Points : 33
    Points
    33
    Par défaut Recherche VBA sur caractère accentué et non accentué SUITE
    Bonjour,

    Je désire faire un ajout de sélection dans la recherche des noms propres sur le module ConvertAccForLike
    Ce module décrit dans la discussion précédente fonctionne très bien.
    Dans les registres de l'ancien régine (date des périodes 1600 à 1792) on trouves des noms propres avec les lettres AS (exemple CHASLON)
    qui avec l'évolution est passé au CHÂLON, CHALLON pour finir en CHALON. On trouve la même chose avec le E et ES.
    Tout cela pour incorporer une recherche pour les AS, ES, LL et peut-être d'autre.
    J'ai trouvé pour faire la recherche sur 2 caractères avec seulement 1 seul de défini.
    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
     
    Function ConvertAccForLikeA(strValue As String) As String
    If InStr(1, strValue, "a") > 0 Then
        strValue = Replace(strValue, "a", "as")
    End If
    ConvertAccForLikeA = strValue
    End Function
    Function ConvertAccForLikeE(strValue As String) As String
    If InStr(1, strValue, "e") > 0 Then
        strValue = Replace(strValue, "e", "es")
    End If
    ConvertAccForLikeE = strValue
    End Function
    Function ConvertAccForLikeL(strValue As String) As String
    If InStr(1, strValue, "l") > 0 Then
        strValue = Replace(strValue, "l", "ll")
    End If
    ConvertAccForLikeL = strValue
    End Function
    et cela fonctionne.
    Actuellement je lance les requêtes à la suite ce qui augmente beaucoup le nombre de ligne de traitement.
    Mais ce que je voudrais, c'est de l'incorporer au module déjà existant
    J'ai fait beaucoup d'essais mais cela ne fonctionne toujours pas sur le module de base.
    peut-être que loufab à une solution

    Merci de votre réponse.
    ACN

  14. #14
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 006
    Points : 24 600
    Points
    24 600
    Par défaut
    Bonjour,

    Il faut te tourner vers la recherche phonétique.

    http://www.developpez.net/forums/d95...he-phonetique/

    Cependant il y a une limite à tout. On ne peut pas rechercher n'importe quoi à partir de choses trop différente. On est loin de reproduire le fonctionnement du cerveau humain.


    Cordialement,
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  15. #15
    Nouveau membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2013
    Messages : 53
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par loufab Voir le message
    Bonjour,

    Il faut te tourner vers la recherche phonétique.

    http://www.developpez.net/forums/d95...he-phonetique/

    Cependant il y a une limite à tout. On ne peut pas rechercher n'importe quoi à partir de choses trop différente. On est loin de reproduire le fonctionnement du cerveau humain.


    Cordialement,
    Bonjour,

    Les recherches phonétiques ne donnent pas toujours le résultat désiré. je veux pouvoir choisir mon regroupent de lettres.
    Commande actuelle qui fonctionne avec les modules lancés à la suite les un des autres.

    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
    Private Sub Commande40_Click()
        Dim requete As String
        Dim MyCharM As String
     
    On Error GoTo Err_Bouton40_Click
        DoCmd.SetWarnings False 'suppression code d'erreur
         If Forms![Visu_implantation]![ChoixNom] = "*" Then
        MsgBox "Renseigner le Nom ", 16
          Exit Sub
          Else
        'Requete Sélectionne les Noms par commune
     
    ' module ConvertAccForLike des accentués
          ChoixNom = ChoixNom & "*"   ' recherche sur les extension du nom
          MyCharM = "RepartitiongeographNom" ' nom de la table
         requete = "INSERT INTO RepartitiongeographiqueNoms"
         requete = requete & " SELECT * FROM  " & MyCharM & " "
         requete = requete & " WHERE " & MyCharM & ".Noms LIKE '" & ConvertAccForLike(ChoixNom) & "' "
        DoCmd.RunSQL requete ' Exécute la requéte
     
    '1er module ConvertAccForLikeA
         requete = "INSERT INTO RepartitiongeographiqueNoms"
         requete = requete & " SELECT * FROM  " & MyCharM & " "
         requete = requete & " WHERE " & MyCharM & ".Noms LIKE '" & ConvertAccForLikeA(ChoixNom) & "' "
       DoCmd.RunSQL requete ' Exécute la requéte
     
    '2e module ConvertAccForLikeE
         requete = "INSERT INTO RepartitiongeographiqueNoms"
         requete = requete & " SELECT * FROM  " & MyCharM & " "
         requete = requete & " WHERE " & MyCharM & ".Noms LIKE '" & ConvertAccForLikeE(ChoixNom) & "' "
       DoCmd.RunSQL requete ' Exécute la requéte
     
    '3e module ConvertAccForLikeE
         requete = "INSERT INTO RepartitiongeographiqueNoms"
         requete = requete & " SELECT * FROM  " & MyCharM & " "
         requete = requete & " WHERE " & MyCharM & ".Noms LIKE '" & ConvertAccForLikeL(ChoixNom) & "' "
       DoCmd.RunSQL requete ' Exécute la requéte
        End If
     
        requete = "DELETE DISTINCTROW [RepartitionNomsTemp].*FROM [RepartitionNomsTemp]" 'Vide table RepartitionNomsTemp
        DoCmd.RunSQL requete
        DoCmd.OpenQuery "RepartionNomsTemp", acViewNormal, acEdit 'Requete RepartionNomsTemp remplir à l'écran les noms recherchés
        MsgBox "Sélectionnez d'autres homonymes de votre choix qui seront ajoutés à la liste  ", 16
        DoCmd.Close A_FORM, "VISU_IMPLANTATION"
        DoCmd.OpenForm "VISU_IMPLANTATION"
    Exit_Bouton40_Click:
        Exit Sub
    Err_Bouton40_Click:
        Resume Exit_Bouton40_Click
    End Sub
    Je voudrais mettre une requête FOR NEXT à la place des 3 derniers module comme suit:

    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
        Dim MyChar As String
     
        For I = 65 To 66   ' A à Z
        MyChar = Chr(I)
        MyCharEM = "ConvertAccForLike" & MyChar
     MsgBox MyCharEM
         requete = "INSERT INTO RepartitiongeographiqueNoms"
         requete = requete & " SELECT * FROM  " & MyCharM & " "
     MsgBox "Test1"
         requete = requete & " WHERE " & MyCharM & ".Noms LIKE '" & MyCharEM & "(ChoixNom) & " ' "
     MsgBox "Test2"
        DoCmd.RunSQL requete ' Exécute la requéte
        Next I
     MsgBox "Test3"
       End If
     MsgBox "Test4"
    La requête s'exécute jusqu'au Test2 et ne se termine pas. Surement un problème de syntaxe que je n'arrive pas à résoudre.
    Un module peut-il être appelé par une variable MyCharEM. Au test de MyCharEM c'est bien ConvertAccForLikeA qui s'affiche.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    requete = requete & " WHERE " & MyCharM & ".Noms LIKE '" & MyCharEM & "(ChoixNom) & " ' "
    par contre le dernier caractère est pris comme un commentaire et tout ce que j'essaie me donne un message d'erreur.

    Merci de votre réponse.
    ACN

  16. #16
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 006
    Points : 24 600
    Points
    24 600
    Par défaut
    On ne peut pas coder ça.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '" & MyCharEM & "(ChoixNom) & " ' "
    A la limite on peut essayer avec EVAL() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     EVAL("MyCharEM" & "(ChoixNom)")
    Sans aucune certitude.
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  17. #17
    Nouveau membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2013
    Messages : 53
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par loufab Voir le message
    On ne peut pas coder ça.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '" & MyCharEM & "(ChoixNom) & " ' "
    A la limite on peut essayer avec EVAL() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     EVAL("MyCharEM" & "(ChoixNom)")
    Sans aucune certitude.
    Merci de votre réponse.
    j'ai fait plusieurs essais et je suis arrivé à faire marcher (partiellement) la requête en modifiant comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        For I = 65 To 66   ' A à Z
        MyChar = Chr(I)
        MyCharEM = "ConvertAccForLike" & MyChar & "(ChoixNom)" ' insetion de (Choixnom) dans la variable
     MsgBox MyCharEM
         requete = "INSERT INTO RepartitiongeographiqueNoms"
         requete = requete & " SELECT * FROM  " & MyCharM & " "
        requete = requete & " WHERE " & MyCharM & ".Noms LIKE " & MyCharEM & " "
        DoCmd.RunSQL requete ' Exécute la requéte
        Next I
       End If
    et cela fonctionne.
    Maintenant mon problème et dans la définition de la boucle car si je mets 90 au lieu de 66 cela bloque
    ce qui est normal car mes module ne sont pas pour toutes les lettre de l'alphabet et je ne peux pas passer de 65,66,69,76 ect...
    Il me semble qu'il faut passer par FOR I EACH In
    mais je ne sais pas tellement comment définir un tableau et si possible dans une fonction pour n'avoir qu'un seul endroit à modifier quand je rajoute des lettres de l'alphabet. j'espère que je me fais bien comprendre.
    Merci de votre réponse.

  18. #18
    Nouveau membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2013
    Messages : 53
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par ACNTOURAINE Voir le message
    Merci de votre réponse.
    j'ai fait plusieurs essais et je suis arrivé à faire marcher (partiellement) la requête en modifiant comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        For I = 65 To 66   ' A à Z
        MyChar = Chr(I)
        MyCharEM = "ConvertAccForLike" & MyChar & "(ChoixNom)" ' insetion de (Choixnom) dans la variable
     MsgBox MyCharEM
         requete = "INSERT INTO RepartitiongeographiqueNoms"
         requete = requete & " SELECT * FROM  " & MyCharM & " "
        requete = requete & " WHERE " & MyCharM & ".Noms LIKE " & MyCharEM & " "
        DoCmd.RunSQL requete ' Exécute la requéte
        Next I
       End If
    et cela fonctionne.
    Maintenant mon problème et dans la définition de la boucle car si je mets 90 au lieu de 66 cela bloque
    ce qui est normal car mes module ne sont pas pour toutes les lettre de l'alphabet et je ne peux pas passer de 65,66,69,76 ect...
    Il me semble qu'il faut passer par FOR I EACH In
    mais je ne sais pas tellement comment définir un tableau et si possible dans une fonction pour n'avoir qu'un seul endroit à modifier quand je rajoute des lettres de l'alphabet. j'espère que je me fais bien comprendre.
    Merci de votre réponse.
    Je me réponds, car j'ai avancé dans la commande For Each.
    Après pas mal de temps passé et de recherche, il faut dire que je ne suis pas un pro du VBA, j'arrive à ce qui suit et qui fonctionne.
    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
    Private Sub Commande40_Click()
        Dim requete As String
        Dim MyChar As String
     
    On Error GoTo Err_Bouton40_Click
        DoCmd.SetWarnings False 'suppression code d'erreur
         If Forms![Visu_implantation]![ChoixNom] = "*" Then
        MsgBox "Renseigner le Nom ", 16
          Exit Sub
          Else
        'Requete Sélectionne les Noms par commune
    '    DoCmd.OpenQuery "RepartitiongeographiqueNomSelect", acViewNormal, acEdit
     
          MyTableInto = "RepartitiongeographiqueNoms" ' table insert into
          MyTableDE = "RepartitiongeographNom" ' nom de la table where
     
        ChoixNom = ChoixNom & "*"   ' recherche sur les extension du nom
         requete = "INSERT INTO " & MyTableInto & " "
         requete = requete & " SELECT * FROM  " & MyTableDE & " "
         requete = requete & " WHERE " & MyTableDE & ".Noms LIKE '" & ConvertAccForLike(ChoixNom) & "' "
        DoCmd.RunSQL requete ' Exécute la requête
     
     '  Choixlettre
        Dim I As Variant
       For Each I In Array("A", "B", "E", "L") ' choix des lettre ConvertAccForLike marche
        MyChar = (I) ' marche
        MyConvert = "ConvertAccForLike" & MyChar & "(ChoixNom)"
         requete = "INSERT INTO " & MyTableInto & " "
         requete = requete & " SELECT * FROM  " & MyTableDE & " "
         requete = requete & " WHERE " & MyTableDE & ".Noms LIKE " & MyConvert & " "
       DoCmd.RunSQL requete ' Exécute la requéte
        Next I
       End If
     
        requete = "DELETE DISTINCTROW [RepartitionNomsTemp].*FROM [RepartitionNomsTemp]" 'Vide table RepartitionNomsTemp
        DoCmd.RunSQL requete
        DoCmd.OpenQuery "RepartionNomsTemp", acViewNormal, acEdit 'Requete RepartionNomsTemp remplir à l'écran les noms recherchés
        MsgBox "Sélectionnez d'autres homonymes de votre choix qui seront ajoutés à la liste  ", 16
        DoCmd.Close A_FORM, "VISU_IMPLANTATION"
        DoCmd.OpenForm "VISU_IMPLANTATION"
    Exit_Bouton40_Click:
        Exit Sub
    Err_Bouton40_Click:
        Resume Exit_Bouton40_Click
    End Sub
    J'ai défini des noms de variable MyTableInto et MyTableDe pour les adapter dans d'autre commande de recherche sur d'autres formulaires.
    Il me reste un problème à régler, celui de For Each I In Array("A", "B", "E", "L"), car ce nombre de lettres n'est pas limitatif et je peux avoir à ajouter d'autres fonctions avec des lettres supplémentaires.
    Comme j'ai de nombreux formulaire avec des tables différentes et nom de champs différents (d'où l'utilisation de MyTableInto et MyTableDe) je voudrais que For Each I In Array("A", "B", "E", "L") soit placé ailleurs, dans une fonction par exemple, pour n'avoir à modifier le nombre de lettres qu'une seule fois.
    Quelqu'un peut-il me donner la marche à suivre.
    J'ai bien essayé de créer une fonction à partir de 'Choixlettre jusqu'à Next I mais cela ne fonctionne pas.
    Les valeurs de MyTableInto et MyTableDe et ChoixNom ne sont pas transmises dans cette nouvelle fonction.
    Merci de votre réponse.
    Amicalement ACN

  19. #19
    Nouveau membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2013
    Messages : 53
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par ACNTOURAINE Voir le message
    Je me réponds, car j'ai avancé dans la commande For Each.
    Après pas mal de temps passé et de recherche, il faut dire que je ne suis pas un pro du VBA, j'arrive à ce qui suit et qui fonctionne.
    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
    Private Sub Commande40_Click()
        Dim requete As String
        Dim MyChar As String
     
    On Error GoTo Err_Bouton40_Click
        DoCmd.SetWarnings False 'suppression code d'erreur
         If Forms![Visu_implantation]![ChoixNom] = "*" Then
        MsgBox "Renseigner le Nom ", 16
          Exit Sub
          Else
        'Requete Sélectionne les Noms par commune
    '    DoCmd.OpenQuery "RepartitiongeographiqueNomSelect", acViewNormal, acEdit
     
          MyTableInto = "RepartitiongeographiqueNoms" ' table insert into
          MyTableDE = "RepartitiongeographNom" ' nom de la table where
     
        ChoixNom = ChoixNom & "*"   ' recherche sur les extension du nom
         requete = "INSERT INTO " & MyTableInto & " "
         requete = requete & " SELECT * FROM  " & MyTableDE & " "
         requete = requete & " WHERE " & MyTableDE & ".Noms LIKE '" & ConvertAccForLike(ChoixNom) & "' "
        DoCmd.RunSQL requete ' Exécute la requête
     
     '  Choixlettre
        Dim I As Variant
       For Each I In Array("A", "B", "E", "L") ' choix des lettre ConvertAccForLike marche
        MyChar = (I) ' marche
        MyConvert = "ConvertAccForLike" & MyChar & "(ChoixNom)"
         requete = "INSERT INTO " & MyTableInto & " "
         requete = requete & " SELECT * FROM  " & MyTableDE & " "
         requete = requete & " WHERE " & MyTableDE & ".Noms LIKE " & MyConvert & " "
       DoCmd.RunSQL requete ' Exécute la requéte
        Next I
       End If
     
        requete = "DELETE DISTINCTROW [RepartitionNomsTemp].*FROM [RepartitionNomsTemp]" 'Vide table RepartitionNomsTemp
        DoCmd.RunSQL requete
        DoCmd.OpenQuery "RepartionNomsTemp", acViewNormal, acEdit 'Requete RepartionNomsTemp remplir à l'écran les noms recherchés
        MsgBox "Sélectionnez d'autres homonymes de votre choix qui seront ajoutés à la liste  ", 16
        DoCmd.Close A_FORM, "VISU_IMPLANTATION"
        DoCmd.OpenForm "VISU_IMPLANTATION"
    Exit_Bouton40_Click:
        Exit Sub
    Err_Bouton40_Click:
        Resume Exit_Bouton40_Click
    End Sub
    J'ai défini des noms de variable MyTableInto et MyTableDe pour les adapter dans d'autre commande de recherche sur d'autres formulaires.
    Il me reste un problème à régler, celui de For Each I In Array("A", "B", "E", "L"), car ce nombre de lettres n'est pas limitatif et je peux avoir à ajouter d'autres fonctions avec des lettres supplémentaires.
    Comme j'ai de nombreux formulaire avec des tables différentes et nom de champs différents (d'où l'utilisation de MyTableInto et MyTableDe) je voudrais que For Each I In Array("A", "B", "E", "L") soit placé ailleurs, dans une fonction par exemple, pour n'avoir à modifier le nombre de lettres qu'une seule fois.
    Quelqu'un peut-il me donner la marche à suivre.
    J'ai bien essayé de créer une fonction à partir de 'Choixlettre jusqu'à Next I mais cela ne fonctionne pas.
    Les valeurs de MyTableInto et MyTableDe et ChoixNom ne sont pas transmises dans cette nouvelle fonction.
    Merci de votre réponse.
    Amicalement ACN
    Bonjour,
    Merci de cette réponse rapide et c'est tout à fait ce que je cherchais. Je ne suis pas très fort pour la syntaxe.
    Voici le code complet avec les fonction si cela intéresse quelqu'un.
    Merci encore à marot_r et loufab
    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
    Private Sub Commande40_Click()
        Dim requete As String
        Dim I As Variant
        Dim MyLettre As Variant
     
    On Error GoTo Err_Bouton40_Click
        DoCmd.SetWarnings False 'suppression code d'erreur
         If Forms![Visu_implantation]![ChoixNom] = "*" Then  'sélection du nom dans une liste déroulante
        MsgBox "Renseigner le Nom ", 16
          Exit Sub
          Else
     
          MyTableInto = "RepartitiongeographiqueNoms" ' table insert into à définir à chaque commande
          MyTableDE = "RepartitiongeographNom" ' nom de la table where à chaque commande
     
     '  Sélectionne Choix lettre caractère accentué
        ChoixNom = ChoixNom & "*"   ' recherche sur les extension du nom
         requete = "INSERT INTO " & MyTableInto & " "
         requete = requete & " SELECT * FROM  " & MyTableDE & " "
         requete = requete & " WHERE " & MyTableDE & ".Noms LIKE '" & ConvertAccForLike(ChoixNom) & "' "
        DoCmd.RunSQL requete ' Exécute la requéte
     
     
     '  Sélectionne Choix lettre ancien français
        nb = DCount("*", "Liste_accentue") ' comptage du nbre de ligne de la table
      For I = 1 To nb 'Table Liste_accentue nombre de d'enregistrments
        MyLettre = DLookup("[Valeur]", "Liste_accentue", "[ID] = " & I)
        MyConvert = "ConvertAccForLike" & MyLettre & "(ChoixNom)"
         requete = "INSERT INTO " & MyTableInto & " "
         requete = requete & " SELECT * FROM  " & MyTableDE & " "
         requete = requete & " WHERE " & MyTableDE & ".Noms LIKE " & MyConvert & " "
       DoCmd.RunSQL requete ' Exécute la requéte
        Next I
       End If
     
        requete = "DELETE DISTINCTROW [RepartitionNomsTemp].*FROM [RepartitionNomsTemp]" 'Vide table RepartitionNomsTemp
        DoCmd.RunSQL requete
        DoCmd.OpenQuery "RepartionNomsTemp", acViewNormal, acEdit 'Requete RepartionNomsTemp remplir à l'écran les noms recherchés
        MsgBox "Sélectionnez d'autres homonymes de votre choix qui seront ajoutés à la liste  ", 16
        DoCmd.Close A_FORM, "VISU_IMPLANTATION"
        DoCmd.OpenForm "VISU_IMPLANTATION"
     
    Exit_Bouton40_Click:
        Exit Sub
    Err_Bouton40_Click:
        Resume Exit_Bouton40_Click
    End Sub
    les fonctions que je peux ajouter suivant mes besoins et remplir la table Liste_accentue correspondante:
    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
    Option Compare Database
    Function ConvertAccForLike(strValue As String) As String
    If InStr(1, strValue, "a") > 0 Then
        strValue = Replace(strValue, "a", "[aàâä]")
    End If
    If InStr(1, strValue, "e") > 0 Then
        strValue = Replace(strValue, "e", "[eéèêë]")
    End If
    If InStr(1, strValue, "i") > 0 Then
        strValue = Replace(strValue, "i", "[iîï]")
    End If
    If InStr(1, strValue, "o") > 0 Then
        strValue = Replace(strValue, "o", "[oôö]")
    End If
    If InStr(1, strValue, "u") > 0 Then
        strValue = Replace(strValue, "u", "[uùûü]")
    End If
    If InStr(1, strValue, "c") > 0 Then
        strValue = Replace(strValue, "c", "[cç]")
    End If
    ConvertAccForLike = strValue
    End Function
     
    Function ConvertAccForLikeA(strValue As String) As String
    If InStr(1, strValue, "a") > 0 Then  '65
        strValue = Replace(strValue, "a", "as")
    End If
    ConvertAccForLikeA = strValue
    End Function
     
    Function ConvertAccForLikeB(strValue As String) As String
    If InStr(1, strValue, "b") > 0 Then  '66
        strValue = Replace(strValue, "b", "bb")
    End If
    ConvertAccForLikeB = strValue
    End Function
     
    Function ConvertAccForLikeE(strValue As String) As String
    If InStr(1, strValue, "e") > 0 Then  '69
        strValue = Replace(strValue, "e", "es")
    End If
    ConvertAccForLikeE = strValue
    End Function
     
    Function ConvertAccForLikeL(strValue As String) As String
    If InStr(1, strValue, "l") > 0 Then  '76
        strValue = Replace(strValue, "l", "ll")
    End If
    ConvertAccForLikeL = strValue
    End Function
    Merci encore
    ACN

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 25/04/2014, 09h28
  2. Convertir lettres accentuées en non accentuées
    Par CinePhil dans le forum Requêtes
    Réponses: 1
    Dernier message: 04/07/2012, 18h28
  3. Réponses: 4
    Dernier message: 22/12/2010, 16h58
  4. Recherche insensitive sur caractères spéciaux (é,è ,ç)
    Par Marty000 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/04/2010, 09h37
  5. [VBA] Sur une saisie oui/non, stocker la date
    Par PhNou dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 04/02/2008, 10h42

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