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 :

Extraction de données d'une chaine de caractères


Sujet :

VBA Access

  1. #1
    Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2018
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2018
    Messages : 125
    Points : 61
    Points
    61
    Par défaut Extraction de données d'une chaine de caractères
    Bonjour à toutes et tous.
    J'ai une table avec des chaine de caractère. Je voudrais extraire c'est donner séparément grâce à une requête afin d'obtenir dans cette requete la partie droite de mon tableau excel.
    Donc si plus de 2 "espaces" je sépare. si un seul espace, laisse comme tel.
    Pour la première information "Service" j'y arrive avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Service: Gauche([Origine];DansChaîne([Origine];" ")-1)
    Il peut y avoir aussi Service mais sans Domaine et Activités
    Mais pour le reste je suis bloqué.
    Nom : Capture d’écran 2023-11-14 150234.jpg
Affichages : 134
Taille : 56,6 Ko

    Merci d'avance pour votre aide.

  2. #2
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    2 850
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 850
    Points : 4 695
    Points
    4 695
    Par défaut
    La fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     split(chaine1, separareur1)
    décompose la chaine chaine1 en un tableau de chaines selon le séparateur1.
    ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim sArr1 As Variant, i as integer
     
     sArr1 = Split( "la lune  est  belle" , "  ")      ' séparateur = 2 espaces
    For i = 0 To UBound(sArr1)
                Debug.Print  Trim(sArr1(i)) 
       Next i
    "Always look at the bright side of life." Monty Python.

  3. #3
    Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2018
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2018
    Messages : 125
    Points : 61
    Points
    61
    Par défaut
    Merci pour la réponse, par contre comment je l’intègre dans une requête?

  4. #4
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    2 850
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 850
    Points : 4 695
    Points
    4 695
    Par défaut
    Pour ça, il faut passer par du VBA.
    La procédure comme celle ci-dessous devrait le faire :
    (je n'ai pas testé ; tu adaptes à tes noms de variables)

    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
     
    ' A mettre dans un module standard
     
    Public sub TranfertTables()
    ' Tranfert d'une colonne d'une table T_origine (Origine) dans 3 colonnes de la table T_final (Service, Domaine, Activites)
    dim db1 as DAO.database, rs1 as DAO.recordset, rs2 as DAO.recordset
    Dim sArr1 As Variant, i as integer, strSql as string
    set DB1 = currentdb
    ' on ouvre un recorset sur la table origine
    set rs1= db1.openrecordset("T_origine")
     
    ' on vide la table T_final
    strSql= "DELETE * FROM T_final"
    db1.execute strsql
    ' on ouvre un recorset sur la table cible
    Set rs2 = db1.openrecordset("T_final")
     
    ' On boucle sur le recorset origine
    rs1.movelast
    rs1.movefirst
    while not rs1.EOF
        sArr1 = Split( rs1!origine , "  ")       ' ici, le séparateur est composé de 2 espaces
        rs2.addnew
        For i = 0 To UBound(sArr1)
              '  UBound(sArr1) est <= 3
                Debug.Print  Trim(sArr1(i)) 
                if i=0 then rs2!Service=  Trim(sArr1(i)) 
                if i=1 then rs2!domaine=  Trim(sArr1(i)) 
                if i=2 then rs2!activites=  Trim(sArr1(i))    ' personnellement, je ne mets jamais d'accent dans mes noms de variables
        Next i
        rs2.update
        rs1.movenext
    wend
     
    msgbox "Traitement terminé"
    end sub
    "Always look at the bright side of life." Monty Python.

  5. #5
    Membre éprouvé
    Homme Profil pro
    Développeur .net - Office - Quadiant
    Inscrit en
    Février 2020
    Messages
    558
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Développeur .net - Office - Quadiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2020
    Messages : 558
    Points : 1 029
    Points
    1 029
    Par défaut
    Bonjour,

    Une autre solution, c'est mettre cette fonction dans un module

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Public Function Extract(strChamp As String, bytPosition As Byte)
     
        Dim strTab() As String ' on créer un tableau
        strTab = Split(strChamp, "  ") ' on split la chaine à condition que l'on ait toujours 2 espaces
        If (bytPosition - 1) <= UBound(strTab()) Then
            Extract = strTab(bytPosition - 1)
        End If
    End Function
    Et utiliser celle-ci dans ta requête de cette manière


    Nom : Image1.png
Affichages : 97
Taille : 16,4 Ko

    ONTAYG

  6. #6
    Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2018
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2018
    Messages : 125
    Points : 61
    Points
    61
    Par défaut
    Merci, je test demain.

  7. #7
    Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2018
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2018
    Messages : 125
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par micniv Voir le message
    Pour ça, il faut passer par du VBA.
    La procédure comme celle ci-dessous devrait le faire :
    (je n'ai pas testé ; tu adaptes à tes noms de variables)

    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
    ' A mettre dans un module standard
    
    Public sub TranfertTables()
    ' Tranfert d'une colonne d'une table T_origine (Origine) dans 3 colonnes de la table T_final (Service, Domaine, Activites)
    dim db1 as DAO.database, rs1 as DAO.recordset, rs2 as DAO.recordset
    Dim sArr1 As Variant, i as integer, strSql as string
    set DB1 = currentdb
    ' on ouvre un recorset sur la table origine
    set rs1= db1.openrecordset("T_origine")
    
    ' on vide la table T_final
    strSql= "DELETE * FROM T_final"
    db1.execute strsql
    ' on ouvre un recorset sur la table cible
    Set rs2 = db1.openrecordset("T_final")
    
    ' On boucle sur le recorset origine
    rs1.movelast
    rs1.movefirst
    while not rs1.EOF
        sArr1 = Split( rs1!origine , "  ")       ' ici, le séparateur est composé de 2 espaces
        rs2.add
        For i = 0 To UBound(sArr1)
              '  UBound(sArr1) est <= 3
                Debug.Print  Trim(sArr1(i)) 
                if i=1 then rs2!Service=  Trim(sArr1(i)) 
                if i=2 then rs2!domaine=  Trim(sArr1(i)) 
                if i=3 then rs2!activites=  Trim(sArr1(i))    ' personnellement, je ne mets jamais d'accent dans mes noms de variables
        Next i
        rs2.update
        rs1.movenext
    wend
    
    msgbox "Traitement terminé"
    end sub
    Cela ne fonction pas. ça bug sur la ligne rs2.add (souligné) Message: "Membre de méthode ou de données introuvable"

  8. #8
    Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2018
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2018
    Messages : 125
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par ONTAYG Voir le message
    Bonjour,

    Une autre solution, c'est mettre cette fonction dans un module

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Public Function Extract(strChamp As String, bytPosition As Byte)
     
        Dim strTab() As String ' on créer un tableau
        strTab = Split(strChamp, "  ") ' on split la chaine à condition que l'on ait toujours 2 espaces
        If (bytPosition - 1) <= UBound(strTab()) Then
            Extract = strTab(bytPosition - 1)
        End If
    End Function
    Et utiliser celle-ci dans ta requête de cette manière


    Nom : Image1.png
Affichages : 97
Taille : 16,4 Ko

    ONTAYG
    Il y a un petit problème, cela ne fonctionne que pour la colonne "Service". Les deux autres colonnes sont vide.
    As tu une solution?

  9. #9
    Membre éprouvé
    Homme Profil pro
    Développeur .net - Office - Quadiant
    Inscrit en
    Février 2020
    Messages
    558
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Développeur .net - Office - Quadiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2020
    Messages : 558
    Points : 1 029
    Points
    1 029
    Par défaut
    Bonjour,

    J'ai testé avec une table chez moi pas de soucis.

    Es-tu sûr des doubles espaces comme séparateur partout ?

    ONTAYG

  10. #10
    Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2018
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2018
    Messages : 125
    Points : 61
    Points
    61
    Par défaut
    Attention, j'avais noté s"Si plus de 2 espaces"

  11. #11
    Membre éprouvé
    Homme Profil pro
    Développeur .net - Office - Quadiant
    Inscrit en
    Février 2020
    Messages
    558
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Développeur .net - Office - Quadiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2020
    Messages : 558
    Points : 1 029
    Points
    1 029
    Par défaut
    Re

    Je n'ai pas trop de temps aujourd'hui,

    Donc à l'arrache en utilisant la fonction Replace.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Public Function Extract(strChamp As String, bytPosition As Byte)
     
        strChamp = Replace(strChamp, "   ", "  ")
        strChamp = Replace(strChamp, "    ", "  ")
     
     
        Dim strTab() As String ' on créer un tableau
        strTab = Split(strChamp, "  ")
        If (bytPosition - 1) <= UBound(strTab()) Then
            Extract = strTab(bytPosition - 1)
        End If
    End Function
    ONTAYG

  12. #12
    Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2018
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2018
    Messages : 125
    Points : 61
    Points
    61
    Par défaut
    Merci pour ton aide.
    Donc je viens d'essayer, cela fonctionne uniquement si le service à 3 caractères, si il en a que 2, cela ne fonctionne pas.
    Si 2 caractère dans "Service", case "Domaine vide" et "Activité" devient "Domaine" en valeur.
    J'ai donc modifier pour rechercher 3 "espaces" au lieu de 2, et...
    CELA FONCTIONNE!!!

    Merci beaucoup pour ton aide.

  13. #13
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    2 850
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 850
    Points : 4 695
    Points
    4 695
    Par défaut
    Cela ne fonction pas. ça bug sur la ligne rs2.add (souligné) Message: "Membre de méthode ou de données introuvable"
    J'ai corrigé et testé le code ci-dessus.
    Bon WE
    "Always look at the bright side of life." Monty Python.

Discussions similaires

  1. Réponses: 6
    Dernier message: 02/08/2017, 17h44
  2. extraction de données dans une chaine
    Par yag00 dans le forum Langage
    Réponses: 2
    Dernier message: 08/08/2008, 15h03
  3. Réponses: 3
    Dernier message: 01/08/2008, 10h58
  4. Réponses: 10
    Dernier message: 20/02/2008, 12h57
  5. extraction d'une donnée d'une chaine de caractères.
    Par LESOLEIL dans le forum Langage
    Réponses: 10
    Dernier message: 20/04/2006, 13h00

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