Séparation Split(colonne, vbLf)

Fermé
JDev_ - Modifié par JDev_ le 25/05/2012 à 16:22
 Utilisateur anonyme - 30 mai 2012 à 13:27
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.
A voir également:

11 réponses

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
Utilisateur anonyme
25 mai 2012 à 16:49
Bonjour,

As-tu essayé :

tableau1 = Split(rst(6), vbCrLf)

Cdt

Lupin
0
Merci de ta réponse !

Oui, j'ai essayé vbCrLf et même vbNewLine mais sans succès.
0
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
Utilisateur anonyme
25 mai 2012 à 20:29
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
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
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
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
Utilisateur anonyme
29 mai 2012 à 12:57
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
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
Utilisateur anonyme
30 mai 2012 à 13:27
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