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 :

ACCESS Répartir le contenu d'une cellule sur plusieurs lignes [AC-2010]


Sujet :

VBA Access

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2013
    Messages : 30
    Points : 17
    Points
    17
    Par défaut ACCESS Répartir le contenu d'une cellule sur plusieurs lignes
    • Contexte de ma base de données :

      Dans une table Access, j'ai une colonne qui contient plusieurs données avec séparateurs ";"
      Je souhaiterais éclater ces données, non pas sur les colonnes adjacentes mais sur des lignes adjacentes.
      Je désespère de trouver la solution à mon problème

      J'ai trouvé une réponse qui répond au problème mais sur Excel => https://www.developpez.net/forums/d1...sieurs-lignes/


      Table Initiale

      USER1 NULL
      USER2 PACIFICA; RAN; RAN_SAISIE; RAN_SSE_CP; RAN_SSE_FR20; RAN_SSE_FR26; RAN_SSE_FR27; RAN_SSE_PS
      USER3 PACIFICA; RAN; RAN_SAISIE; RAN_SSE_CP; RAN_VAL


      Résultat attendu

      USER1 NULL
      USER2 PACIFICA
      USER2 RAN
      USER2 RAN_SAISIE
      USER2 RAN_SSE_CP
      USER2 RAN_SSE_FR20
      USER2 RAN_SSE_FR26
      USER2 RAN_SSE_FR27
      USER2 RAN_SSE_PS
      USER3 PACIFICA
      USER3 RAN
      USER3 RAN_SAISIE
      USER3 RAN_SSE_CP
      USER3 RAN_VAL


  2. #2
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    bonjour,
    ta demande manque un peu de précision et faire référence à Excel qui est un tableur n'est d'aucune utilité car la manipulation est complètement différente avec le l'enregistrement de données dans des tables.
    Quelques questions:
    - souhaites-tu créer de nouveaux enregistrements dans la table existante (avec de nouvelles colonnes ou existent-elles déjà) ou dans une nouvelle table ?
    - les données sont-elles toutes formatées ainsi où existe t-il des différences (plusieurs espaces entre le 1er et le 2ème mot, plusieurs mots de tailles différentes ... ?
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  3. #3
    Membre expert
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2012
    Messages
    1 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 1 871
    Points : 3 451
    Points
    3 451
    Par défaut
    Bonjour lelockjohn, tee_grandbois,

    La fonction Split d'Access est la réponse à ta question. Ce que tee_grandbois pose comme question est comment souhaites-tu l'utiliser.

    Si la table initiale se nomme T_User et que la table de réception se nomme T_User_Result voici le code, dans un module qui fera ce que tu désires.

    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
    Option Compare Database
    Option Explicit
     
    Public Sub suSplit()
    On Error GoTo gestion_err
     
        Dim db As DAO.Database: Set db = CurrentDb
        Dim rst As DAO.Recordset, rstR As DAO.Recordset
        Dim strSQL As String
        Dim vaRecord As Variant
        Dim i As Integer
     
    '    Parcourir la table initiale
        strSQL = "SELECT T_User.USER, T_User.Detail FROM T_User;"
        Set rst = db.OpenRecordset(strSQL, dbOpenSnapshot)
    '    Si vide on sort du sub
        If rst.EOF Then
            rst.Close
            Set rst = Nothing
            Set db = Nothing
            GoTo Sortie
        End If
    '    On supprime les records si déjà existant
        strSQL = "DELETE T_User_Result.*FROM T_User_Result;"
        db.Execute strSQL, dbFailOnError
    '    On ouvre la nouvelle table
        strSQL = "SELECT T_User_Result.USER, T_User_Result.Detail FROM T_User_Result;"
        Set rstR = db.OpenRecordset(strSQL, dbOpenDynaset, dbSeeChanges)
    '    On parcours les records de la table initiale
        Do Until rst.EOF
    '        On divise le champ
            vaRecord = Split(rst("Detail"), ";")
            i = 0
    '        On ajoute un record pour chacune des parties du champ
            For i = 0 To UBound(vaRecord)
            rstR.AddNew
                rstR("USER") = rst("USER")
                rstR("Detail") = Trim(vaRecord(i))
            rstR.Update
            Next i
            rst.MoveNext
        Loop
        rst.Close: rstR.Close
        Set rst = Nothing: Set rstR = Nothing
        Set db = Nothing
     
    Sortie:
    Exit Sub
    gestion_err:
        MsgBox Err.Description & Chr(13) & "Erreur # " & Err.Number, vbInformation, "Erreur dans suSplit"
        Resume Sortie
    End Sub
    Bonne journée
    Ce qui se conçoit bien s’énonce clairement et les mots pour le dire arrivent aisément. Nicolas Boileau
    Si tout est OK, n'oubliez pas de cliquer sur

  4. #4
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    bonsoir Robert1957,
    merci pour ton coup de main. J'avais pensé aussi à la fonction Split() mais ton code pars du principe qu'il y a 2 champs: User et Detail, alors que selon moi il n'y en a qu'un dans la table d'origine (donc le champ Detail).
    Pour moi, Il faut d'abord isoler le début du champ en trouvant le premier caractère espace pour récupérer la partie commençant par USERx:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ...
    Dim stUser as string
    Dim stDetailReste as string
    ...
     
    stUser = Mid(rst("Detail"), 1, InStr(1, rst("Detail"), Space(1)) - 1)
    ...
    rstR("USER") = stUser
    ensuite créer le tableau sur le reste du champ Detail et faire ensuite le Split():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ...
    stDetailReste = Mid(rst("Detail"), Len(stUser) + 1))
    ...
    vaRecord = Split(stDetailReste, ";")
    ...
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2013
    Messages : 30
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par tee_grandbois Voir le message
    bonjour,
    ta demande manque un peu de précision et faire référence à Excel qui est un tableur n'est d'aucune utilité car la manipulation est complètement différente avec le l'enregistrement de données dans des tables.
    Quelques questions:
    - souhaites-tu créer de nouveaux enregistrements dans la table existante (avec de nouvelles colonnes ou existent-elles déjà) ou dans une nouvelle table ?
    - les données sont-elles toutes formatées ainsi où existe t-il des différences (plusieurs espaces entre le 1er et le 2ème mot, plusieurs mots de tailles différentes ... ?

    Merci pour vos réponses

    - je souhaite enregistrer les nouveaux enregistrements dans une nouvelle table T_USER_PAR_GROUPE (ma table initiale T_USER) => les 2 tables ont les même colonnes "LOGIN" et "GROUPES"
    - les données que je souhaite fractionner par lignes sont toutes séparées par ","

    Ma BDD est en PJ

    Merci beaucoup pour votre aide
    Fichiers attachés Fichiers attachés

  6. #6
    Membre expert
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2012
    Messages
    1 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 1 871
    Points : 3 451
    Points
    3 451
    Par défaut
    Bonjour lelockjohn, tee_grandbois,

    Comme la structure est la même que mon premier post, tu n'as qu'à modifié les noms des tables et des champs pour qu'ils correspondent à ta Bd et tout va fonctionner.

    Voici le code corrigé selon ton dernier post(à vérifier).
    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
    Option Compare Database
    Option Explicit
     
    Public Sub suSplit()
    On Error GoTo gestion_err
     
        Dim db As DAO.Database: Set db = CurrentDb
        Dim rst As DAO.Recordset, rstR As DAO.Recordset
        Dim strSQL As String
        Dim vaRecord As Variant
        Dim i As Integer
     
    '    Parcourir la table initiale
        strSQL = "SELECT T_USER.LOGIN, T_USER.GROUPES FROM T_User;"
        Set rst = db.OpenRecordset(strSQL, dbOpenSnapshot)
    '    Si vide on sort du sub
        If rst.EOF Then
            rst.Close
            Set rst = Nothing
            Set db = Nothing
            GoTo Sortie
        End If
    '    On supprime les records si déjà existant
        strSQL = "DELETE T_USER_PAR_GROUPE.*FROM T_USER_PAR_GROUPE;"
        db.Execute strSQL, dbFailOnError
    '    On ouvre la nouvelle table
        strSQL = "SELECT T_USER_PAR_GROUPE.LOGIN, T_USER_PAR_GROUPE.GROUPES FROM T_USER_PAR_GROUPE;"
        Set rstR = db.OpenRecordset(strSQL, dbOpenDynaset, dbSeeChanges)
    '    On parcours les records de la table initiale
        Do Until rst.EOF
    '        On divise le champ
            vaRecord = Split(rst("GROUPES"), ",")
            i = 0
    '        On ajoute un record pour partie du champ
            For i = 0 To UBound(vaRecord)
            rstR.AddNew
                rstR("LOGIN") = rst("LOGIN")
                rstR("GROUPES") = Trim(vaRecord(i))
            rstR.Update
            Next i
            rst.MoveNext
        Loop
        rst.Close: rstR.Close
        Set rst = Nothing: Set rstR = Nothing
        Set db = Nothing
     
    Sortie:
    Exit Sub
    gestion_err:
        MsgBox Err.Description & Chr(13) & "Erreur # " & Err.Number, vbInformation, "Erreur dans suSplit"
        Resume Sortie
    End Sub
    Bonne journée
    Ce qui se conçoit bien s’énonce clairement et les mots pour le dire arrivent aisément. Nicolas Boileau
    Si tout est OK, n'oubliez pas de cliquer sur

  7. #7
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    ben non, finalement, il y a bien 2 champs
    donc rien à changer dans le code de Robert1957 à part le nom des champs et des tables.
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  8. #8
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2013
    Messages : 30
    Points : 17
    Points
    17
    Par défaut
    parfait !

    merci beaucoup pour votre aide => résolu !

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

Discussions similaires

  1. Répartir le contenu d'une cellule sur plusieurs lignes
    Par Sandrineboubou dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 19/02/2019, 09h45
  2. Répartir le contenu d'une cellule sur plusieurs lignes
    Par jbedez dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 10/02/2017, 16h23
  3. Répartir le contenu d'une cellule sur plusieurs lignes
    Par AudreyAQF dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 10/06/2016, 16h22
  4. [XL-2003] Répartir le contenu d'une cellule sur plusieurs lignes
    Par Leehan dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 10/10/2012, 15h06
  5. Réponses: 4
    Dernier message: 22/01/2008, 16h59

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