Transposition VBA

MomoAbou Messages postés 18 Date d'inscription   Statut Membre Dernière intervention   -  
 MomoAbou -
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

ThauTheme Messages postés 1442 Date d'inscription   Statut Membre Dernière intervention   160
 
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é...

0
MomoAbou Messages postés 18 Date d'inscription   Statut Membre Dernière intervention  
 
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/
0
ThauTheme Messages postés 1442 Date d'inscription   Statut Membre Dernière intervention   160
 
Bonjour MomoAbou, bonjour le forum,

Je préfèrerais travailler avec le fichier corrigé...
0
MomoAbou Messages postés 18 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour ThauTheme,

voici le lien avec les corrections. J'ai un peu réadapté

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

Merci beaucoup.


Momo
0
ThauTheme Messages postés 1442 Date d'inscription   Statut Membre Dernière intervention   160
 
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...

0
MomoAbou Messages postés 18 Date d'inscription   Statut Membre Dernière intervention  
 
Merci beaucoup Thautheme. Je vais tester ton code et te reviens. Merci beaucoup.
0
MomoAbou Messages postés 18 Date d'inscription   Statut Membre Dernière intervention  
 
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ThauTheme Messages postés 1442 Date d'inscription   Statut Membre Dernière intervention   160
 
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é...
0
MomoAbou Messages postés 18 Date d'inscription   Statut Membre Dernière intervention  
 
;) 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.
0
MomoAbou > MomoAbou Messages postés 18 Date d'inscription   Statut Membre Dernière intervention  
 
Hello 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.
0
MomoAbou Messages postés 18 Date d'inscription   Statut Membre Dernière intervention  
 
Je viens de tester le code en plus. Merci beaucoup le code est complet.

Merci
0