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 :

Comment coller un contenu identique à toute une colonne affichée ?


Sujet :

Access

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 34
    Points : 19
    Points
    19
    Par défaut Comment coller un contenu identique à toute une colonne affichée ?
    Bonjour,

    Je suis débutant en access. Dans le cadre de mon travail, j'ai récupéré une base de donnée access (15 000 lignes !) que je cherche à moderniser. Il s'agit d'une base d'adresse postale avec des champs écrits plus ou moins n'importe comment au fil du temps. Par exemple "Boulevard de la République" est écrit parfois avec un accent, parfois sans, parfois avec une faute, parfois avec un espace parasite ou des mots collés... Alors qu'il devrait être écrit sous une forme officielle "REPUBLIQUE, BD DE LA".
    Aucun traitement automatisé n'est possible, il va falloir tout refaire manuellement.

    Dans un premier temps, je vais appliquer un filtre sur le champ "adresse", de façon à ce que toutes les adresses d'une voie en particulier s'affichent.

    J'ai créé un nouveau champ "adresse 2" dans lequel je vais écrire manuellement le nom de la voie tel qu'il aurait toujours du être écrit.

    Jusque là c'est simple. Mais je voudrais ne pas retaper le nom plusieurs fois. Exemple, je fais un filtre sur le champs "adresse" en utilisant "république", j'ai environ 300 lignes qui s'affichent, car il y a 300 adresses au boulevard de la république. Comment dire à Access de remplir tous les champs "adresse 2" par "REPUBLIQUE, BD DE LA" sans me taper 299 copier/coller ?

    J'ai cherché longtemps sur Internet, j'ai trouvé un script VBA sur un forum anglais (http://www.utteraccess.com/forum/ind...wtopic=1210991) qui fonctionne - mais il remplit TOUS les champs "adresse 2" de la table, pas uniquement ceux qui sont affichés à l'écran avec le filtre !

    Avez-vous une idée ?

    Comment "coller" un contenu à toute une colonne affichée à l'écran ?

    Merci beaucoup !

    PS : il ne s'agit pas d'une base commerciale, je travaille dans une mairie ;-)

  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 598
    Points
    24 598
    Par défaut
    Bonjour,

    Les traitements par lots (ou de masse) se font à 99% avec des requêtes. L'utilisation de VBA pour ce genre de manip s'applique à des cas très spécifiques. Le tien ne semble pas en faire parti.

    Dans un premier temps commence par une requête de sélection affichant le champ à traiter.

    Pour filtrer les enregistrements concernés utilises l'opérateur Like, tu remarqueras qu'avec quelques jokers tu récupèreras l'ensemble de enregistrement à traiter. (cf mon tuto sur Like).

    Tu peux ajouter plusieurs filtres dans la même requête en les plaçant dans la colonne du champ à traiter.

    Une fois que tu as l'ensemble des enregistrements concernés affichés, transforme ta requête en Requête Mise à jour (un simple clic dans le ruban suffit).

    Un nouvelle ligne s'affiche, indiques-y le texte de remplacement. Tu n'as plus qu'à cliquer sur le point d'exclamation rouge.
    Nom : 2017-03-23_23h18_09.png
Affichages : 3184
Taille : 3,7 Ko
    Pour traiter un autre jeu tu modifies simplement les filtres et le texte de remplacement.

    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
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 34
    Points : 19
    Points
    19
    Par défaut
    Merci pour cette réponse rapide.

    Like, je suppose que c'est du VBA ?

    Sinon, le soucis de ce genre de requête, c'est que plus une sorte de "rechercher/remplacer", ça ne copie pas les données dans un nouveau champ.
    Je suppose que je peux tout simplement copier/coller mes données un une fois (du champs adresse vers adresse2) puis travailler sur la colonne copiée.

    J'essayerai demain au bureau.
    Merci !

  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 598
    Points
    24 598
    Par défaut
    Si a chaque occurrence de bld, boulevard, bd trouvé dans un champ tu veux renseigner un autre champ c'est le même type de requête qu'il faut utiliser.

    Like, je suppose que c'est du VBA ?
    Toi tu n'as pas regardé/lu/parcouru le tuto.

    C'est un opérateur commun SQL et VBA comme l'ensemble des autres opérateurs.

    Une requête fait le traitement que tu lui demande, si tu veux qu'elle fasse de l'insertion, du copier/coller, du recherche/remplace elle le fera.

    A noter que l'algo que tu a posté fait la même chose qu'une requête Update mais en plus lent.
    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
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 34
    Points : 19
    Points
    19
    Par défaut
    Bonjour,

    J'ai essayé au bureau, mais je n'ai pas réussi.

    J'ai essayé de créer une requête mise à jour, en utilisant comme critère comme "*xxxxx*" sur le champs adresse1.
    Je peux mettre à jour le champs adresse1 en remplissant "mise à jour", mais ce que je veux, c'est mettre à jour le champ "adresse 2" qui lui, est vide.

    Je précise que je ne peux pas copier le champs adresse 1 de adresse 2 car adresse 2 est une liste de choix et non un texte court et donc un copier/coller plante (logique)...

    Désolé si je parais un peut lourd. En principe, je m'y connais bien en informatique : avec Excel, j'ai réussi à faire du VBA en quelques heures, mais avec access j'ai beaucoup plus de mal !!

    Il n'y a pas un moyen plus simple ??
    Nom : ScreenShot001.jpg
Affichages : 3157
Taille : 176,7 Ko


    Merci par avance,

  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 598
    Points
    24 598
    Par défaut
    c'est mettre à jour le champ "adresse 2" qui lui, est vide.

    Je précise que je ne peux pas copier le champs adresse 1 de adresse 2 car adresse 2 est une liste de choix et non un texte court et donc un copier/coller plante (logique)...
    tu peux me la refaire parce que j'ai relu 3 fois la phrase sans comprendre.
    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
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 34
    Points : 19
    Points
    19
    Par défaut
    Bonjour Loufab,

    Dans mon précédent post, je te disais que pour résoudre une partie de mon problème, j'allais copier le contenu du champ "adresse" (la colonne entière) dans la colonne "adresse 2", par un simple copier/coller. Je pouvais directement "travailler" sur adresse2, qui actuellement est vide.
    C'était plus simple pour moi, car je ne maitrise pas trop les requêtes.
    Or, cela est impossible car le champs adresse2 est une liste de choix et le copier/coller ne fonctionne pas.

    Récapitulons mon problème :
    - j'ai un champs "adresse" (il s'appelle "adresse du terrain" en vrai, cf photo d'écran), c'est un "texte court" rempli de données écrites un peu n'importe comment

    - un champs "adresse2" (il s'appelle "NOM_VOIE" en vrai, cf ma photo d'écran) qui est une liste de choix. La liste de choix comprend la liste, avec le formatage officiel, de toutes les voies de ma commune. Mais ce champs est vide. Je viens de le créer, personne n'a saisi de données.

    - je mets un filtre sur "adresse" de manière à afficher une liste d'adresse correspondant à une voie.

    Nom : ScreenShot001.jpg
Affichages : 3147
Taille : 62,4 Ko

    - dans le champs "adresse2" (actuellement vide) de la première ligne, je sélectionne manuellement le nom de la voie correspondante dans la liste

    Nom : ScreenShot002.jpg
Affichages : 3142
Taille : 69,1 Ko
    Nom : ScreenShot003.jpg
Affichages : 3137
Taille : 139,9 Ko

    - pour éviter de recommencer l'opération pour chaque ligne (qui correspondent à chaque numéro d'une voie), comment faire ?
    Ici, je peux faire un copier/coller, c'est possible... Mais parfois je peux avoir 300-500 copier/coller à faire !

    Nom : ScreenShot004.jpg
Affichages : 3142
Taille : 94,8 Ko

    Si vous avez une idée, je suis preneur !

    Merci !

  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 598
    Points
    24 598
    Par défaut
    Bonjour,
    Je n'utilise que très rarement les listes dans les tables, leur utilisation pose trop de contraintes et casses-tête techniques dans la suite d'un développement.

    Ta liste est issue d'une autre table ?

    Dans ce cas supprime la liaison de la table. Tu pourras ainsi utiliser cette table annexe soit directement avec la valeur détectée (détection/copie de valeur d'une table à l'autre), soit plus simplement en créant une relation classique à base de clefs numérique.

    Voici un code qui copie une valeur d'une table dans le champ1 d'une autre si une valeur est trouvée dans le champ2.

    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 recopie()
    Dim db As DAO.Database
    Dim rstS As DAO.Recordset
     
    Set db = CurrentDb
    Set rstS = db.OpenRecordset("SELECT * FROM TableRef", dbOpenSnapshot)  'ta table contenant les valeur de référence à copier
     
    While Not rstS.EOF  'on la parcours enrg. par enrg.
     
    'A chaque enregistrement 
    'on cherche la correspondance dans la table à traiter et on traite tous les champs
    db.Execute "UPDATE tclient SET nouveauChampVide = """ & rstS.Fields("champRef").Value & """ WHERE ancienneChampRenseigné like ""*" & rstS.Fields("champRef").Value & "*"" ;"
     
    'on passe à la référence suivante
    rstS.MoveNext
     
    Wend
     
    End Function
    Ta liste n'est pas issue d'un table. là c'est le casse-tête.

    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
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 34
    Points : 19
    Points
    19
    Par défaut
    Bonjour,
    Merci pour le code. Je n'ai pas vraiment compris à quoi il servait, mais je l'ai essayé.

    J'ai supprimé la liaison avec la table "voies", puisque bien entendu le contenu de la liste de choix provient bien d'une autre table.

    J'ai recopié le code en tant que module VBA, modifié TableRef et ChampRef (2x), mais j'ai une erreur d'exécution 3265 (élément non trouvé dans cette collection). Le debug surligne cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    db.Execute "UPDATE tclient SET nouveauChampVide = """ & rstS.Fields("NOM_VOIE").Value & """ WHERE ancienneChampRenseigné like ""*" & rstS.Fields("NOM_VOIE").Value & "*"" ;"
    Ai-je fait une erreur ?

    Merci à toi

  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 598
    Points
    24 598
    Par défaut
    nouveauchampvide et ancienchamprenseigné sont des champs de ta table.

    tclient est la table dans laquelle tu opères.
    nouveauchampvide est le champ dans lequel tu veux écrire.
    ancienchamprenseigné est le champ qui contient ce que tu dois rechercher.
    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

Discussions similaires

  1. Réponses: 4
    Dernier message: 26/10/2016, 22h23
  2. Réponses: 2
    Dernier message: 17/04/2013, 13h00
  3. [PHPExcel] Comment définir la largeur de toute une colonne ?
    Par flashphp dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 26/05/2009, 18h36
  4. [VBA-E]test sur le contenu de toute une ligne
    Par repié dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 23/02/2006, 16h00
  5. UPADTE de toute une colonne
    Par jexl dans le forum ASP
    Réponses: 2
    Dernier message: 14/12/2004, 12h11

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