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 :

remplacer une chaine de caractère dans une colonne [AC-2010]


Sujet :

VBA Access

  1. #1
    Membre régulier
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Mai 2012
    Messages
    173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2012
    Messages : 173
    Points : 80
    Points
    80
    Par défaut remplacer une chaine de caractère dans une colonne
    Bonjour,

    Dans une table REVUE se trouve une colonne DUREE

    Les employés entre différentes informations dans la colonne DUREE du style

    10 NUMÉROS (1 AN), 10 NUMÉROS (2 ANS), 10 NUMÉROS (1 AN AVEC CD), 1 NUMÉRO, 108 NUMÉROS, 108 NUMÉROS (2 ANS), etc etc etc

    Lors du traitement des fiches des commandes de la semaine, il faut que cette colonne soit homogène.

    Pour reprendre l'exemple ci-dessus, la colonne doit afficher après traitement
    10 NOS, 108 NOS, 1 NO.
    En gros, tout ce qui se trouve après le chiffre doit se transformer en NOS.

    Je fais une requête mis à jour mais le problème est que je crée une requête spécifiques à ceux qui sont 10 NUMÉROS, une autre requête pour les 108 NUMÉROS. Par la suite, je lance une macro qui lance toute les requêtes mis à jour.

    Ca marche bien, mais c'est un peu rébarbatif à faire, et si jamais un nouveau magazine à une durée de 13 NUMÉROS, et que je n'ai pas crée la requête pour lui, alors ces enregistrements ne se modifiera pas après traitement.

    De plus, j'aurais à faire la même chose pour les revues qui se compte en semaine (du lundi au vendredi, du lundi au dimanche, etc...) Tout ce qui suit le chiffre doit être transformé en SEM.

    Je sais qu'il existe, les mots clés Replace ou Mid mais je n'arrive pas à les mettre en oeuvre.

    Je sais aussi ce qui m'attend sera de remplacer tous les accents des mots dans toute la table.

    J'espère avoir été assez clair et je demande votre aide pour simplifier ce travail.

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 345
    Points : 23 805
    Points
    23 805
    Par défaut
    La soltion classique dans ce genre de cas est d'avoir :

    Tabel Abonne
    ClefAbonne
    Autres infos

    Table Revue
    ClefRevue
    Autres infos

    Table Abonne
    ClefAbonne
    Autres infos

    Table DureeAbonnement
    ClefDureeAbonnement
    DureeAbonnement
    UniteDureeAbonnnement (ex : Mois, Semaine, Année)

    Table SupplementAbonnement
    ClefSupplementAbonnement
    LibelleSupplementAbonnement (ex : CD, DVD)

    Table Abonnement Suppose un seul supplement par abonnement
    ClefAbonnement (ça c'est pour la machine)
    CodeAbonnement (ex : 1 NOS, ça c'est pour l'humain)
    ClefDureeAbonnement
    ClefSupplementAbonnement

    en relation avec SupplementAbonnement
    en relation avec DureeAbonnement

    Table AssAbonneeRevueAbonnement
    ClefAssAbonneeRevueAbonnement
    ClefAbonnee
    ClefRevue
    ClefAbonnement

    en relation avec Abonne
    en relation avec Revue
    en relation avec Abonnement

    Comme cela tu as juste à completer la table AssAbonneeRevueAbonnement en choisissant dans la liste des abonnements celui que ton client désir. Une liste déroulante basée sur la table Abonnement en jointure avec Supplement abonnement et Duree abonnement pour le présenter de façon agréable semble bien adapté.

    Pas besoin de bricoler tes données après et il est très facile de sortir la liste des abonnés selon la fréquence de leur abonnement.

    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
    Membre régulier
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Mai 2012
    Messages
    173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2012
    Messages : 173
    Points : 80
    Points
    80
    Par défaut
    Merci Marot_r pour cette réponse rapide.

    Effectivement ta proposition est la meilleure et j'y ai pensé, mais comme je travaille sur une base de données existantes, je ne suis pas libre de faire ce que je veux.

    Ce qui pose problème en fait, ce sont les commandes passées sur Internet. Access récupère les commandes, et c'est là qu'apparaissent ce souci. Je n'ai aucun accès au site web, le traitement doit donc se faire après.

    Et oui, je pars sur une base qui est une usine à gaz et qui est mal concu dès le départ (enfin c'est mon avis pour mes connaissances dans le SGBD)

  4. #4
    Membre expert
    Avatar de FreeAccess
    Homme Profil pro
    Un monde ou prendre est plus facile qu'apprendre.
    Inscrit en
    Mars 2006
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Un monde ou prendre est plus facile qu'apprendre.

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 745
    Points : 3 834
    Points
    3 834
    Par défaut
    Bonjour,

    Avec le jeu d'exemple que tu nous donnes......
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT REVUE.DUREE, Val([DUREE]) & " NOS" AS Affichage
    FROM REVUE;

    ... ce qui m'attend sera de remplacer tous les accents des mots dans toute la table
    Quelques solutions dans la ....
    Comment ignorer les accents dans une requête SQL ?
    Comment enlever les accents d'une chaîne ?
    FreeAccess
    "Petit à petit l'araignée tisse sa toile"

  5. #5
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 345
    Points : 23 805
    Points
    23 805
    Par défaut
    Effectivement ta proposition est la meilleure et j'y ai pensé, mais comme je travaille sur une base de données existantes, je ne suis pas libre de faire ce que je veux.
    Ok, cela rajoute du piment à la sauce :-).

    Ce que tu peux peut-être faire c'est une étape de nettoyage AVANT ton chargement dans les tables de ta BD.

    En combinant VBA et requête SQL, tu élmines et tu normalises tes données. Ce qui fait qu'après pour les traitements tu n'as plus qu'un nombre restreints de cas.

    Une methode que j'ai utilisé avec succès est celle du dictionnaire des synoymes.

    Table Synonyme :
    ClefSynonyme (optionnel)
    ValeurDonneesBrutes
    ValeurDonneesCorrigee

    et je n'ai plus qu'un seul code tout simple qui se contente de chercher dans la table des synonyme la valeur que j'ai reçue et la remplace par la valeur corrigée.

    Une autre chose qu'on peut faire avec les usines à gaz c'est de petit à petit introduire des portions normalisées en parallèle avec la structure existante. Tu gardes ce que tu as mais les nouvelles fonctionnalités se base sur ta nouvelle architecture. Par exemple dans ton cas tu peux peut-être quand même avoir les tables que je t'ai suggérées et utiliser les codes fournis par ton site Web comme clef sur ces tables.

    Pour la manipulation des données la fonction Replace() est très utile pour faire des substitutions, par exemple pour remplacer les caractères accentués par des non accentués (taNouvelleChaine=replace(TaChaine,"é","e")) ,ou pour supprimer les blancs dans une chaîne (taNouvelleChaine=replace(TaChaine," ",""))

    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
    Membre régulier
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Mai 2012
    Messages
    173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2012
    Messages : 173
    Points : 80
    Points
    80
    Par défaut
    Merci à vous,

    Freeaccess ta méthode fonctionne très bien, par contre j'ai dans la même colonne des NUMÉROS et des SEMAINES (pour les journaux) et ta proposition récupère bien le chiffre mais transforme SEMAINES en NOS. Les SEMAINES devraient devenir après traitement SEM.

    Pour ce qui est de mettre petit à petit de nouvelle table n'est pas bête, je transforme la base pour être plus simple d'adaptation sans bloquer le travail des employés actuellement. Mais comme c'est ACCESS, il risque de prendre du poids et Access au bout d'une certaine taille s'effondre sur lui-même.

    Pour les accents dans les mots, je n'y suis pas encore mais je sais aue c'est déja traité sur ce site, j'aurais recherché les infos en temps utile, mais merci Freeaccess pour les liens, tu m,as simplifié mon travail

    Je vais essayer le replace comme fonction si j'arrive à l'écrire.

    (je me trouve au Québec durant 1 an, je répond tard pour vous si vous êtes en Europe et puis, j'ai du mal avec le qwerty avec les accents et autres...)

  7. #7
    Membre régulier
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Mai 2012
    Messages
    173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2012
    Messages : 173
    Points : 80
    Points
    80
    Par défaut
    le code dans la fonction

    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
    Public Function SansAccents(Texte As String)
        SansAccents = Replace(Texte, "é", "e")
        SansAccents = Replace(SansAccents, "è", "e")
        SansAccents = Replace(SansAccents, "ä", "e")
        SansAccents = Replace(SansAccents, "à", "a")
        SansAccents = Replace(SansAccents, "ê", "e")
        SansAccents = Replace(SansAccents, "ë", "e")
        SansAccents = Replace(SansAccents, "î", "i")
        SansAccents = Replace(SansAccents, "ï", "i")
        SansAccents = Replace(SansAccents, "ç", "c")
        SansAccents = Replace(SansAccents, "û", "u")
        SansAccents = Replace(SansAccents, "ü", "u")
        SansAccents = Replace(SansAccents, "ô", "o")
        SansAccents = Replace(SansAccents, "â", "a")
        SansAccents = Replace(SansAccents, "ö", "o")
        SansAccents = Replace(SansAccents, "ù", "u")
        SansAccents = Replace(SansAccents, "ò", "o")
     
    End Function
    Comment je dois la mettre en oeuvre pour qu'elle se lance ? l'appeler avec un call mais j'ai un message d'erreur "argument non facultatif"
    Mais, je ne sais pas comment lui dire de le faire sur les colonnes d'une table ?

  8. #8
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 345
    Points : 23 805
    Points
    23 805
    Par défaut
    Si tu l'utilises dans une requète, par exemple :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SansAccent([UnChampAvecAccents]) as TonChampSansAccent

    Dans du VBA

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dim taVariableSansAccent as string
    taVariableSansAccent=SansAccent(taVariableAvecAccent)
    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.

  9. #9
    Membre régulier
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Mai 2012
    Messages
    173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2012
    Messages : 173
    Points : 80
    Points
    80
    Par défaut
    Très bien, sur la requête ca fonctionne bien mais il faut mettre à jour toute les colonnes qui ont un accent, comme nom, prenom, adresse, ville.

    La requête donne le résultat que je veux !!!

    edit : J'ai réussi à mettre à jour la colonne !

    pour info sur une requête sql

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE CLIENT SET CLIENT.PRENOM = SansAccents([PRENOM]);

  10. #10
    Membre expert
    Avatar de FreeAccess
    Homme Profil pro
    Un monde ou prendre est plus facile qu'apprendre.
    Inscrit en
    Mars 2006
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Un monde ou prendre est plus facile qu'apprendre.

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 745
    Points : 3 834
    Points
    3 834
    Par défaut
    Bonjour,
    ...mais transforme SEMAINES en NOS. Les SEMAINES devraient devenir après traitement SEM
    Tu peux éventuellement utiliser un iif dans ta requête .....
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT REVUE.DUREE,
    IIf(InStr([DUREE],"SEMAINE"),Val([DUREE]) & " SEM",Val([DUREE]) & " NOS") AS NOS_SEM
    FROM REVUE;

    Avec ce jeux de données en exemple.....
    DUREE
    12 NUMÉROS (1 AN)
    24 NUMÉROS (2 ANS)
    10 NUMÉROS (1 AN AVEC CD)
    13 SEMAINES
    108 NUMÉROS
    11 SEMAINES

    tu obtiendras au final......

    NOS_SEM
    12 NOS
    24 NOS
    10 NOS
    13 SEM
    108 NOS
    11 SEM

    Ceci est une possibilité parmi d'autres ...
    FreeAccess
    "Petit à petit l'araignée tisse sa toile"

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

Discussions similaires

  1. Réponses: 15
    Dernier message: 04/10/2011, 14h58
  2. Remplacer caractère dans une chaine de caractères
    Par Baffien dans le forum SAS Base
    Réponses: 3
    Dernier message: 21/10/2009, 18h59
  3. [MySQL] Récupérer une chaine de caractère dans un colonne
    Par djdamage dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 29/07/2009, 15h40
  4. [RegEx] Remplacement et ajout de caractères dans une chaine
    Par Kaldyris dans le forum Langage
    Réponses: 7
    Dernier message: 09/12/2008, 15h02
  5. Réponses: 2
    Dernier message: 31/01/2008, 17h58

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