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

IHM Discussion :

[Access2-VBA][Débutante]Recherche et suppression de Chaînes de caractères


Sujet :

IHM

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2006
    Messages : 54
    Points : 36
    Points
    36
    Par défaut [Access2-VBA][Débutante]Recherche et suppression de Chaînes de caractères
    Bonjour,

    je travaille sur des tables provenant d'un logiciel anciennement utilisé par l'établissement! Dans un premier temps, je nettoye les données de ces tables afin de concevoir par la suite une base de données unique!

    J'ai une table qui contient 6 champs dont le champ "prenom" sur lequel j'ai déjà effectué de nombreuses modifications !

    J'ai lu la FAQ et je ne trouve pas de solution à mon problème (certainement très simple pour vous)
    En gros, je souhaite supprimer toutes les parenthèses et leur contenu,
    ex : "toto (né en 1981)" devient "toto"

    Sachant que la parenthèse fermante ne se trouve pas toujours à la fin de ma chaîne et que le nombre de caractères entre parenthèses varie!!!

    J'ai lu plusieurs choses sur les fonctions Replace, InStr ou encore Split mais je ne vois pas comment supprimer le contenu des parenthèses!

    Merci d'avance pour votre aide

  2. #2
    Membre éclairé Avatar de stéphane_ais2
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 792
    Points : 891
    Points
    891
    Par défaut
    Bonjour,

    Je te conseille de regarder ce tutoriel :
    http://cafeine.developpez.com/access/tutoriel/regexp/

    car les fonctions de manipulation de chaines de caractère vont vite trouver leurs limites si l'on tient compte des possibilités de saisies que tu décries...

    SE
    Si le monde explose, la dernière voix audible sera celle d’un expert, disant que la chose est impossible. - P. Ustinov

  3. #3
    Membre régulier

    Inscrit en
    Août 2005
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 102
    Points : 119
    Points
    119
    Par défaut
    Si tu as seulement besoin de nettoyer une (ou des) table existante une fois pour toutes, tu n'as pas besoin de VBA : utilise simplement la boite de dialogue Remplacer (Ctrl+H) en plusieurs étapes:
    1.Prends comme paramètres:
    Rechercher : (*) [avec une espace avant la première parenthèse]
    Remplacer par : [laisse la case vide]

    Ca va déjà retirer toutes les parenthèses (en supposant que toutes les parenthèses sont fermées ! Pour celles qui ne le sont pas, mieux vaut les vérifier une par une pour être sûr) et aussi l'espace qui les précède pour que tu ne te retrouves pas avec deux espaces à la suite.

    2. Refais la même chose mais sans l'espace avant (*) pour retirer les parenthèses qui étaient collées au mot précédent.
    Attention, ne fais pas l'étape 2 avant l'étape 1.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2006
    Messages : 54
    Points : 36
    Points
    36
    Par défaut
    Bonjour,

    Merci à vous deux!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Si tu as seulement besoin de nettoyer une (ou des) table existante une fois pour toutes, tu n'as pas besoin de VBA
    En fait, Meduse, je travaille sur plusieurs secteurs et plusieurs années, et je pense que le temps me manquera pour terminer ma mission, je préfère donc automatiser mes modifications avec du code!! De sorte que si un stagiaire prend la suite l'année prochaine, il puisse réutiliser mon travail!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Pour celles qui ne le sont pas, mieux vaut les vérifier une par une pour être sûr) et aussi l'espace qui les précède pour que tu ne te retrouves pas avec deux espaces à la suite.
    Les vérifier une par une me prendrait trop de temps (25 tables de 10000 lignes pour le moment)! Concernant les espaces, il n'y en a plus, je les ai tous supprimés!!!

    Sinon Stéphane_ais2, merci pour le lien mais j'ai déjà regardé ce tutoriel! Et je t'avoue que ça ne me parle pas trop (grande débutante)! Mais je m'y remets aussitôt, peut-être que...?

    Je vous tiendrai au courant!

    Salut,

    Céline

  5. #5
    Membre chevronné Avatar de guigui5931
    Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2006
    Messages
    1 667
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 667
    Points : 2 232
    Points
    2 232
    Par défaut
    Sinon ce que tu peut faire c'est pour tous les champs utiliser la fonction Replace (qui remplace un caractère par un autre)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Dim chaine as String, record as recordSet, maj as String
    chaine="SELECT cle,prenom FROM uneTable "
    Set record=currentDb.openRecordSet(chaine)
    while not (record.EOF)
           maj="UPDATE uneTable SET prenom='" & Replace(record![prenom],"(","") & "' WHERE cle=" & record![cle]
           Docmd.runsql(maj)
           record.next
    wend
    Jte recommende de le tester sur une table bidon mais normalement çà doit marcher en remplaçant uneTable par le nom de la table et cle par le nom de la colonne cle
    autant l'hiver éclate que l'hétéroclite
    le vrai geek c'est celui qui croit qu'il y a 1024 mètres dans un kilomètre

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2006
    Messages : 54
    Points : 36
    Points
    36
    Par défaut
    Bonjour guigui5931,

    J'ai regardé ton code, mais j'ai l'impression qu'il ne fait que supprimer la parenthèse ouvrante? Ou ai-je mal compris?
    Ex : "Toto(néen1981)" ----> "Toto"

    Je précise également que toutes les cellules de mon champ "prenom" ne contiennent pas de parenthèses!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE uneTable SET prenom='" & Replace(record![prenom],"(","") & "' WHERE cle=" & record![cle]
    Ce que je comprends, c'est que l'on remplace la parenthèse ouvrante par rien dans le champ "prenom"
    Mais ça, je ne vois pas ce que ça fait!
    Je comprends pourtant le fonctionnement d'un recordset!!!

  7. #7
    Membre chevronné Avatar de guigui5931
    Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2006
    Messages
    1 667
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 667
    Points : 2 232
    Points
    2 232
    Par défaut
    Exact il ne supprime pas la parenthèse fermante
    En fait dans le recordSet on met toute les enregistrement et ensuite on les réinsère avec le UPDATE en faisant la modifiation sur le prénom ki été dans la table.
    La fonction Replace recherche un caractère et le remplace par un autre, donc si elle ne le trouve pas elle ne fait rien.
    En fet il faudré faire tourner ce code 2fois pour chaque table, une fois avec ( et une fois avec )

    J'espère que j'ai pu t'aider un peu
    autant l'hiver éclate que l'hétéroclite
    le vrai geek c'est celui qui croit qu'il y a 1024 mètres dans un kilomètre

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2006
    Messages : 54
    Points : 36
    Points
    36
    Par défaut
    Et pour effacer également le contenu des parenthèses, tu as une petite idée?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Ex : "Toto(néen1981)" ----> "Toto"

  9. #9
    Membre chevronné Avatar de guigui5931
    Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2006
    Messages
    1 667
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 667
    Points : 2 232
    Points
    2 232
    Par défaut
    Tu peut peut être essayer dans le fontion Replace de mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Replace (Replace (record![prenom],"(*)","")
    mais je sais pas si ça marche,
    autant l'hiver éclate que l'hétéroclite
    le vrai geek c'est celui qui croit qu'il y a 1024 mètres dans un kilomètre

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2006
    Messages : 54
    Points : 36
    Points
    36
    Par défaut
    Je vais essayer! ça ressemble bizzarement (*) aux expressions rationnelles en VBA! Je n'ai plus qu'à m'y mettre!

    En tout cas, merci à vous 3!!!
    A bientôt

  11. #11
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 23
    Points : 14
    Points
    14
    Par défaut
    bonjour,

    j'ai eu un travail a faire un peu similaire au tien sur des chaines de caracteres et pour ma part j'ai utilise les fonctions instr et mid.
    la fonction instr([start], string1, string2) te renvoie la position de la chaine string2 dans la chaine string1.
    Cela te permet de trouver la position de ta parenthese ouvrante. Ensuite, tu n'a plus qu' a utiliser la fonction mid pour virer ce qui est entre parentheses

    bonne chance

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2006
    Messages : 54
    Points : 36
    Points
    36
    Par défaut
    Me revoilà!!

    Rappel : Certaines lignes du champ "Prenom" (de ma table "IdentificationSecteur") contiennent des informations entre parenthèses, je souhaite supprimer les parenthèses et leur contenu quand elles existent!

    Voici le code que j'ai tapé à l'aide des fonctions InStr et Left, soyez compréhensifs, je débute :

    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
    Sub SupprParentheses()
    
    Dim db As DAO.Database
    Dim tbl As DAO.TableDef
    Dim rst As DAO.Recordset
    Dim fld As DAO.Field
    
    Dim NomTable As String
    Dim NewFld As String
    Dim OldFld As String
    Dim MyPos As Integer
    
    Set db = CurrentDb
    
    NomTable = "IdentificationSecteur"
    OldFld = "Prenom"
    NewFld = "PrenomSansParentheses"
    
    Set rst = db.OpenRecordset(NomTable, DB_OPEN_TABLE)
    
    rst.MoveFirst
    While Not rst.EOF
      rst.Edit
    
    MyPos = InStr(rst.Fields(OldFld), "(")
      
      If MyPos <> 0 Then
         rst.Fields(NewFld) = Left(rst.Fields(OldFld), MyPos - 1)
      End If
      rst.Update
      rst.MoveNext
    Wend
    
    'Libère les variables
    db.Close
    
    Set fld = Nothing
    Set tbl = Nothing
    Set db = Nothing
    Set rst = Nothing
    
    End Sub

    J'obtiens un message d'erreur : "Utilisation incorrecte de Null" correspondant à la ligne en rouge ci-dessus!
    N'hésitez pas à me faire part de vos remarques sur ce code.

    Merci

  13. #13
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 23
    Points : 14
    Points
    14
    Par défaut
    regarde si la valeur de rst.Fields(OldFld) n'est pas NULL a un moment.
    la fonction instr renvoie NULL si une des chaines est NULL. Ce qui pose probleme dans ton cas si tu essaie d'affecter NULL a un integer (ta variable MyPos).

    met un test avant la fonction instr pour voir si rst.Fields(OldFld) n'est pas NULL

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2006
    Messages : 54
    Points : 36
    Points
    36
    Par défaut
    Oui en effet, mon champ "prenom" possède des cellules vides!
    Que faire dans ce cas?

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2006
    Messages : 54
    Points : 36
    Points
    36
    Par défaut
    Peut-être rajouter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If Not IsNull (rst.Fields(OldFld)) then
             MyPos = InStr(rst.Fields(OldFld), "(")
    Else MyPos = 0
    Si j'ai bien compris ton explication?

  16. #16
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     Gauche([montexte];DansChaîne([montexte];"(")-1) & Droite([montexte];NbCar([montexte])-DansChaîne([montexte];")"))
    Elle est pas belle la vie ?

  17. #17
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 10
    Points : 10
    Points
    10
    Par défaut
    Salut,

    J'ai un peu parcouru ton PB, je pense que tu devrais utiliser VBA avec pour chaque champ de ta table. Utilise les fonctions de Vb qui sont
    Instr qui te permet de trouver un caractère dans une chaine
    Mid$ qui te permet de prendre un caractere ou chaine dans une chaine.

    Moi je les utilise souvent et ca marche.

    bon courage

  18. #18
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2006
    Messages : 54
    Points : 36
    Points
    36
    Par défaut
    Désolée de ne pas avoir répondu plus tôt, me voilà revenue sur mon lieu de stage!!! Après une ou deux petites modif, mon code 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
    46
    47
    Sub SupprParentheses()
     
    Dim db As DAO.Database
    Dim tbl As DAO.TableDef
    Dim rst As DAO.Recordset
    Dim fld As DAO.Field
     
    Dim NomTable As String
    Dim NewFld As String
    Dim OldFld As String
    Dim MyPos As Integer
     
    Set db = CurrentDb
     
    NomTable = "IdentificationSecteur"
    OldFld = "PrenomSE"
    NewFld = "PrenomSansParentheses"
     
    Set rst = db.OpenRecordset(NomTable, DB_OPEN_TABLE)
     
    rst.MoveFirst
    While Not rst.EOF
     
      rst.Edit
      If Not IsNull(rst.Fields(OldFld)) Then
             MyPos = InStr(rst.Fields(OldFld), "(")
    Else: MyPos = 0
      End If
     
      If MyPos <> 0 Then
         rst.Fields(NewFld) = Left(rst.Fields(OldFld), MyPos - 1)
         Else: rst.Fields(NewFld) = rst.Fields(OldFld)
      End If
     
      rst.Update
      rst.MoveNext
    Wend
     
    'Libère les variables
    db.Close
     
    Set fld = Nothing
    Set tbl = Nothing
    Set db = Nothing
    Set rst = Nothing
     
    End Sub
    Je viens de voir ton code Random! En effet, je suis tout compte fait partie du principe que la parenthèse fermante était en fin de chaîne (cas le plus fréquent dans mes tables)! Mais je vais le modifier!

    Je suis consciente que ce code demande à être amélioré (je ne sais plus trop mais il n'y a pas une histoire de complexité? Nb de fois où la boucle est parcourue??? ), n'hésitez pas à me faire part de vos remarques!

    En tout cas, un grand merci à tous!!!

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

Discussions similaires

  1. [Débutant] Programme qui affiche des chaînes de caractère
    Par funy16 dans le forum Débuter avec Java
    Réponses: 8
    Dernier message: 04/11/2009, 09h44
  2. Recherche URL dans grande chaîne de caractères.
    Par Le Mad dans le forum Développement
    Réponses: 4
    Dernier message: 10/03/2009, 15h20
  3. [Débutant] Parser et réordonner une chaîne de caractères
    Par Ykaar dans le forum Windows Forms
    Réponses: 6
    Dernier message: 02/06/2007, 12h51
  4. Suppression de chaînes de caractères
    Par Furius dans le forum Windows
    Réponses: 24
    Dernier message: 03/11/2005, 15h30
  5. Réponses: 6
    Dernier message: 11/10/2004, 15h43

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