Bonjour!
Alors, voici mon nouveau défi.
J'ai une base de données avec une table, appelons-là Enregistrement, dont un des champs texte, appelons-le Sectors, est rempli de chaine de caractères de la façon suivante:
"aaaa;bbbbbbbb;cccccccc;..."
C'est à dire un ensemble de mots séparés entre eux par un point virgule. Appelons chacun de ces mots "Secteur1", "Secteur2", "Secteur3", etc.
J'ai également, dans cette table une série de 15 champs nommés Sector1, Sector2, etc. jusqu'à Sector15
Ce que je veux faire c'est extraire chacun de ces mots "Secteur1", "Secteur2", "Secteur3", etc. et renseigner les champs Sector1, Sector2, Sector3, etc. avec chacun de ces mots. S'il n'y a par exemple que 4 mots, alors seuls les champs Sector1, Sector2, Sector3, Sector4 seront renseignés, les autres seront laissés vides.
Je sais que le nombre de Secteurs ne peut excéder 15 et je connais ces 15 mots.
Je sais également que si la valeur du champ Sectors ne contient qu'un seul Secteur (par exemple si la valeur de Sectors est "aaaa"), il n'y aura pas de point virgule dedans.
Je sais enfin qu'il n'y aura pas de point virgule à la fin du dernier Secteur de Sectors (par exemple si la valeur de Sectors est "aaaa;bbbbbbbb;cccc", il n'y pas de point virgule après "cccc").
Grâce à Eric KERGRESSE, j'ai appris que la commande split me permettait d'extraire ces Secteur.
J'ai donc écris la fonction suivante:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| Public Function MiseAjourSecteur()
Dim NombrePointVirgule As Integer
Dim PointVirgule As String
Dim NombreSecteurs As Integer
Dim SecteurUnique As String
Dim PlusieursSecteurs as String
Dim Secteur() As String
Dim ChampSecteur As Fields
Dim i As Integer
Dim j as integer
Set db = CurrentDb()
Set Enregistrement = db.OpenRecordset("Matable")
PointVirgule = ";"
Enregistrement.MoveFirst
Do Until Enregistrement.EOF
Enregistrement.Edit |
Ci-dessous, je récupère le nombre de points virgules contenus dans la valeur de mon champ Sectors
NombrePointVirgule = Len(Enregistrement!Sectors) - Len(Replace(Enregistrement!Sectors, PointVirgule, ""))
Puis, s'il n'y en a pas, cela veut dire que Sectors ne contient qu'un seul mot, donc je vais directement renseigner le champ Sector1 avec la valeur du champ Sectors.
1 2 3 4 5
| If NombrePointVirgule = 0 Then
SecteurUnique = Enregistrement!Sectors
Enregistrement!Sector1 = SecteurUnique
Goto Suite
End If |
"Suite" renvoie en fin s'itération
A ce stade du code, on sait qu'il y a plusieurs Secteurs dans Sectors
PlusieursSecteurs= Enregistrement!Sectors
On va donc isoler chacun des Secteur avec la commande "Split"
Secteur() = Split(PlusieursSecteurs, PointVirgule)
Puis on va rechercher le nombre de Secteurs
NombreSecteurs = Len(Enregistrement!Sectors) - Len(Replace(Enregistrement!Sectors, PointVirgule, "")) + 1
Puis je veux faire une boucle sur les champs Sector1, Sector2, etc. jusqu'à NombreSecteurs pour les renseigner avec les valeurs issues de Split
1 2
| For i = 1 To NombreSecteurs
j = i - 1 |
Et, là arrive le problème, je veux renseigner mon champ dont le nom dépend de la valeur i, je ne sais pas écrire:
1 2
| Donne la valeur Secteur(j) à mon champ Sector"i", un truc du genre:
Enregistrement!Secteur"i" = Secteur(j), sachant que, tel qu'écris, VBA ne comprends bien sûr pas. |
La suite est le reste de la boucle ne me pose a priori pas de problèmes
1 2 3 4 5 6
| Next i
Suite:
Enregistrement.Update
Enregistrement.MoveNext
Loop
End Function |
Voilà, voilà, j'en deviens chauve à force de m'y arracher les cheveux.
Un grand merci pour qui saura me dire.
Partager