IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Access Discussion :

Renseigner des champs issus de chaines de caractère extraites d'un autre champ


Sujet :

Access

  1. #1
    Membre à l'essai
    Homme Profil pro
    Autres
    Inscrit en
    Février 2018
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Autres

    Informations forums :
    Inscription : Février 2018
    Messages : 48
    Points : 18
    Points
    18
    Par défaut Renseigner des champs issus de chaines de caractère extraites d'un autre champ
    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:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PlusieursSecteurs= Enregistrement!Sectors
    On va donc isoler chacun des Secteur avec la commande "Split"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Secteur() = Split(PlusieursSecteurs, PointVirgule)
    Puis on va rechercher le nombre de Secteurs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Membre à l'essai
    Homme Profil pro
    Autres
    Inscrit en
    Février 2018
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Autres

    Informations forums :
    Inscription : Février 2018
    Messages : 48
    Points : 18
    Points
    18
    Par défaut
    Cherchez plus, j'ai trouvé sur le site. Le code magique était:
    Enregistrement.Fields("Sector" & i) = Secteur(j)
    Je vous donne l'ensemble du code de la fonction, cela peut toujours servir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    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
     
    Set db = CurrentDb()
    Set Enregistrement = db.OpenRecordset("MontableaudeBordComplet")
    PointVirgule = ";"
    Enregistrement.MoveFirst
    Do Until Enregistrement.EOF
    Enregistrement.Edit
    NombrePointVirgule = Len(Enregistrement!Sectors) - Len(Replace(Enregistrement!Sectors, PointVirgule, ""))
    If NombrePointVirgule = 0 Then
        SecteurUnique = Enregistrement!Sectors
        Enregistrement!Sector1 = SecteurUnique
        GoTo Suite
    End If
    PlusieursSecteurs = Enregistrement!Sectors
    Secteur() = Split(PlusieursSecteurs, PointVirgule)
    NombreSecteurs = Len(Enregistrement!Sectors) - Len(Replace(Enregistrement!Sectors, PointVirgule, "")) + 1
    For i = 1 To NombreSecteurs
        j = i - 1
        Enregistrement.Fields("Sector" & i) = Secteur(j)
    Next i
    Suite:
    Enregistrement.Update
    Enregistrement.MoveNext
    Loop
    End Function

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Tableaux] Extraire des mots d'une chaine de caractères
    Par pratiquement dans le forum Langage
    Réponses: 5
    Dernier message: 24/01/2008, 09h20
  2. [DOM] Rajouter des éléments à l’aide de chaine de caractère
    Par loic911 dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 05/04/2007, 16h14
  3. extraire des entiers d'une chaine de caractère
    Par 18Marie dans le forum Langage
    Réponses: 9
    Dernier message: 10/08/2006, 11h17
  4. [MySQL] extraire des nombre d'une chaine de caractères et addition
    Par Yotho dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 04/03/2006, 16h54
  5. Réponses: 9
    Dernier message: 17/01/2003, 11h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo