Séparation Split(colonne, vbLf)

JDev_ -  
 Utilisateur anonyme -
Bonjour

J'ai une table qui a été directement importée d'Outlook.

Cette table "test" comprend une colonne Adresse.

La colonne adresse est peut-être de cette forme (Adresse est de type Texte et un champs comrpend plusieurs lignes dû à l'importation des donénes d'Outlook vers une table Access) :

--------------------
Adresse
--------------------
l1 | Immeuble B
| 18 rue ***
|BP 0000
--------------------
l2 | 19 rue ***
--------------------
l3 | 20 rue ***
| BP 0000
--------------------

Mon objectif, séparer un champs en champs en 3 (séparateur : saut de ligne) et récuperer ces 3 parties dans 3 colonnes respectives et cela pour chaque ligne de ma table.

Ex : l1 de ma colonne Adresse
Colonne Adresse1, première ligne 1 -> Immeuble B
Colonne Adresse 2, première ligne 1 -> 18 rue ****
Colonne Adresse3, première ligne 1 -> BP 0000

Pour cela, j'ai utiliser la fonction split avec le séparateur vbLf : séparation à chaque saut de ligne.

Je récupère les données sépararer dans un tableau de String et ensuite j'ajoute mes données dans les colonnes ADRESSE1, ADRESSE2, ADRESS3 toujours dans ma table "test"

Sub Separe() 
        Dim rst As DAO.Recordset 
        Set rst = CurrentDb.OpenRecordset("test") 
  
        While Not rst.EOF 
             rst.Edit 
  
            Dim tableau1() As String, i as Integer 
  
            tableau1 = Split(rst(6), vbLf) 
             
            For i=0 to ubound(tableau1) 
            DoCmd.RunSQL "INSERT INTO test(ADRESSE1) Values( ' " & tableau1(i) & " ')"             
               rst.Update 
            Erase tableau1 
            rst.MoveNext 
        Wend 
        rst.Close 
        Set rst = Nothing 
  
End Sub  


J'ai recherché sur le net sans succès et j'ai essayé ce code mais il ne fonctionne pas : mes colonnes ADRESSE1, ADRESS2, ADRESSE 3 restent vides.

J'ai également une erreur d'exécution 3075 qui est lancée :

Citation:
Erreur de syntaxe (opérateur absent) dans l'expression "BP 940 N"

"BP 940" est une données contenue dans un champs de ma colonne Adresse.
Je pense que les sauts lignes (lors de la saisie sur Outlook) sont mal gérés une fois importés dans une table Access.

J'espère avoir été le plus clair possible.

Merci pour votre aide d'autant plus que le problème ne semble pas évident à résoudre.

11 réponses

  1. JDev_
     
    Désolée, j'ai oublié de dire que je travaillais sur une formulaire Access 2007.

    Et que le code ci-joint provient d'une fonction vba développée dans un module.
    0
  2. Utilisateur anonyme
     
    Bonjour,

    As-tu essayé :

    tableau1 = Split(rst(6), vbCrLf)

    Cdt

    Lupin
    0
  3. JDev_
     
    Merci de ta réponse !

    Oui, j'ai essayé vbCrLf et même vbNewLine mais sans succès.
    0
  4. Utilisateur anonyme
     
    re:

    Il sera sans doute nécessaire de décortiquer le rst manuellement !

    Je n'ai pas d'environnement Access sous la main, mais quelque chose comme

    Dim Indice As Integer
    Dim Boucle As Integer
    Indice = rst(6).Fields.Count - 1

    For Boucle = 0 To Indice

    DoCmd.RunSQL "INSERT INTO test(ADRESSE1) Values( ' " & rst(6).Fields(Boucle).Value & ")"

    Next Boucle

    n.b. Il se pourrait que tu ais a concatener certains champs !
    rst(6).Fields(Boucle).Value & rst(6).Fields(Boucle +1).Value &

    Cdt

    Lupin
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. JDev_
     
    Super, ça marche bien ! Merci beaucoup.

    Par contre, je viens de réaliser que j'ai mal pensé mon code.

    Je voudrais que si un champs "Immeuble A (retour chariot) 18 rue *** (retour chariot) BP 56 que pour cette même ligne Immeuble A se trouve dans ma colonne ADRESSE1, 18 rue *** dans ma colonne ADRESSE2 et BP56 dans ADRESSE3.

    Initialement, je n'y arrivais pas dans j'ai d'abord essayer de la faire pour une colonne. Si jamais tu vois comment je pourrais m'y prendre ?

    C'est pour cela que j'utilisais au départ un tableau
    Il était créer à chaque ligne et du coup je voulais que tableau(0) recueille mon Immeuble 1 et ensuite l'ajouter à ma colonne ADRESSE1 et de même pour tableau(1) = 18 rue *** ajouté à ADRESSE2 etc. Et cela répéter pour chaque ligne.

    J'espère être assez clair. Je vais essayer de poursuivre de mon côté.

    Merci pour ta réponse, ça me donne une piste de résolution.
    0
  7. Utilisateur anonyme
     
    re:

    Il reste aussi la possibilité de :

    For Boucle = 0 To Indice Step 3

    DoCmd.RunSQL "INSERT INTO test(ADRESSE1) Values( ' " & rst(6).Fields(Boucle).Value & ")"

    DoCmd.RunSQL "INSERT INTO test(ADRESSE2) Values( ' " & rst(6).Fields(Boucle + 1).Value & ")"

    DoCmd.RunSQL "INSERT INTO test(ADRESSE3) Values( ' " & rst(6).Fields(Boucle + 2).Value & ")"

    Next Boucle

    Cdt

    Lupin
    0
  8. JDev_
     
    Cette fois, j'ai une erreur d'exécution :
    "Membre de méthode ou données introuvable" et "Fields" est mis en surbrillance.

    Je suis novice en VBa et je me demandais si j'avais bien placé ton code? La première fois, ça a bien marché et la seconde peu importe mes changements, j'avais toujours cette erreur d'exécution.

    En tous, les cas, je te remercie pour le temps tu consacres à m'aider !

    Sub Separation()
    
    Dim rst As DAO.Recordset
    Set rst = CurrentDb.OpenRecordset("Adresse")
    
       While Not rst.EOF
    
            'rst.Edit
            
            Dim Indice As Integer
            Dim Boucle As Integer
            Indice = rst(6).Fields.Count - 1
            
            For Boucle = 0 To Indice Step 3
            
                    DoCmd.RunSQL "INSERT INTO test(ADRESSE1) Values( ' " & rst(6).Fields(Boucle).Value & ")"
                    
                    DoCmd.RunSQL "INSERT INTO test(ADRESSE2) Values( ' " & rst(6).Fields(Boucle + 1).Value & ")"
                    
                    DoCmd.RunSQL "INSERT INTO test(ADRESSE3) Values( ' " & rst(6).Fields(Boucle + 2).Value & ")"
            
            Next Boucle
    
            'rst.MoveNext
    
       Wend
        
            'rst.Close
          'Set rst = Nothing
    End Sub
    
    0
  9. Utilisateur anonyme
     
    re:

    Tout d'abord, lorsque :
    Sub Separation()

    Dim rst As DAO.Recordset
    Set rst = CurrentDb.OpenRecordset("Adresse")

    While Not rst.EOF

    Avant toute opération sur le rst, effectue un balayage,
    ça initialise le recordset

    Dim rst As DAO.Recordset
    Set rst = CurrentDb.OpenRecordset("Adresse")

    rst.MoveLast
    rst.MoveFirst

    While Not rst.EOF

    Je crois que l'erreur vient d'une erreur de Type.

    l'instruction :
    DoCmd.RunSQL "INSERT INTO test(ADRESSE1) Values( ' " & rst(6).Fields(Boucle).Value & ")"

    insère une donnée de type A dans une table ayant un champ de Type B

    toujours découpé dans le doute, et la string (chaine de caractères)
    est le passe-partout. Encore faut-il que les champs de la table Access
    soit de type Texte, il te faut bien identifier les types de champs de la BD
    et utiliser les fonctions de conversions pour les entrées,
    CStr, CDate, CLng, CDbl, ... et tu en trouveras plein d'autres dans l'aide.

    Dim Chaine as String

    Chaine = rst(6).Fields(Boucle).Value
    DoCmd.RunSQL "INSERT INTO test(ADRESSE1) Values( ' " & Chaine & "')"
    Chaine = rst(6).Fields(Boucle + 1).Value
    DoCmd.RunSQL "INSERT INTO test(ADRESSE2) Values( ' " & Chaine & "')"
    Chaine = rst(6).Fields(Boucle + 2).Value
    DoCmd.RunSQL "INSERT INTO test(ADRESSE3) Values( ' " & Chaine & "')"

    il se pourrait qu'il soit nécessaire de faire une conversion de type

    Dim Chaine as String

    Chaine = CStr(rst(6).Fields(Boucle).Value)
    DoCmd.RunSQL "INSERT INTO test(ADRESSE1) Values( ' " & Chaine & "')"
    Chaine = CStr(rst(6).Fields(Boucle + 1).Value)
    DoCmd.RunSQL "INSERT INTO test(ADRESSE2) Values( ' " & Chaine & "')"
    Chaine = CStr(rst(6).Fields(Boucle + 2).Value)
    DoCmd.RunSQL "INSERT INTO test(ADRESSE3) Values( ' " & Chaine & "')"

    Cdt

    Lupin
    0
  10. JDev_
     
    Merci pour le temps consacrer à m'aider !

    Désolée, mon fichier est sur mon lieu de stage. Je ne pouvais donc pas y avoir accès ce week-end.

    Pour la boucle permetant un balayage, initilialisant le recordset, j'ai message d'erreur du type : "Déclaration en cours dans la portée en cours".

    Autrement, j'ai toujours le même message d'erreur :
    ""Membre de méthode ou données introuvable" et cette ligne est mise en surbrillance : "
    Indice = rst(6).Fields.count - 1


    Voici le code intégré : (tous mes champs sont de type texte)

    Sub Separe() 
            'Charger la référence Microsoft DAO 3.6 Object Library 
            Dim rst As DAO.Recordset 
            Set rst = CurrentDb.OpenRecordset("test") 
    
            Dim Boucle As Integer 
            Dim Indice As Integer 
            Indice = rst(6).Fields.count - 1 
             
            While Not rst.EOF 
    
              
                For Boucle = 0 To Indice Step 3 
    
                   Dim Chaine As String 
    
                   Chaine = CStr(rst(6).Fields(Boucle).Value) 
                   DoCmd.RunSQL "INSERT INTO test(ADRESSE1) Values( ' " & Chaine & "')" 
    
                   Chaine = CStr(rst(6).Fields(Boucle + 1).Value) 
                   DoCmd.RunSQL "INSERT INTO test(ADRESSE2) Values( ' " & Chaine & "')" 
    
                   Chaine = CStr(rst(6).Fields(Boucle + 2).Value) 
                   DoCmd.RunSQL "INSERT INTO test(ADRESSE3) Values( ' " & Chaine & "')" 
    
                Next Boucle 
            
                rst.MoveNext 
            Wend 
    
            Set rst = Nothing 
             
    End Sub
    0
  11. Utilisateur anonyme
     
    re:

    Comme souligné dans un précédent message, pour
    obtenir la propriété Count du recorset il te faut l'initialiser.

    Dim Boucle As Integer
    Dim Indice As Integer

    'Pour initialiser, ajoute ces 2 instructions.
    rst.MoveLast
    rst.MoveFirst
    Indice = rst(6).Fields.count - 1

    alors la propriété .Count n'enverra plus ce message !

    Cdt

    Lupin
    0
  12. JDev_
     
    Vraiment merci pour le temps que tu consacres à m'aider.

    J'avais bien pris en compte l'étape d'initialisation dès ton avant dernier-post mais ça ne fonctionnait pas.

    Cette fois, je l'ai intégré comme tu l'as mis dans ton dernier post. J'ai toujours la même erreur qui est lancée. Je ne la comprends pas.

    Voici mon code, j'ai repris l'étape d'initialisation

    Sub Separe()
            'Charger la référence Microsoft DAO 3.6 Object Library
            Dim rst As DAO.Recordset
            Set rst = CurrentDb.OpenRecordset("test")
    
            Dim Boucle As Integer
            Dim Indice As Integer
        
            rst.MoveLast
            rst.MoveFirst
            Indice = rst(6).Fields.Count - 1
    
             
            While Not rst.EOF
    
              
                For Boucle = 0 To Indice Step 3
    
                   Dim Chaine As String
    
                   Chaine = CStr(rst(6).Fields(Boucle).Value)
                   DoCmd.RunSQL "INSERT INTO test(ADRESSE1) Values( ' " & Chaine & "')"
    
                   Chaine = CStr(rst(6).Fields(Boucle + 1).Value)
                   DoCmd.RunSQL "INSERT INTO test(ADRESSE2) Values( ' " & Chaine & "')"
    
                   Chaine = CStr(rst(6).Fields(Boucle + 2).Value)
                   DoCmd.RunSQL "INSERT INTO test(ADRESSE3) Values( ' " & Chaine & "')"
    
                Next Boucle
            
                rst.MoveNext
            Wend
    
            Set rst = Nothing
             
    End Sub


    Cordialement,
    0
    1. Utilisateur anonyme
       
      re:

      Je vais devoir tester dans mon environnement !

      Mais pour ce faire, je vais avoir besoin de précision"

      si
      Dim Texte as String
      Dim rst As DAO.Recordset
      Set rst = CurrentDb.OpenRecordset("test")

      rst.MoveLast
      rst.MoveFirst

      While Not rst.EOF

      Texte = Texte & rst.Fields(0)

      Wend

      MsgBox Texte

      Que vaut Texte ?

      Dim Texte as String
      Dim rst As DAO.Recordset
      Set rst = CurrentDb.OpenRecordset("Adresse")

      rst.MoveLast
      rst.MoveFirst

      While Not rst.EOF

      Texte = Texte & rst.Fields(0)

      Wend

      MsgBox Texte

      Que vaut Texte ?


      où si tes données ne sont pas confidentiel, ou si tu peux
      obtenir une copie de tes tables avec seulement quelques records
      dépose la sur [ Ci-Joint ].

      Ce que j'ai du mal à comprendre :

      While Not rst.EOF

      tableau1 = Split(rst(6), vbLf)

      Wend

      Pourquoi balayer le recordset et pointer spécifiquement le 6ième ?

      Cdt

      Lupin
      0