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 :

Récupérer des données d'un champ et les mettre dans un champs multi-valué [AC-2016]


Sujet :

VBA Access

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2018
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Récupérer des données d'un champ et les mettre dans un champs multi-valué
    Bonjour,

    Je vous explique mon problème, dans une base Access j'ai un import de table d'un point csv, Cette import contient des champs faisant référence à d'autre table sauf que ses champs sont uni-valué et contiennent plusieurs référence à d'autre table dans un même enregistrement séparer par "|" entre chaque valeur. je voudrais donc récupérer ces valeurs pour les mettre dans un nouveaux champs multi-valué.
    Pour être plus précis j'ai un champs1 avec ce type de données : "10|12|15" que je voudrais éclater pour insérer dans un champs2 multi-valué "10" "12" "15".
    Mon problème est de récupérer les données du champs 1 dans une variable string VBA.
    Mon code est le 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
    Sub S03_ChampMultiValueAjouterUn()
    Dim oRst As DAO.Recordset
    ' Sélectionne le champs 2
    Set oRst = CurrentDb.OpenRecordset("SELECT Activite_liste FROM Organisation WHERE id=18 ")
     
    SQL = "SELECT value FROM STRING_SPLIT(Organisation.Activities, '|')"
     
     
     
    Dim tmp As DAO.Recordset
    'Sélectionne le champs 1
    Set tmp = CurrentDb.OpenRecordset("SELECT Activities FROM Organisation WHERE id=18 ")
    Dim b As String
    'n'arrive pas à récupérer le champs 1 dans la variable b
    b = tmp.Fields(0).Value
     
    Dim a As Variant
    a = Split(b, "|")
     
     
    With oRst
    ' Si l'enregistrement existe
      If Not .EOF Then
        .Edit
        ' Accède au champ multivalué
        With .Fields(0).Value
          ' Ajoute la valeur et met à jour
          .AddNew
          .Fields(0).Value = a(0)
          .Update
        End With
        .Update
      Else
        MsgBox "Ce chauffeur n'existe pas"
      End If
    End With
    End Sub

    Si il y a un moyen même sans utiliser du VBA je suis preneur.
    Merci d'avance.

  2. #2
    Rédacteur/Modérateur
    Avatar de Jeannot45
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2004
    Messages
    3 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 871
    Points : 8 489
    Points
    8 489
    Par défaut


    La fonction Split() crée un tableau.
    En conséquence, pour récupérer les valeurs du tableau, il faut le lire en totalité.
    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim l_intCompteur as Interger
     
    For l_intCompteur = 0 to Ubound(a) (Donne la limite supérieur du tableau
    ...
    Next
    Ce qui pourrait donner (Attention, je n'ai pas tester) :
    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
    ' Déclaration de la variable locale de type integer
    Dim l_intCompteur as Interger
     
    With oRst
    ' Si l'enregistrement existe
      If Not .EOF Then
        .Edit
        ' Accède au champ multivalué
        With .Fields(0).Value
          ' Début de la boucle
          For l_intCompteur = 0 to Ubound(a) 
              ' Ajoute la valeur et met à jour
              .AddNew
              .Fields(0).Value = a(l_intCompteur)
              .Update
        Next
        End With
        .Update
    Bonne continuation
    Jeannot

    Liens Office indispensables à visiter: Cours (Tutos), F.A.Q., Sources VBA

    Ne posez pas de questions par MP, je n'ai pas le temps d'y répondre

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2018
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Erreur 3021
    Bonjour merci de ta réponse,

    J'ai modifié mon code mais une erreur s’exécute, j'ai essayé d'automatiser le code pour qu'il le fasse pour tout les enregistrements avec une boucle while. Seulement toute les valeurs de mon champs ne sont pas remplies donc il me fait l'erreur 3021. J'ai essayé de rajouter des condition dans le code ci dessous sans succès et de gérer l'erreur mais avec la fonction On Error GoTo, mais cela ne fonctionne qu'une fois. Les commentaire sont surement plus parlant que mes explications.

    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
    Sub S03_ChampMultiValueAjouterUn()
     
    On Error GoTo err
     
    Dim oRst As DAO.Recordset
    Set oRst = Nothing
    ' Sélectionne le champs 2
    Set oRst = CurrentDb.OpenRecordset("SELECT Activite_liste FROM Organisation")
     
    ' Se place sur le premier enregistrement
    oRst.MoveFirt
     
     
     
     
    Dim tmp As DAO.Recordset
    'Sélectionne le champs 1
    Set tmp = Nothing
    Set tmp = CurrentDb.OpenRecordset("SELECT Activities FROM Organisation")
     
    tmp.MoveFirst
    ' Se place sur le premier enregistrement
     
    Dim b As Variant
    Dim i As Integer
    Dim longueur_tab As Integer
    Dim c As Variant
    Dim a() As String
     
     
    While (Not tmp.EOF And Not oRst.EOF)
     
    If IsNull(tmp.Fields(0).Value.Value) = False Then 'ne fonctionne pas IsEmpty non plus
    MsgBox tmp.Fields(0).Value.Value
    b = tmp.Fields(0).Value.Value 'Erreur quand tmp pointe sur une case vide
     
     
    a() = Split(b, "|")
     
    If IsEmpty(a) = False Or IsNull(a) = False Then
    longueur_tab = UBound(a)
     
    For i = 0 To longueur_tab
    With oRst
    ' Si l'enregistrement existe
      If Not .EOF Then
        .Edit
        ' Accède au champ multivalué
        With .Fields(0).Value
          ' Ajoute la valeur et met à jour
          .AddNew
          .Fields(0).Value = a(i)
          .Update
        End With
        .Update
      Else
        MsgBox "Fin"
      End If
    End With
     
    Next
     
    End If
    End If
    err: ' gère une erreur mais 1 seule fois
     
    'Se place sur l'enregistrement suivant
    oRst.MoveNext
    tmp.MoveNext
     
     
    b = 0
     
    'MsgBox tmp.AbsolutePosition + 1 & " sur " & tmp.RecordCount
     
     
     
     
    Wend
     
    End Sub
    Merci

  4. #4
    Rédacteur/Modérateur
    Avatar de Jeannot45
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2004
    Messages
    3 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 871
    Points : 8 489
    Points
    8 489
    Par défaut


    Il me semble que ta boucle est mal positionnée.

    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
    With oRst
    ' Si l'enregistrement existe
      If Not .EOF Then
        .Edit
        ' Accède au champ multivalué
        With .Fields(0).Value
            ' Boucle sur les valeurs à ajouter au champ multivalué
            For i = 0 To longueur_tab
                ' Ajoute la valeur et met à jour
                .AddNew
                .Fields(0).Value = a(i)
                .Update
            Next
        End With
        .Update
      Else
        MsgBox "Fin"
      End If
    End With
    Jeannot

    Liens Office indispensables à visiter: Cours (Tutos), F.A.Q., Sources VBA

    Ne posez pas de questions par MP, je n'ai pas le temps d'y répondre

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2018
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Cela ne change pas grand chose, le problème vient de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    b = tmp.Fields(0).Value.Value 'Erreur quand tmp pointe sur une case vide
    quand mon champs access n'est pas renseigné. Si tous les enregistrements avaient une valeur, cela fonctionnerai.

  6. #6
    Rédacteur/Modérateur
    Avatar de Jeannot45
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2004
    Messages
    3 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 871
    Points : 8 489
    Points
    8 489
    Par défaut


    Je te joins une petite base de données exemple qui contient deux tables
    T_ImportCsv avec des données telles que tu les a présentées
    T_ChampMultivalue qui contient un champ qui doit récupérer les données correspondantes de l'importCsv.

    Le formulaire F_LancerRecupDonnees contient un bouton qui te permet de récuperer les données Csv et les stocker dans le champ multivalué.
    Tu verras que dans la table T_ImportCsv, il y a différents cas de figures.

    A la différence que je fais une récupération globale des données.

    Bonne continuation
    Fichiers attachés Fichiers attachés
    Jeannot

    Liens Office indispensables à visiter: Cours (Tutos), F.A.Q., Sources VBA

    Ne posez pas de questions par MP, je n'ai pas le temps d'y répondre

  7. #7
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 905
    Points
    55 905
    Billets dans le blog
    131
    Par défaut
    Salut.

    Si je peux me permettre une petite intrusion...

    Les champs multi-valués, c'est une véritbable catastrophe dans Access, qui va t'empêcher d'analyser, d'exporter, de traiter les données desdits champs.

    Si j'étais toi, je me reporterais sur une structure classique à deux tables (relation un à plusieurs 1:N) ou trois tables (relation plusieurs à plusieurs m:n) qui t'offrira beaucoup plus de souplesse.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  8. #8
    Rédacteur/Modérateur
    Avatar de Jeannot45
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2004
    Messages
    3 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 871
    Points : 8 489
    Points
    8 489
    Par défaut


    Citation Envoyé par Pierre Fauconnier
    Si j'étais toi, je me reporterais sur une structure classique à deux tables (relation un à plusieurs 1:N) ou trois tables (relation plusieurs à plusieurs m:n) qui t'offrira beaucoup plus de souplesse.
    Alors là, Pierre, je te suis à 100%.
    Jeannot

    Liens Office indispensables à visiter: Cours (Tutos), F.A.Q., Sources VBA

    Ne posez pas de questions par MP, je n'ai pas le temps d'y répondre

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

Discussions similaires

  1. Récupérer des données d'un fichier pour les afficher dans des pages html
    Par Millie31 dans le forum Général Conception Web
    Réponses: 2
    Dernier message: 15/10/2015, 14h22
  2. Réponses: 1
    Dernier message: 06/07/2015, 21h02
  3. Réponses: 3
    Dernier message: 03/07/2015, 12h36
  4. Réponses: 0
    Dernier message: 10/08/2008, 19h05
  5. Réponses: 1
    Dernier message: 31/01/2007, 11h59

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