Transposition VBA

Bonjour,

J'ai besoin votre aide pour transposer des réponses Ligne vers colonne. Je reçois des données d'enquêtes avec en Ligne les indicateurs et en colonne les codes sites. Il y a trois types de réponse : Text; Yes/no ou number. Ainsi pour chaque site je voudrais avoir en colonne1 le site répété autant de fois qu'il y a d'indicateurs, Colonne 2 les codes des indicateurs, colonne trois uniquement les réponses de type Yes / No, colonne 4 Number et colonne 5 uniquement les réponses de type Text. Les fichiers à traiter se trouvent tous dans le même répertoire (54 fichiers) tous au même format. On passe au site suivant à chaque fois qu'on a traité toutes réponses d'un site.

Je joins un fichier exemple de ce que je souhaite obtenir en de ce que j'ai en entrée.

https://www.cjoint.com/c/FHrmxLVgk8w

Merci beaucoup d'avance.

Momo

5 réponses

  • Votes
  • Date
  • Date décroissante
  1. Bonjour MomoAbou, bonjour le forum,

    Difficile de comprendre puisque le résultat attendu ne correspond pas à ce que tu as entré :
    • F2 devrait être : Type Yes/No
    • G2 devrait être : Type Yes/No
    • I2 devrait être : Type Yes/No
    • J2 devrait être : Type Number
    • C26 devrait se trouver en D26

    Je ne vais donc pas te proposer une macro sans être sûr du résultat escompté...

    1. Bonjour Thautheme,

      vous avez tout à fait raison. J'avais fait les modifications mais je n'avais pas enregistré semble t-il.

      Votre description est celle que je souhaite faire. Sachant que l'ordre des type d'indicateurs importent peu, seul leur intitulé importe.

      Merci par avance.

      Je peux envoyer le fichier avec les corrections ci dessus si besoin/
      1. Re,

        Si l'onglet où se trouvent les données initiales est le premier, la transposition se fait dans dans le second onglet. Sinon il faudra adapter le code ci-dessous :

        Sub Macro1()
        Dim OS As Worksheet 'définit la variable OS (Onglet Source)
        Dim OD As Worksheet 'définit la variable OD (Onglet Destination)
        Dim TV As Variant 'définit la variable TV (Tableau des Valeurs)
        Dim I As Integer 'définit la variable I (Incrément)
        Dim J As Integer 'définit la variable J (incrément)
        Dim LI As Integer 'définit la variable LI (LIgne)
        Dim COL As Byte 'définit la variable COL (COLonne)
        
        Set OS = Worksheets(1) 'définit l'onglet source OS (à adapter)
        Set OD = Worksheets(2) 'définit l'onglet destination OD (à adapter)
        OD.Cells.ClearContents 'efface d'enventuelles anciennes données dans l'onglet destination
        OD.Range("A1").Value = "Site" 'étiquette en A1
        OD.Range("B1").Value = "Indicateur" 'étiquette en B1
        OD.Range("C1").Value = "Type Yes/No" 'étiquette en C1
        OD.Range("D1").Value = "Type Number" 'étiquette en D1
        OD.Range("E1").Value = "Type Text" 'étiquette en E1
        TV = OS.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
        For I = 3 To UBound(TV, 1) 'boucle 1 : sur toutes les lignes I du tableau des valeurs TV (en partant de la troisième)
            For J = 1 To UBound(TV, 2) - 1 'boucle 2 : sur toutes les colonnes J du tableau des valeurs TV
                LI = OD.Range("A" & Application.Rows.Count).End(xlUp).Row + 1 'définit la ligne LI
                OD.Cells(LI, 1).Value = TV(I, 1) 'renvoie le nom du site dans la cellule ligne I, colonne 1 (=A) de OD
                OD.Cells(LI, 2).Value = TV(1, J + 1) 'renvoie le nom de l'indicateur dans la cellule ligne LI colonne 2 de OD
                Select Case TV(2, J + 1) 'agit en fonction de la valeur de la donnée ligne 2 colonne J+1 de TV
                    Case "Type Yes/No" 'cas
                        COL = 3 'définit la colonne COL
                    Case "Type Number" 'cas
                        COL = 4 'définit la colonne COL
                    Case "Type Text" 'cas
                        COL = 5 'définit la colonne COL
                End Select 'fin de l'action en fonction de donnée ligne 2 colonne J+1 de TV
                'renvoie dans la cellule ligne LI colonne COL de OD, la donnée ligne I colonne J+1 de TV
                OD.Cells(LI, COL).Value = TV(I, J + 1)
            Next J 'prochaine colonne de la boucle 2
        Next I 'prochaine ligne de la boucle 1
        End Sub


        Tu peux rajouter/supprimer des indicateurs, la macro s'adapte. En revanche, Il faut que le tableau du premier onglet commence toujours avec les deux premières lignes d'étiquettes...

        1. Merci beaucoup Thautheme. Je vais tester ton code et te reviens. Merci beaucoup.
        2. Bonjour Thauthème,

          Merci beaucoup. J'ai testé le code et il marche à merveille.
          J'ai juste une question, est ce que c'est possible qu'au lieu de créer la sortie sur un deuxième onglet, la créer sur un autre fichier, au format CSV?

          Merci beaucoup pour ton aide.

          Cdt
      2. Bonjour MomoAbou, bonjour le forum,

        Arf ! La flemme de tout refaire. Essaie ce compromis en rajoutant les deux lignes ci-dessous à la fin du premier code que je t'avais proposé :

        OD.Copy
        ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\Destination.csv", FileFormat:=xlCSV, CreateBackup:=False
        


        Le fichier s'appellera "Destination.csv et sera enregistré dans le même dossier que le fichier d'origine. Modifie le nom dans le code si nécessaire. Non testé...
        1. ;) Merci beaucoup, j'aurai du rajouter cette info depuis le début! haha. Merci beaucoup en tout cas. Je vais rajouter ta proposition.

          Merci Thauthème.
        2. Je viens de tester le code en plus. Merci beaucoup le code est complet.

          Merci
        3. @MomoAbouHello Thautheme,

          je reviens encore avec une question!! j'ai rencontré aujourd'hui un problème en exécutant le code, apparemment ça ne prend pas en compte un grand nombre de sites : je souhaite que la macro puisse tourner pour pour 4000 Sites et 261 indicateurs!! je sais que les fichiers xls ou csv s’arrêtent à près de 65000 lignes, et me demandais du coup s'il y aurait une manipulation pour tout avoir sur un seul fichier avec plus de 65000 lignes, quitte à avoir un autre format similaire à xls ou csv (txt) par exemple.

          Est ce que changer le format du fichier de sorti en un fichier qui accepte plus de 65000 peut être fait en vba?
          Merci par avance.