Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

séparation d'un champ, dans une table Acces

17 réponses
Avatar
Andre
Bonjour à toutes et tous,

Voilà, je suis un grand néophyte qui comprends vite quand on lui a expliqué
longtemps.
J'ai reçu une table Access 2003 dans laquelle un cham "adresse" a été rempli
avec le nom de la rue, suivi après une virgule du n° de l'immeuble.
Pour des raisons de tri, je souhaite créer un champ n° et scinder le champ
"adresse" en supprimant la , et le n° pour l'injecter dans le nouveau champ
"n°".
Est-il possible de réaliser cette opération en une fois pour toute la table?
Déjà merci pour vos avis éclairés
André

7 réponses

1 2
Avatar
Andre
Re Bonjour Titi,

Désolé de t'importuner mais j'ai le même résultat : plus de , et de No dans
le champ "adresse" MAIS toujours pas de remplissage du champ "No". Les
champs "adresse" et "No" sont de type texte.
Meri pour le mal que tu te donnes.
André

"Fabien" a écrit dans le message de news:
471dc282$0$5066$
Oops ! Désolé... J'espère que tu as une sauvegarde de tes données...
Concernant ce désagrément, le problème doit se situer au niveau de la
ligne
rs![n°]=mid(rs!adresse,aux+1)
Essaie avec :
rs.Fields("No")=mid(rs!adresse,aux+1)
Vérifie tout de même l'orthographe des champs...

En ce jour mémorable du lundi 22/10/2007, tu as émis l'idée suivante:
Bonsoir Titi,

Merci pour cette réponse rapide.
Malheureusement, cela ne fonctionne qu'à moitié. Je m'explique :
J'ai remplacé les noms de champ et le nom de la table par la mienne.
J'ai exécuté le module qui a enlevé tous les numéros dans le champ
"Adresse" de la table MAIS ne les a pas replacés dans le champ "No"
Merci pour l'aide.
André

"Thierry (ze Titi)" a écrit dans le
message de news:
Bonjour Andre !

Si tu as déjà créé ton champ, tu peux utiliser une fonction du style de
ce qui suit. A coller dans un nouveau module et à exécuter une seule
fois.

Sub scinderAdresse()
dim rs As DAO.Recordset
dim aux As Integer
Set rs=CurrentDb.OpenRecordset("laTable",dbOpenDynaset)
rs.MoveLast:rs.MoveFirst
While Not rs.EOF
aux=InStr(rs!adresse,",")
If aux<>0 Then
rs.Edit
rs!adresse=Left(rs!adresse,aux-1)
rs![n°]=mid(rs!adresse,aux+1)
rs.Update
End If
rs.MoveNext
Wend
Set rs=Nothing
End Sub

A tester...

Message du lundi 22/10/2007

Bonjour à toutes et tous,

Voilà, je suis un grand néophyte qui comprends vite quand on lui a
expliqué longtemps.
J'ai reçu une table Access 2003 dans laquelle un cham "adresse" a été
rempli avec le nom de la rue, suivi après une virgule du n° de
l'immeuble.
Pour des raisons de tri, je souhaite créer un champ n° et scinder le
champ "adresse" en supprimant la , et le n° pour l'injecter dans le
nouveau champ "n°".
Est-il possible de réaliser cette opération en une fois pour toute la
table?
Déjà merci pour vos avis éclairés
André


-- Cordialement,
Thierry

Tout pour réussir avec Access :
http://www.mpfa.info





Bonjour,

Puis-je ?
rs!adresse=Left(rs!adresse,aux-1)
rs![n°]=mid(rs!adresse,aux+1)
AIe !!
Si RS!Adresse contient 25 , rue de la joie
alors aprés rs!adresse=Left(rs!adresse,aux-1) Adressse ne contient plus
que 25 et le rs![n°]=mid(rs!adresse,aux+1) qui suit ne donne plus rien.
Ou alors j'ai pas compris ;-)

M'est d'avis qu'un Dim MonAdresse as string
et un
MonAdresse= Rst!Adresse
rs![N°]=Left(Monadresse,aux-1)
rs!adresse=mid(MonAdresse,aux+1)

devrait faire l'affaire ;-)






Avatar
Thierry (ze Titi)
Désolé de t'importuner mais j'ai le même résultat : plus de , et de No dans
le champ "adresse" MAIS toujours pas de remplissage du champ "No". Les champs
"adresse" et "No" sont de type texte.
MonAdresse= Rst!Adresse
rs![N°]=Left(Monadresse,aux-1)
rs!adresse=mid(MonAdresse,aux+1)

devrait faire l'affaire ;-)



Si tu as tenu compte des nécessaires remarques de Fabien et Michel, tu
dois avoir quelque chose dans ce style:


Sub scinderAdresse()
dim rs As DAO.Recordset
dim aux As Integer
Set rs=CurrentDb.OpenRecordset("laTable",dbOpenDynaset)
rs.MoveLast:rs.MoveFirst
While Not rs.EOF
aux=InStr(rs!adresse,",")
If aux<>0 Then
rs.Edit
rs!No=mid(rs!adresse,aux+1)
rs!adresse=Left(rs!adresse,aux-1)
rs.Update
End If
rs.MoveNext
Wend
Set rs=Nothing
End Sub

Si ça ne fonctionne pas, soit il y a un problème dans les noms des
champs, soit il nous manque des infos. Tu peux éventuellement mettre ta
base sur cjoint.com.

--
Cordialement,
Thierry

Tout pour réussir avec Access :
http://www.mpfa.info


Avatar
3stone
Salut,

"Thierry (ze Titi)"

| rs!No=mid(rs!adresse,aux+1)

|
| Si ça ne fonctionne pas, soit il y a un problème dans les noms des
| champs


vouui ;-)

rs!No

doit faire mal à Access, car probablement interpreté comme rs!faux

--
A+
Pierre (3stone) Access MVP
Perso: http://www.3stone.be/
MPFA: http://www.mpfa.info/ (infos générales)
Avatar
Phil
Merci Phil pour ton intervention. Malheureusement, comme je le disais, je
suis réellement néophyte. J'ai fait ce que tu as écrit et ... aucun
changement.
Merci pour ta peine André
"Phil" a écrit dans le message de news:

Bonjour à toutes et tous,

Voilà, je suis un grand néophyte qui comprends vite quand on lui a
expliqué longtemps.
J'ai reçu une table Access 2003 dans laquelle un cham "adresse" a été
rempli avec le nom de la rue, suivi après une virgule du n° de
l'immeuble.
Pour des raisons de tri, je souhaite créer un champ n° et scinder le
champ "adresse" en supprimant la , et le n° pour l'injecter dans le
nouveau champ "n°".
Est-il possible de réaliser cette opération en une fois pour toute la
table?
Déjà merci pour vos avis éclairés
André


Bonsoir,

je te propose
1) de créer une première requète sélection basée sur ta table avec tous
ses champs (ou seulement ceux qui te sont utiles) auxquel tu ajoutes un
champs calculé composé comme Position : DansChaîne([adresse];",")
(n'oublies pas l'accent circonflexe sur le i de chaine)
cela te donne la position de la virgule pour chaque enregistrement.

2) tu créé une seconde requète basée sur la première avec deux champs
supplémentaires
le premier comme AdrCourte:left([adresse];position-1)
le second comme N°:mid([adresse];position+1)

Connaissant la position de la virgule il est aisé de couper le champ en
deux. Vérifies si c'est bien position-1 et +1 et adaptes si besoin.

Bonne réception
Phil


pour être plus complet tu peux ajouter la fonction Trim pour exclure les
espaces parasites devant et derrière les parties du champs "adresse"
tronqués
les champs deviennent
AdrCourte:trim(left([adresse];position-1))
N°:trim(mid([adresse];position+1))

Phil





Bonsoir André,

excuse moi si je n'ai pas été clair et si je te répond ce soir mais je
me connecte de mon domicile.
Pour le fun et pour ceux qui sont réfrataires au code VBA ou souhaitent
ne pas s'en servir je reprend mon explication

1) tu créé une requète basée sur la table contenant les listes
d'adresses
requêtes > nouveau > mode création
dans "afficher la table" tu choisis dans l'onglet table celle qui
contient les données de tes écoles. puis clic sur le bouton fermer.

tu sélectionnes les champs dont tu as besoin ou tous en fonction de tes
besoins
puis au bout à droite des différents champs tu en ajoutes un que tu
écris de toute pièce en tapant exactement la ligne suivante sur la
ligne champ en respectant tous les signes et caractères (y compris
l'accent circonflexe) :
Position : DansChaîne([adresse];",")

enregistre la macro en lui donnant un nom significatif

quand tu l'exécutes tu obtiens les données de toute ta table avec un
champ supplémentaire appelé "position" qui indique à quelle position se
trouve la virgule dans le champs "adresse"
explication du fonctionnement :
la fonction "DansChaîne" indique la position de "," (le caractère
virgule) dans le champ [adresse]
le champ calculé du résultat s'appelle "Position"


cette requête n'est qu'une étape première étape

on poursuit en reprenant depuis le début

2) tu créé une nouvelle requète basée sur la première requête ci-dessus
contenant les données des écoles plus la position de la virgule

requêtes > nouveau > mode création
dans "afficher la table" tu choisis dans l'onglet "requête" (trés
important l'onglet requête) celle que tu viens de créer ci-dessus puis
clic sur le bouton fermer.

tu sélectionnes les champs dont tu as besoin
puis au bout à droite des différents champs tu en ajoutes deux que tu
écris de toute pièce en tapant exactement les deux lignes suivante sur
la ligne champ dans deux cases différentes :

Adr:trim(left([adresse];position-1))
Num:trim(mid([adresse];position+1))

explication de cette requète
elle est basée sur les données de la liste d'adresse à laquelle est
ajouté pour chaque enregistrement la "position" de la virgule dans
chaque champ "adresse" grace à la requête ci-dessus. On peut alors
décomposer le champ adresse avec dans un nouveau champ appelé "Adr"
tout ce qui est à gauche de la position de la virgule et dans un champ
Num tout ce qui est à droite de la virgule. La fonction Trim permet
d'enlever les espaces parasites qui peuvent être avant ou après la
virgule
exemple pour une adresse comme ceci :
adresse = "Rue du général de Gaulle , 25"
va donner sans les fonctions "Trim"
Adr = "Rue du général de Gaulle " et Num = " 25"

avec les fonction Trim tu obtiens
Adr = "Rue du général de Gaulle" et Num = "25"
les espaces parasites à la fin du nom de rue et avant le numéro sont
supprimés.

J'espère avoir été plus clair et te permettre de comprendre le
fonctionnement de mes propositions de requêtes sans recopier du code
VBA que tu ne comprends pas et que les spécialistes n'arrivent pas
toujours à faire fonctionner ;-)

Il existe encore un cas celui où les adresses n'ont pas de virgule, la
2° requête va (peut être) se bloquer car la position sera 0 (zéro) pour
y pallier il faut tester la valeur de position pour ne pas avoir de
blocage.
modifies les deux champs de la seconde requête comme suit

Adr:iif([position]>0;trim(left([adresse];position-1);[adresse])
Num:iif([position]>0;trim(mid([adresse];position+1));"")

explication :
pour le premier champ si position est >0 on effectue le calcul tel que
précédement expliqué "trim(left([adresse];position-1)" sinon
ont retourne le champ [adresse] complet (il n'y a pas de numéro
derrière une virgule dans cet enregistrement).
pour le second champ même test et même opération si "position" >0 mais
si "position" =0 ont ne retourne rien dans le champ Num (c'est les deux
"" en fin de ligne).

Merci de me faire savoir si cela a pu t'aider.

Phil




Avatar
Phil
Merci Phil pour ton intervention. Malheureusement, comme je le disais, je
suis réellement néophyte. J'ai fait ce que tu as écrit et ... aucun
changement.
Merci pour ta peine André
"Phil" a écrit dans le message de news:

Bonjour à toutes et tous,

Voilà, je suis un grand néophyte qui comprends vite quand on lui a
expliqué longtemps.
J'ai reçu une table Access 2003 dans laquelle un cham "adresse" a été
rempli avec le nom de la rue, suivi après une virgule du n° de
l'immeuble.
Pour des raisons de tri, je souhaite créer un champ n° et scinder le
champ "adresse" en supprimant la , et le n° pour l'injecter dans le
nouveau champ "n°".
Est-il possible de réaliser cette opération en une fois pour toute la
table?
Déjà merci pour vos avis éclairés
André


Bonsoir,

je te propose
1) de créer une première requète sélection basée sur ta table avec tous
ses champs (ou seulement ceux qui te sont utiles) auxquel tu ajoutes un
champs calculé composé comme Position : DansChaîne([adresse];",")
(n'oublies pas l'accent circonflexe sur le i de chaine)
cela te donne la position de la virgule pour chaque enregistrement.

2) tu créé une seconde requète basée sur la première avec deux champs
supplémentaires
le premier comme AdrCourte:left([adresse];position-1)
le second comme N°:mid([adresse];position+1)

Connaissant la position de la virgule il est aisé de couper le champ en
deux. Vérifies si c'est bien position-1 et +1 et adaptes si besoin.

Bonne réception
Phil


pour être plus complet tu peux ajouter la fonction Trim pour exclure les
espaces parasites devant et derrière les parties du champs "adresse"
tronqués
les champs deviennent
AdrCourte:trim(left([adresse];position-1))
N°:trim(mid([adresse];position+1))

Phil





Bonsoir André,

excuse moi si je n'ai pas été clair et si je te répond ce soir mais je me
connecte de mon domicile.
Pour le fun et pour ceux qui sont réfrataires au code VBA ou souhaitent ne
pas s'en servir je reprend mon explication

1) tu créé une requète basée sur la table contenant les listes d'adresses
requêtes > nouveau > mode création
dans "afficher la table" tu choisis dans l'onglet table celle qui contient
les données de tes écoles. puis clic sur le bouton fermer.

tu sélectionnes les champs dont tu as besoin ou tous en fonction de tes
besoins
puis au bout à droite des différents champs tu en ajoutes un que tu écris de
toute pièce en tapant exactement la ligne suivante sur la ligne champ en
respectant tous les signes et caractères (y compris l'accent circonflexe) :
Position : DansChaîne([adresse];",")

enregistre la macro en lui donnant un nom significatif

quand tu l'exécutes tu obtiens les données de toute ta table avec un champ
supplémentaire appelé "position" qui indique à quelle position se trouve la
virgule dans le champs "adresse"
explication du fonctionnement :
la fonction "DansChaîne" indique la position de "," (le caractère virgule)
dans le champ [adresse]
le champ calculé du résultat s'appelle "Position"


cette requête n'est qu'une étape première étape

on poursuit en reprenant depuis le début

2) tu créé une nouvelle requète basée sur la première requête ci-dessus
contenant les données des écoles plus la position de la virgule

requêtes > nouveau > mode création
dans "afficher la table" tu choisis dans l'onglet "requête" (trés important
l'onglet requête) celle que tu viens de créer ci-dessus puis clic sur le
bouton fermer.

tu sélectionnes les champs dont tu as besoin
puis au bout à droite des différents champs tu en ajoutes deux que tu écris
de toute pièce en tapant exactement les deux lignes suivante sur la ligne
champ dans deux cases différentes :

Adr:trim(left([adresse];position-1))
Num:trim(mid([adresse];position+1))

explication de cette requète
elle est basée sur les données de la liste d'adresse à laquelle est ajouté
pour chaque enregistrement la "position" de la virgule dans chaque champ
"adresse" grace à la requête ci-dessus. On peut alors décomposer le champ
adresse avec dans un nouveau champ appelé "Adr" tout ce qui est à gauche de
la position de la virgule et dans un champ Num tout ce qui est à droite de la
virgule. La fonction Trim permet d'enlever les espaces parasites qui peuvent
être avant ou après la virgule
exemple pour une adresse comme ceci :
adresse = "Rue du général de Gaulle , 25"
va donner sans les fonctions "Trim"
Adr = "Rue du général de Gaulle " et Num = " 25"

avec les fonction Trim tu obtiens
Adr = "Rue du général de Gaulle" et Num = "25"
les espaces parasites à la fin du nom de rue et avant le numéro sont
supprimés.

J'espère avoir été plus clair et te permettre de comprendre le fonctionnement
de mes propositions de requêtes sans recopier du code VBA que tu ne comprends
pas et que les spécialistes n'arrivent pas toujours à faire fonctionner ;-)

Il existe encore un cas celui où les adresses n'ont pas de virgule, la 2°
requête va (peut être) se bloquer car la position sera 0 (zéro) pour y
pallier il faut tester la valeur de position pour ne pas avoir de blocage.
modifies les deux champs de la seconde requête comme suit

Adr:iif([position]>0;trim(left([adresse];position-1);[adresse])
Num:iif([position]>0;trim(mid([adresse];position+1));"")

explication :
pour le premier champ si position est >0 on effectue le calcul tel que
précédement expliqué "trim(left([adresse];position-1)" sinon
ont retourne le champ [adresse] complet (il n'y a pas de numéro derrière une
virgule dans cet enregistrement).
pour le second champ même test et même opération si "position" >0 mais si
"position" =0 ont ne retourne rien dans le champ Num (c'est les deux "" en
fin de ligne).

Merci de me faire savoir si cela a pu t'aider.

Phil


petite précision
cette méthode ne modifie pas les données et effectue un affichage
dynamique des données.
une fois testée la seconde requète peut être transformée en requête de
création de table, puis après son exécution la table d'origine sera
supprimée.

Phil





Avatar
Andre
Bonsoir à tous ceux qui se sont VRAIMENT décarcassés pour moi.
Je les en remercie vivement car vous m'avez vraiment aidé.
Tout marche impeccablement et je vais pouvoir dormir sur mes 2 oreilles.
J'ai changé tous mes enregistrements avec le dernier bon module et grâce à
vous tous et à votre connaissance, je suis sauvé d'un boulot immense.
Encore merci à tous.
André
"3stone" a écrit dans le message de news:

Salut,

"Thierry (ze Titi)"

| rs!No=mid(rs!adresse,aux+1)

|
| Si ça ne fonctionne pas, soit il y a un problème dans les noms des
| champs


vouui ;-)

rs!No

doit faire mal à Access, car probablement interpreté comme rs!faux

--
A+
Pierre (3stone) Access MVP
Perso: http://www.3stone.be/
MPFA: http://www.mpfa.info/ (infos générales)



Avatar
Andre
Merci Phil,

Je suis un peu moins niais. Pas en Visual Basic bien sûr. J'en attrape des
boutons (lol) mais je comprends mieux le raisonnement.
J'ai repris mon courage à 2 mains et j'ai recommencé avec une table fraîche
(enfin avec les données reçues telles que auparavant) et cela a marché.
Encore merci
André

"Phil" a écrit dans le message de news:

Merci Phil pour ton intervention. Malheureusement, comme je le disais,
je suis réellement néophyte. J'ai fait ce que tu as écrit et ... aucun
changement.
Merci pour ta peine André
"Phil" a écrit dans le message de news:

Bonjour à toutes et tous,

Voilà, je suis un grand néophyte qui comprends vite quand on lui a
expliqué longtemps.
J'ai reçu une table Access 2003 dans laquelle un cham "adresse" a été
rempli avec le nom de la rue, suivi après une virgule du n° de
l'immeuble.
Pour des raisons de tri, je souhaite créer un champ n° et scinder le
champ "adresse" en supprimant la , et le n° pour l'injecter dans le
nouveau champ "n°".
Est-il possible de réaliser cette opération en une fois pour toute la
table?
Déjà merci pour vos avis éclairés
André


Bonsoir,

je te propose
1) de créer une première requète sélection basée sur ta table avec
tous ses champs (ou seulement ceux qui te sont utiles) auxquel tu
ajoutes un champs calculé composé comme Position :
DansChaîne([adresse];",")
(n'oublies pas l'accent circonflexe sur le i de chaine)
cela te donne la position de la virgule pour chaque enregistrement.

2) tu créé une seconde requète basée sur la première avec deux champs
supplémentaires
le premier comme AdrCourte:left([adresse];position-1)
le second comme N°:mid([adresse];position+1)

Connaissant la position de la virgule il est aisé de couper le champ
en deux. Vérifies si c'est bien position-1 et +1 et adaptes si besoin.

Bonne réception
Phil


pour être plus complet tu peux ajouter la fonction Trim pour exclure
les espaces parasites devant et derrière les parties du champs
"adresse" tronqués
les champs deviennent
AdrCourte:trim(left([adresse];position-1))
N°:trim(mid([adresse];position+1))

Phil





Bonsoir André,

excuse moi si je n'ai pas été clair et si je te répond ce soir mais je me
connecte de mon domicile.
Pour le fun et pour ceux qui sont réfrataires au code VBA ou souhaitent
ne pas s'en servir je reprend mon explication

1) tu créé une requète basée sur la table contenant les listes d'adresses
requêtes > nouveau > mode création
dans "afficher la table" tu choisis dans l'onglet table celle qui
contient les données de tes écoles. puis clic sur le bouton fermer.

tu sélectionnes les champs dont tu as besoin ou tous en fonction de tes
besoins
puis au bout à droite des différents champs tu en ajoutes un que tu écris
de toute pièce en tapant exactement la ligne suivante sur la ligne champ
en respectant tous les signes et caractères (y compris l'accent
circonflexe) :
Position : DansChaîne([adresse];",")

enregistre la macro en lui donnant un nom significatif

quand tu l'exécutes tu obtiens les données de toute ta table avec un
champ supplémentaire appelé "position" qui indique à quelle position se
trouve la virgule dans le champs "adresse"
explication du fonctionnement :
la fonction "DansChaîne" indique la position de "," (le caractère
virgule) dans le champ [adresse]
le champ calculé du résultat s'appelle "Position"


cette requête n'est qu'une étape première étape

on poursuit en reprenant depuis le début

2) tu créé une nouvelle requète basée sur la première requête ci-dessus
contenant les données des écoles plus la position de la virgule

requêtes > nouveau > mode création
dans "afficher la table" tu choisis dans l'onglet "requête" (trés
important l'onglet requête) celle que tu viens de créer ci-dessus puis
clic sur le bouton fermer.

tu sélectionnes les champs dont tu as besoin
puis au bout à droite des différents champs tu en ajoutes deux que tu
écris de toute pièce en tapant exactement les deux lignes suivante sur la
ligne champ dans deux cases différentes :

Adr:trim(left([adresse];position-1))
Num:trim(mid([adresse];position+1))

explication de cette requète
elle est basée sur les données de la liste d'adresse à laquelle est
ajouté pour chaque enregistrement la "position" de la virgule dans chaque
champ "adresse" grace à la requête ci-dessus. On peut alors décomposer le
champ adresse avec dans un nouveau champ appelé "Adr" tout ce qui est à
gauche de la position de la virgule et dans un champ Num tout ce qui est
à droite de la virgule. La fonction Trim permet d'enlever les espaces
parasites qui peuvent être avant ou après la virgule
exemple pour une adresse comme ceci :
adresse = "Rue du général de Gaulle , 25"
va donner sans les fonctions "Trim"
Adr = "Rue du général de Gaulle " et Num = " 25"

avec les fonction Trim tu obtiens
Adr = "Rue du général de Gaulle" et Num = "25"
les espaces parasites à la fin du nom de rue et avant le numéro sont
supprimés.

J'espère avoir été plus clair et te permettre de comprendre le
fonctionnement de mes propositions de requêtes sans recopier du code VBA
que tu ne comprends pas et que les spécialistes n'arrivent pas toujours à
faire fonctionner ;-)

Il existe encore un cas celui où les adresses n'ont pas de virgule, la 2°
requête va (peut être) se bloquer car la position sera 0 (zéro) pour y
pallier il faut tester la valeur de position pour ne pas avoir de
blocage.
modifies les deux champs de la seconde requête comme suit

Adr:iif([position]>0;trim(left([adresse];position-1);[adresse])
Num:iif([position]>0;trim(mid([adresse];position+1));"")

explication :
pour le premier champ si position est >0 on effectue le calcul tel que
précédement expliqué "trim(left([adresse];position-1)" sinon
ont retourne le champ [adresse] complet (il n'y a pas de numéro derrière
une virgule dans cet enregistrement).
pour le second champ même test et même opération si "position" >0 mais si
"position" =0 ont ne retourne rien dans le champ Num (c'est les deux ""
en fin de ligne).

Merci de me faire savoir si cela a pu t'aider.

Phil


petite précision
cette méthode ne modifie pas les données et effectue un affichage
dynamique des données.
une fois testée la seconde requète peut être transformée en requête de
création de table, puis après son exécution la table d'origine sera
supprimée.

Phil









1 2