Séparation Split(colonne, vbLf)
JDev_
-
Utilisateur anonyme -
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"
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.
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:
- Séparation Split(colonne, vbLf)
- Déplacer colonne excel - Guide
- Split cam - Télécharger - Messagerie
- Trier colonne excel - Guide
- Colonne word - Guide
- Formule somme excel colonne - Guide
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.
Et que le code ci-joint provient d'une fonction vba développée dans un module.
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
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
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.
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.
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
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
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 !
"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
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
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
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 : "
Voici le code intégré : (tous mes champs sont de type texte)
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
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
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
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
Cordialement,
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,
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
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