Tableau imbriqués / Transformation de données

Bonjour,

Je me casse la tête depuis le début de la journée.

J'explique : j'ai un logiciel sur vba utilisant un userform qui est un questionnaire.

J'y récupère plusieurs informations --> (NOM:ENTREPRISE:EXTERNE:VIDE:ADDRESSE_ENTREPRISE:PAYS:DATA) ou (NOM:ENTREPRISE:VIDE:INTERNE:ADDRESSE_ENTREPRISE:PAYS:DATA (depend de l'origine de la personne (externe ou interne))

J'ai changé mon userform pour refaire ce questionnaire pour ma deuxième version de logiciel.

J'y récupère plusieurs informations MAIS PAS TOUTES LES MEMES

--> (NOM:ENTREPRISE:EXTERNE (OU INTERNE):ADRESSE_ENTREPRISE:PAYSDORIGINE:PAYSDARRIVEE:DATA)

Lorsque l'on enregistre sa réponse, on a toutes nos données renseignées dans une colonne (chaque donnée à la ligne) de mon excel et on peut ajouter une nouvelle personne (le questionnaire se rouvre, et on remplit de nouveaux les infos et ca s'enregistre colonne suivante)

Je vais aller voir mes équipes pour récupérer leurs données et les insérer dans mon nouvel outil. Le soucis, c'est que vu que cette question à changer, il m'est difficile de récupérer la data de mon logiciel V1 et de la transformer et de l'insérer dans mon logiciel V2.

Mes données sont enregistrés comme suit dans une seule cellule NOM:ENTREPRISE:EXTERNE:VIDE:ADDRESSE_ENTREPRISE:PAYS:DATA|NOM2:ENTREPRISE2:EXTERNE2:VIDE2:ADDRESSE_ENTREPRISE2:PAYS2:DATA2

Chaque personne est séparée par une "|" et chaque donnée par ":".

En passant par tab, je cherche à récupérer chaque valeur et les transformer comme suit toujours dans une seule cellule

NOM:ENTREPRISE:EXTERNE (OU INTERNE):ADDRESSE_ENTREPRISE:PAYSDORIGINE:PAYSDARRIVEE:DATA|NOM2:ENTREPRISE2:ADDRESSE_ENTREPRISE2:PAYSDORIGINE2:PAYSDARRIVEE2:DATA2

Je fais donc un premier tableau qui va me split mes données à chaque "|" puis un deuxieme tableau qui va split à chaque ":"

For ii = 3 To Nb_LIGNE 'faire ca pour chaque équipe présente dans mon classeur, une ligne correspond a une équipe

    Dim tab1() As String
    Dim tab2() As String
    Dim A As String

    Sheets("BDD").Select
    valeur = Cells(ii, "X").value 'variable avec toute la donnée de ma cellule
    tab1 = Split(valeur, "|") 'je split a chaque "|"

    For iii = 0 To UBound(tab1)
        A = tab1(iii)
        nb = UBound(tab1) 'le nombre de personne enregistré par questionnaire n'est pas constant (on peut en avoir 1 comme on peut en avoir 100) 
        tab2 = Split(tab1(iii), ":") 
        For iiii = 0 To UBound(tab2)
            b = tab2(iiii)
            ' j'avais inséré ça dans ma boucle for mais je récupère seulement dans ma cellule les données correspondantes à la derniere personne de ma cellule (apres la derniere barre, prend toute la data)
           If tab2(2) <> "" Then  'si externe
                       Cells(ii, "X").value = "tab2(0) & ":" & tab2(1) & ":" & tab2(2) & ":" & tab2(4) & ":[color=#FF0000]pas de valeur ici c'est pour le pays d origine absent de la version 1[/color] :" & tab2(5)  & ":" & tab2(6)  
           Else 'si interne
                    Cells(ii, "X").value ="tab2(0) & ":" & tab2(1) & ":" & tab2(3) & ":" & tab2(4) & ":[color=#FF0000]pas de valeur ici c'est pour le pays d origine absent de la version 1[/color] :" & tab2(5)  & ":" & tab2(6)  
        End If

        Next iiii

   Next iii

   Next ii

Je peux faire un tab1(tab2) ??

Je sais pas comment faire en sorte que dans ma cellule on retrouve toutes mes données. J'arrive à ne recuperer que les données d'une seule personne ce qui me parait logique avec ce code mais je sais pas cmt le faire pour tablatter dans un tableau hahha

Merci pour votre aide, c'est galere j'espere que vous comprenez facilement

Juste pour faire plus simple pour les courageux car j'ai l'impression que suis pas clair

J'ai ça en cellule A1 : R1:R2:R3:R4:R5|R1:R2:R3:R4:R5|R1:R2:R3:R4:R5 (3 questionnaires remplis)

en A2 j'ai ça : R1:R2:R3:R4:R5|R1:R2:R3:R4:R5|R1:R2:R3:R4:R5|R1:R2:R3:R4:R5|R1:R2:R3:R4:R5|R1:R2:R3:R4:R5 (6 questionnaires remplis)

Ma question 3 disparaît et est remplacé par une nouvelle question + nouvelle question Q6

Je veux donc que dans ma cellule A1 j'ai : R1:R2:(vide):R4:R5:(vide)|R1:R2:(vide):R4:R5:(vide)|R1:R2:(vide):R4:R5:(vide)

et en A2 : R1:R2:(vide):R4:R5:(vide)|R1:R2:(vide):R4:R5:(vide)|R1:R2:(vide):R4:R5:(vide)|R1:R2:(vide):R4:R5:(vide)|R1:R2:(vide):R4:R5:(vide)|R1:R2:(vide):R4:R5:(vide)

Voila comment résumer le problème

Bonjour,

C'est un peu confus ! Je laisse de côté ton code. On reprend le problème point par point.

Tu as des cellules qui groupent plusieurs enregistrements séparés par des "|".

On reste sur le traitement de chaque cellule-ligne.

Les données de chaque enregistrement comportent 7 éléments dont un vide (en 3e ou 4e position...)

Ton enregistrement cible comporte aussi 7 éléments, en fusionnant les 3 et 4 de l'enregistrement initial, il va donc lui en manquer au moins 1 qui ne figure pas dans l'enregistrement initial (en supposant que PAYS [initial] équivaut à PAYSDORIGINE [cible]).

Si c'est le cas, on n'a que PAYSDARRIVEE à remplacer par un vide dans la conversion.

Un point à éclaircir est ce que désigne vide : il n'y a rien, donc dans ta chaîne on a "::" marquant l'emplacement du vide, ou bien la mention 'vide' figure ?

Autre point : tu sépares et convertis tes enregistrements pour les replacer sous forme de chaînes chacun dans une cellule, ou l'objectif final est d'en faire un tableau (ou chaque élément trouvera place dans une cellule) ?

Le choix des options techniques dépend de l'éclaircissement de ces questions.

Cordialement.

Bonjour MFerrand,

Merci de ta réponse

Alors je réponds à toutes tes questions !

Déjà, je veux que l'ensemble de mes données d'une équipe soit présent dans une seule cellule , donc une fois que j'ai découpé pour sortir les valeurs dont j'ai besoin je dois concaténer de nouveau pour retrouver le meme format d'origine (data séparée par ":" et "|")

je ne veux pas qu'il apparaissent vide mais qu'il apparaisse bien "::":)

Et du coup je travaille vraiment que sur une seule cellule a chaque fois, je sors toute ma data de la cellule A1 par ex, et je la reforme et remet en A1 !

J'espere avoir été clair

Je pense qu'il faut que je fasse mon split de mon ubound(valeur) et qu'a chaque fois ce "ubound valeur" est mon compteur de données séparés par "|"

Pour les données séparées par ":" , la chaine est égale à 7 tout le temps, donc plus facile

Est ce qu'il faudrait pas que j'utilise la fonction arraytopipe ?

Bonjour,

Tu n'as pas confirmé la correspondance PAYS-PAYSDORIGINE, je suppose donc qu'elle est établie et que l'emplacement PAYSDARRIVEE doit rester vide.

Je reprends ta procédure, dont on ne sait ce qui précédait puisqu'elle est incomplètement citée. Je conserve tes variables avec une petite modification, tab1 et tab2 en Variant (obligatoire pour cette utilisation). Et je rétablis la déclaration de toutes les variables utilisées en tête de procédure.

En opérant simplement la conversion, on n'a plus grand chose à faire :

  • on extrait le contenu de la cellule sous forme de tableau (c'était déjà fait)
  • on extrait chaque élément du tableau sous forme de tableau (déjà fait aussi)
  • mais là on convertit : test sur l'élément 3: si non vide on le passe en 2 (qui alors était vide), on fait passer les éléments 4 et 5 en 3 et 4 respectivement, on vide l'élément 5, la conversion est faite
  • et on réaffecte le tableau modifié à son tableau d'origine, sous forme de chaîne comme initialement
  • une fois tous les éléments du tableau extrait de la cellule traités, on le réaffecte à son tour à la cellule, sous forme de chaîne...
  • et on passe à la cellule suivante.
    Dim tab1, tab2, Nb_LIGNE%, ii%, iii%, iiii%
    '???
    With Worksheets("BDD")
        Nb_LIGNE = .Cells(.Rows.Count, 24).End(xlUp).Row
        For ii = 3 To Nb_LIGNE
            tab1 = Split(.Cells(ii, 24), "|")
            For iii = 0 To UBound(tab1)
                tab2 = Split(tab1(iii), ":")
                If tab2(3) <> "" Then tab2(2) = tab2(3)
                For iiii = 3 To 4
                    tab2(iiii) = tab2(iiii + 1)
                Next iiii
                tab2(5) = ""
                tab1(iii) = Join(tab2, ":")
            Next iii
            .Cells(ii, 24) = Join(tab1, "|")
        Next ii
    End With

Cordialement.

valeur = Cells(ii, "X").value
        tab1 = Split(valeur, "|")
        resultat = ""

        For iii = 0 To UBound(tab1)

            nb = UBound(tab1)
            tab2 = Split(tab1(iii), ":")
            If resultat = "" Then
                If tab2(3) = "" Then 'if external data
                    resultat = "No:No:" & tab2(0) & ":" & tab2(2) & ":" & tab2(5) & "::" & tab2(4) & ":" & tab2(7) & ":" & tab2(6)
                Else 'if internal data
                    resultat = "No:No:" & tab2(0) & ":" & tab2(3) & ":" & tab2(5) & "::" & tab2(4) & ":" & tab2(7) & ":" & tab2(6)
                End If
            Else
                If tab2(3) = "" Then 'if external data
                    resultat = resultat & "|" & "No:No:" & tab2(0) & ":" & tab2(2) & ":" & tab2(5) & "::" & tab2(4) & ":" & tab2(7) & ":" & tab2(6)
                Else
                    resultat = resultat & "|" & "No:No:" & tab2(0) & ":" & tab2(3) & ":" & tab2(5) & "::" & tab2(4) & ":" & tab2(7) & ":" & tab2(6)
                End If
            End If
        Next iii
        Cells(ii, "X").value = resultat
        

Au final j'ai réussi par moi meme, mais merci de ton aide , on a pratiquement la meme technique, une seule boucle suffisait (l'exemple de mon code ici est seulement pour une seule ligne)

par contre ta boucle qui fait :

For iiii = 3 To 4

tab2(iiii) = tab2(iiii + 1)

Next iiii

c'est pour quoi faire cette incrémentation de tableau ?

Apparemment tu n'as pas compris le fonctionnement du code proposé Il n'y a pas d'incrémentation, mais déplacement de valeurs dans le tableau pour les placer à leur position finale.

C'est la manoeuvre minimale dans le cycle chaîne=>tableau=>modif=>chaîne.

Si c'est pour revenir à ton code initial, il était inutile que je prenne la peine de faire cette illustration.

Cordialement.

Rechercher des sujets similaires à "tableau imbriques transformation donnees"