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 :

Extraire mot ou chiffre à partir d'une chaine de caractères et le mettre dans une autre colonne [AC-2010]


Sujet :

VBA Access

  1. #1
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2014
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Extraire mot ou chiffre à partir d'une chaine de caractères et le mettre dans une autre colonne
    Bonjour,

    Voici ma problématique:
    J'ai un champs contenant une description et j'aimerais pouvoir en extraire certaines informations au lieu de les re-tapper manuellement un par un (J'ai 36000 lignes)

    Ex:
    champs : [desc_ang]-> NELSON IPERCUT SCISSORS STRAIGHT 30.5CM 12"
    champs: [longueur] -> Je voudrais qu'il prenne les caractères devant le "CM", soit 30.5CM comme résultat, et parfois c'est écrit 30.5 CM avec un espace.
    champs: [droit_courbe] -> si il voit "STRAIGHT" dans [descang], il le mets dans le champs [droit_courbe] et même chose pour le "CURVED" et "ANGLED"

    Est-ce que c'est possible de le faire et c'est quoi le code pour y parvenir?
    Je voulais faire des requêtes tous séparer pour simplifier un peu.

    Merci de votre aide.
    Marc

  2. #2
    Membre habitué
    Homme Profil pro
    Data Manager
    Inscrit en
    Octobre 2013
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Data Manager
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 151
    Points : 167
    Points
    167
    Par défaut
    Bonjour,

    Est-ce que les infos droit_courbe et longueur sont toujours à la même place ? Autrement dit, y a-t-il toujours 3 espaces avant l'info droit_courbe et 4 avant l'info longueur ?

    A bientôt
    Laurent

    PS : voici un excellent tuto sur la manipulation de texte avec VBA :
    http://silkyroad.developpez.com/VBA/...racteres/#LI-V

  3. #3
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2014
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Malheureusement non, chaque fournisseurs à sa propre description différente et pas dans le même ordre.
    Parcontre, plusieurs termine par CM à la fin, donc dans ce cas, j'imagine que cela peut ce faire plus facilement?
    ....d'autre vont séparer avec des virgules ", straight, 15cm"

    Dans le future, je vais être amener à uniformiser tout ça et tout séparer par des virgule et mettre les CM à la fin, mais c'est un travail de longue haleine.

  4. #4
    Membre habitué
    Homme Profil pro
    Data Manager
    Inscrit en
    Octobre 2013
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Data Manager
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 151
    Points : 167
    Points
    167
    Par défaut
    Alors voici une solution un peu... bourrine ??? Oui c'est le mot...

    Si on trouve la chaine STRAIGHT dans le champ desc_ang alors on initialise le champ droit_courbe à STRAIGHT.
    Pour la longueur, je découpe le champ desc_ang selon le caractère " " (espace). Je parcours le tableau de résultat à la recherche de CM. Quand la chaine CM est trouvée
    [LIST][*]soit la cellule du tableau contient exactement la chaine CM et dans ce cas, je mets la valeur de la cellule précédente dans la variable longueur[*]soit la cellule du tableau contient CM et autre chose et dans ce cas, je mets le contenu de la cellule moins les 2 derniers caractères dans la variable longueur
    [LIST]

    C'est sans doute à adapter aux cas présentant des virgules, etc...

    Dans les faits.

    J'ai créé une table avec 4 champs :
    • ID
    • desc_ang
    • longueur
    • droit_courbe


    Dans desc_ang j'ai rentré ta proposition NELSON IPERCUT SCISSORS STRAIGHT 30.5CM 12

    Puis j'ai créé un formulaire simple à partir de cette table. Le formulaire reprend les 4 champs. Il faut sans doute rajouter un bouton valider pour mettre à jour l'enregistrement et pour proposer une sortie à l'utilisateur.

    Sur le champ desc_ang, j'ai créé l'événement Sur_Sortie associé au code suivant :
    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 desc_ang_Exit(Cancel As Integer)
     
        Dim Texte As String
        Dim Txt_Coup() As String
        Dim i As Integer
     
        ' Suppression des doubles espaces
        Texte = Trim(Me.desc_ang.Value)
     
        ' On recherche la chaine STRAIGHT dans la variable Texte
        If InStr(Texte, "STRAIGHT") <> 0 Then
            ' Si elle est trouvé (position de début de chaine différente de 0)
            ' alors on affecte la variable longueur à la valeur STRAIGHT
            Me.droit_courbe.Value = "STRAIGHT"
        End If
     
        ' Idem avec toutes les possibilités différentes de STRAIGHT
        ' A developper sur le modèle
        If InStr(Texte, "CURVED") <> 0 Then
            Me.droit_courbe.Value = "CURVED"
        End If
     
        ' On découpe le texte selon le caractère " " (espace)
        Txt_Coup = Split(Texte)
     
        ' Initialisation du compteur à 0
        i = 0
     
        ' Recherche de la cellule du tableau contenant la chaine CM
        ' Tant que la chaine CM n'est pas présente dans la cellule alors la fonction
        ' InStr(Txt_Coup(i), "CM") renvoie 0
        Do
            i = i + 1
        Loop Until InStr(Txt_Coup(i), "CM")
     
        ' i représente le numéro de la cellule contenant CM
     
        ' Si le contenu de la cellule est exactement CM
        If Txt_Coup(i) = "CM" Then
            ' alors on affecte la valeur de la cellule précédente au champ longueur
            Me.longueur.Value = Txt_Coup(i - 1)
        Else
            ' sinon, on initialise la variable longueur avec le contenu de la cellule moins les 2 derniers caractères
            Me.longueur.Value = Mid(Txt_Coup(i), 1, Len(Txt_Coup(i)) - 2)
        End If
     
    End Sub
    Voilà, c'est un 1er jet à adapter à ton cas.

    Et sans aucun doute à améliorer !!!

    A bientôt
    Laurent

  5. #5
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2014
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Un gros Merci Laurent, cela fonctionne!

    Si j'ai déjà des informations dans longueur et/ou droit_courbe et que je ne veux pas les écraser, comment dois-je faire?

    N'y a-t-il pas moyen d'exécuter mes 36000 enregistrement d'un coup, sans avoir à cliquer le bouton pour aller au suivant, en passant par le champs desc_ang et le quitter à chaque fois?

    normalement, j'exécute des requêtes du côté Access seulement et tout est automatique sans formulaire, j'avais jamais vraiment été du côté VBA de access, alors c'est tout nouveau pour moi. (Ma programmation est un peu rouiller, après 13ans)

    Merci et à bientôt,
    Marc

  6. #6
    Membre habitué
    Homme Profil pro
    Data Manager
    Inscrit en
    Octobre 2013
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Data Manager
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 151
    Points : 167
    Points
    167
    Par défaut
    Bonjour,

    Citation Envoyé par Ptimonstre Voir le message
    Si j'ai déjà des informations dans longueur et/ou droit_courbe et que je ne veux pas les écraser, comment dois-je faire?
    Il faut alors concaténer le contenu déjà existant du champ et la partie que tu veux rajouter, grâce à l'opérateur "&".

    Citation Envoyé par Ptimonstre Voir le message
    N'y a-t-il pas moyen d'exécuter mes 36000 enregistrement d'un coup, sans avoir à cliquer le bouton pour aller au suivant, en passant par le champs desc_ang et le quitter à chaque fois?
    Si c'est possible. L'idée est d'ouvrir la table, de parcourir chaque enregistrement de la table en partant du 1er, d'éditer les enregistrements et de modifier les champs qui t'intéressent. Et puis de bien refermer la table parce que tu es poli et qu'on ne laisse pas une table ouverte. Au risque de la voir se transformer en auberge espagnole mais là c'est une autre histoire.
    Donc en fait on va ouvrir un recordset en mode table, on le met en mode édition pour le modifier, on le modifie, on le met à jour puis on le libère. (Oui je sais c'est une redite de ce que je viens de dire...)
    Pour réussir à faire tout ça, je ne saurais que trop conseiller l'excellent tuto "Définition et manipulation de données avec DAO" de Christophe WARRIN. C'est vraiment un document important à lire pour pouvoir travailler un peu avec des données.

    A partir de tout ça, j'ai créé un formulaire dans lequel j'ai mis un bouton (nommé Execute) et rien d'autre. Sur l'événement "Sur clic" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    Option Compare Database
    Option Explicit
     
    Private Sub Execute_Click()
     
        ' Déclaration des variables
        Dim RS As DAO.Recordset
        Dim Texte As String
        Dim Txt_Coup() As String
        Dim i As Integer
     
        ' Ouverture d'un recordset en mode Table sur la table contenant les données
        ' Ici Table1, à modifier...
        Set RS = CurrentDb.OpenRecordset("Table1", dbOpenTable)
     
        ' On se déplace au début du recordset, sur le 1er enregistrement
        RS.MoveFirst
     
        ' On parcourt l'ensemble du recordset (donc dans notre cas de la table Table1)
        ' Tant que la fin du recorset n'a pas été atteinte
        While Not RS.EOF
     
            ' On met le recordset en mode édition de manière à pouvoir modifier l'enregistrement
            RS.Edit
     
            ' Suppression des doubles espaces
            Texte = Trim(RS.Fields("desc_ang").Value)
     
            ' On recherche la chaine STRAIGHT dans la variable Texte
            If InStr(Texte, "STRAIGHT") <> 0 Then
                ' Si elle est trouvée (position de début de chaine différente de 0)
                ' alors on concatène le contenu de la variable "droit_courbe" et la chaine de caractère STRAIGHT
                ' et on met le résultat dans la variable "droit_courbe"
                RS.Fields("droit_courbe").Value = RS.Fields("droit_courbe").Value & " STRAIGHT"
            End If
     
            ' Idem avec toutes les possibilités différentes de STRAIGHT
            ' A developper sur le modèle
            If InStr(Texte, "CURVED") <> 0 Then
                RS.Fields("droit_courbe").Value = RS.Fields("droit_courbe").Value & " CURVED"
            End If
     
            ' On découpe le texte selon le caractère " " (espace)
            Txt_Coup = Split(Texte)
     
            ' Initialisation du compteur à 0
            i = 0
     
            ' Recherche de la cellule du tableau contenant la chaine CM
            ' Tant que la chaine CM n'est pas présente dans la cellule alors la fonction
            ' InStr(Txt_Coup(i), "CM") renvoie 0
            Do
                i = i + 1
            Loop Until InStr(Txt_Coup(i), "CM")
     
            ' i représente le numéro de la cellule contenant CM
     
            ' Si le contenu de la cellule est exactement CM
            If Txt_Coup(i) = "CM" Then
                ' alors on concatène le contenu de la variable longueur et la valeur de la cellule précédente
                ' et on met le résultat dans la variable "longueur"
                RS.Fields("longueur").Value = RS.Fields("longueur").Value & " " & Txt_Coup(i - 1)
            Else
                ' sinon, on concatène le contenu de la variable longueur et le contenu de la cellule moins les 2 derniers caractères
                ' et on met le résultat dans la variable "longueur"
                RS.Fields("longueur").Value = RS.Fields("longueur").Value & " " & Mid(Txt_Coup(i), 1, Len(Txt_Coup(i)) - 2)
            End If
     
            ' Mise à jour du recordset
            RS.Update
     
            ' On passe à l'enregistrement suivant
            RS.MoveNext
     
        Wend
     
        ' On libère les objets
        RS.Close
        Set RS = Nothing
     
    End Sub
    Voilà... Par contre c'est toujours aussi bourrin...

    Bonne journée
    Laurent

    PS : si le problème est résolu, ne pas oublier de l'indiquer. Et penser à voter pour les réponses qui ont aidé...

  7. #7
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2014
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    C'est fait, encore merci Laurent pour ton aide, ça me replonge dans la programmation de VB et je vais me débrouiller pour la suite.

    Cette BD de 36000lignes était seulement pour les produits qui vont s'afficher sur notre futur nouveau site web. En fait, la BD à plus de 235000 produits!!

    C'est pour cela que je voulais en extraire les données de la description pour les mettre dans les colonnes attributs associé et alléger la charge de travail manuelle qui est faramineuse.

    Bonne fin de journée,
    Marc

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 23/12/2013, 16h40
  2. Réponses: 5
    Dernier message: 22/04/2009, 14h38
  3. recherche de mots dans une chaine de caractères
    Par jeanfrancois dans le forum Langage
    Réponses: 5
    Dernier message: 10/02/2006, 10h47
  4. Réponses: 2
    Dernier message: 05/01/2006, 13h15
  5. Remplacer dans une chaine de caractères à partir de la fin
    Par daddyel dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 02/01/2006, 11h31

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