Diviser un champ access en 2 champs [Résolu/Fermé]

Signaler
Messages postés
255
Date d'inscription
mardi 16 février 2010
Statut
Membre
Dernière intervention
5 juin 2014
-
Messages postés
255
Date d'inscription
mardi 16 février 2010
Statut
Membre
Dernière intervention
5 juin 2014
-
Bonjour,
je suis étudiant en informatique, je suis en dernière année et je fais mon stage de fin d'étude. Ce stage consiste notamment à réunir les différentes bases de données de l'entreprise en une seule. Elles se trouvent toutes soit sous access (une seule table), soit sous excel (c'est plus un tableur mais ca peut être considéré comme une base de données). J'ai donc créé ma base de données, le plus simple pour le rapatriement des données est de travailler en access.

Voila pour la petite mise en situation, voici mon problème, dans les différentes bases de données de l'entreprise, l'adresse est répertorié de cette façon-ci : N°rue/boite et rue forment un champs, code postal un autre et ville un autre. Pour le code postal et la ville c'est parfait je peux récupérer les informations simplement mais pour le champs N°rue/boite et rue, je ne peux pas le récupérer ainsi, j'aimerais bien séparer la rue du n°rue/boite.

Le problème est que ce n'est jamais formaté de la même façon, j'ai plusieurs formatage différents, dont voici un exemple:
72, rue des X
72 , rue des X
72 ,rue des X
72 , rue des X
72,rue des X
72 rue des X
J'ai réussi à gérer les 4 premiers cas avec un code vba que j'ai placé sur le clic bouton d'un formulaire que voici :

Private Sub Commande0_Click()

Dim a As Variant
Dim RS As DAO.Recordset
Dim RSInsert As DAO.Recordset
Dim i As Integer
Set RS = CurrentDb.OpenRecordset("SELECT Champ1 FROM TAncienne")
Set RSInsert = CurrentDb.OpenRecordset("SELECT * FROM TNouvelle")
Do Until RS.EOF
a = Split(RS!Champ1, ", ")

RSInsert.AddNew
For i = 0 To UBound(a)
RSInsert.Fields("Champ" & i + 1).Value = a(i)
Next i
RSInsert.Update
RS.MoveNext
Loop
Do Until RS.EOF
a = Split(RS!Champ1, " , ")

RSInsert.AddNew
For i = 0 To UBound(a)
RSInsert.Fields("Champ" & i + 1).Value = a(i)
Next i
RSInsert.Update
RS.MoveNext
Loop
Do Until RS.EOF
a = Split(RS!Champ1, ",")

RSInsert.AddNew
For i = 0 To UBound(a)
RSInsert.Fields("Champ" & i + 1).Value = a(i)
Next i
RSInsert.Update
RS.MoveNext
Loop
Do Until RS.EOF
a = Split(RS!Champ1, " ,")

RSInsert.AddNew
For i = 0 To UBound(a)
RSInsert.Fields("Champ" & i + 1).Value = a(i)
Next i
RSInsert.Update
RS.MoveNext
Loop

Do Until RS.EOF
a = Split(RS!Champ1)

RSInsert.AddNew
For i = 0 To UBound(a)
RSInsert.Fields("Champ" & i + 1).Value = a(i)
Next i
RSInsert.Update
RS.MoveNext
Loop

RS.Close
RSInsert.Close
End Sub

Une petite explication de mon code, je sélectionne le champs 1 de ma première table, et je réécris les modifications dans une autre table, dans x nombre de champs (dans mon cas, c'est 2 mais bon). J'utilise split qui me permet de séparer le contenu du champs selon une certain séparateur, ici c'est la virgule.
Ca fonctionne bien pour mes 4 premiers type d'exemples, mais pas pour les deux derniers, quand le numéro n'est séparé du nom rue que par la virgule(sans espace) ou quand il n'y a qu'un espace.

Je cherche donc le moyen de faire pour ces deux cas, ou une meilleure solution pour le tout si il faut.
Le numéro est une fois avant le nom de rue, une fois après, je ne peux donc pas jouer sur l'emplacement du chiffre. Peut être sur le type, que ce soit un nombre ou une lettre.

J'avais essayé par split, mais pour une raison que j'ignore ca ne fonctionne pas pour ces deux cas la.
Merci d'avance pour votre aide, j'espère avoir été assez clair.

1 réponse

Messages postés
255
Date d'inscription
mardi 16 février 2010
Statut
Membre
Dernière intervention
5 juin 2014
22
Bonjour, je remonte ce post pour dire que j'ai avancé mais que je ne suis pas encore à une solution viable et que j'ai encore besoin d'aide.

Voici un autre code que j'essaye de mettre en place :


Private Sub Commande3_Click()
Dim maVal As Long
Dim maChaine As String
 
'Declaration des variables
'Dim .....
'Debut
 Dim i As Byte, Nb As Byte
    Dim Cible As String, Resultat As String
    Dim Nombre As Double
    Set maBase = CurrentDb()
    Set maTableAncienne = maBase.OpenRecordset("SELECT Champ1 FROM TAncienne")
        Set maNouvelleNombre = maBase.OpenRecordset("SELECT Champ1 FROM TNouvelle")
            Set maNouvelleTexte = maBase.OpenRecordset("SELECT Champ2 FROM TNouvelle")
'verifie que l'on est pas en fin d'enregistrement (ici table: maTableAncienne)
If Not maTableAncienne.EOF Then

'on atteint la première ligne
maTableAncienne.MoveFirst
'tant que l'on est pas arrivé au bout
Do While Not maTableAncienne.EOF

 


 
'on affiche la valeur de monChamps dans la msgBox
MsgBox maTableAncienne!champ1   'Champs de la ligne en lecture
 
'traitement

   Cible = maTableAncienne!champ1
 
    
    For i = 1 To Len(Cible)
        If IsNumeric(Mid(Cible, i, 1)) Then
        Nombre = Val(Mid(Cible, i, Len(Cible) - i + 1))
        Nb = Nb + 1
        Resultat = Resultat & Nombre & vb
        i = i + Len(Str(Nombre)) - 1
       DoCmd.RunSQL "INSERT INTO TNouvelle VALUES(Résultat, nb)"
       End If
    Next 
'On passe à la ligne suivante
maTableAncienne.MoveNext
'On boucle
Loop
'on ferme nos variables utilisées
maTableAncienne.Close
maBase.Close


End If

End Sub 


Normalement avec la fonction val, je suis censé récupérer les informations se trouvant dans ma première table, et après l'avoir pris, le séparer et les stocker dans les variables, la requêtes sql sert à inserer dans la nouvelle table ce qu'il y a dans les variable.

Je ne sais pas si le code fonctionne, on dirait que j'ai un problème avec ma requête sql, il ne trouve pas automatiquement les valeurs de résultat et nb qui sont calculé juste au dessus de lui, et me demande de les insérer, avec la msgbox juste avant je sais ce que j'ai à taper, mais ca reviens au même que de le séparer manuellement.

Je ne vois pas pourquoi il ne prend pas les valeurs alors qu'elles se trouve juste à côté, je suis donc bloqué à ce niveau et ne peux plus avancer, j'ai essayé différente option, mais rien n'y fait, soit je m'y prend mal dans la requète soit je fais une erreur plus haut mais je ne la vois pas.
La boucle se fait bien, donc le problème doit se trouver quelque part dans les instruction en boucle mais je vois pas où

J'espère avoir été clair, merci d'avance pour l'aide que vous pourriez m'apporter.