Optimisation d'une macro de transposition

Fermé
chlovba Messages postés 5 Date d'inscription dimanche 8 avril 2018 Statut Membre Dernière intervention 10 avril 2018 - 8 avril 2018 à 23:27
f894009 Messages postés 17205 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 19 octobre 2024 - 10 avril 2018 à 08:07
Bonjour à tous,

Mon but est de transposer toutes les cellules d'une feuille pour la transposer sur une ligne dan sun tableau final "resultat"

J'ai crée la macro suivante:


Sub test()

Dim Ws As Worksheet
Dim i As Integer
Dim j As Integer
Dim k As Integer

For Each Ws In ThisWorkbook.Worksheets

For j = 1 To ThisWorkbook.Worksheets.Count - 1
For i = 1 To Ws.Cells(Rows.Count, 1).End(xlUp).Row
For k = 1 To Ws.Cells(i, Columns.Count).End(xlToLeft).Column

If Ws.Name = "Resultat" Then

Else

Ws.Cells(i, k).Copy Sheets("Resultat").Cells(j, Columns.Count).End(xlToLeft).Offset(0, 1)

End If

Next k
Next i
Next j

Next Ws
End Sub


A mon avis il y a mieux car la macro ne supporte pas plus de qqfeuilles avant de planter ...

Si vous avez des conseils pour optimiser ce code et permettre le traitement de centaines de feuilles...

Merci d'avance

Chlo
A voir également:

1 réponse

f894009 Messages postés 17205 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 19 octobre 2024 1 709
Modifié le 9 avril 2018 à 06:49
0
chlovba Messages postés 5 Date d'inscription dimanche 8 avril 2018 Statut Membre Dernière intervention 10 avril 2018
9 avril 2018 à 10:55
Bonjour,

Merci pour votre réponse.
Je n'ai pas réussi à monter un code autour de cette fonction .. meme en utilisant le lien vers le site complet (je débute et cela me dépasse un peu)
De plus mos données sont disposées alétoirement dans plusieurs feuilles et je souhaite parcourir une ligne jusqu'a une cellule vide et chacuqe ligne jsuqu'a une ligne vide.
Et transposer toutes les données dans une seule ligne sur une feuille "Resultat".
Ils serait interessant d'avoir les cellules dans l'ordre gauche vers droite puis ligne du dessous gauche vers droite etc....
Ce que fait mon code, mais de manière tres grossiere ... et absolument pas optimisée.

Merci pour votre aide.
0
f894009 Messages postés 17205 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 19 octobre 2024 1 709
9 avril 2018 à 13:24
Re
Tout a fait Thierry, mais l'instruction Application.transpose est tout a fait utilisable pour la copie par ligne vu que vous connaissez la derniere colonne de chaque ligne ce qui eviterait la boucle sur les colonnes
0
chlovba Messages postés 5 Date d'inscription dimanche 8 avril 2018 Statut Membre Dernière intervention 10 avril 2018
9 avril 2018 à 13:46
Je suis désolée mais je ne comprendds toujours pas a quel endroit utilser application.transposer et quelle partie de mon code il est interesssant de conserver.
Nomalement je tatone en changant des choses par ci par la en en voyent le resultat mais la je n'arrive meme pas a faire fonctionner le code.
Je débute vraiment et la je tourne en rond :)
0
f894009 Messages postés 17205 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 19 octobre 2024 1 709
9 avril 2018 à 18:39
Re,

Si j'ai bien compris votre besoin:

For Each Ws In ThisWorkbook.Worksheets
For j = 1 To ThisWorkbook.Worksheets.Count - 1 


vous faites x fois le travail avec cette ligne de code!!!!!!!!!!!!!!!!!!!!!!!!!!!!
For j = 1 To ThisWorkbook.Worksheets.Count - 1

code simplifie:

Sub test()
    Dim Ws As Worksheet
    Dim i As Long
    Dim j As Long
    Dim col As Long
    
    col = 0
    For Each Ws In ThisWorkbook.Worksheets
        With Ws
            If Ws.Name <> "Resultat" Then
                For i = 1 To .Cells(Rows.Count, 1).End(xlUp).Row
                    dercol = .Cells(i, Columns.Count).End(xlToLeft).Column
                    Set Plage = .Range(.Cells(i, 1), .Cells(i, dercol))
                    col = col + 1
                    Sheets("Resultat").Cells(1, col).Resize(dercol) = Application.Transpose(Plage)
                    Set Plage = Nothing
                Next i
            End If
        End With
    Next Ws
End Sub
0
chlovba Messages postés 5 Date d'inscription dimanche 8 avril 2018 Statut Membre Dernière intervention 10 avril 2018
9 avril 2018 à 23:26
Rebonjour et Merci pour aide,

Je viens d'essayer de votre code, et d'essayer de le comprendre ...
J'ai essayé de le modifier moi meme pour aboutir au resultat voulu (les valeurs d'une feuille par ligne)
J'ai pour l'instant réussi à mettre toutes mes valeurs sur une colonne (au lieu d'une ligne ...) et je n'arrive pas séparer chaque feuille en lignes ..

Exemple:
Feuille1 remplie de plusieurs lignes et colonnes de a
Feuille 2 ..... b
Resultat = 1 ligne de a et 1 ligne de b

Voila votre code annoté d'apres ma compréhension et un peu modifié comme dit plus haut:

Sub test()
'-------------------------------
'Declaration des variables
'Feuilles du classeur "Ws"
Dim Ws As Worksheet
'i = Nb de lignes non vides de la feuille
Dim i As Long
'j = Nb de colonnes non vides de i
Dim j As Long
'ligne = Nb ligne de "Resultat" = 1 ligne par feuille ??
Dim ligne As Long
'--------------------------------


ligne = 0


'Pour chaque feuille de ce classeur "Ws"
For Each Ws In ThisWorkbook.Worksheets

'Tous les .fonction seront definis avec Ws
With Ws

'Si la feuille est différente de "Resultat"
If Ws.Name <> "Resultat" Then

'Pour chaque Nb de lignes non vides de la feuille
For i = 1 To .Cells(Rows.Count, 1).End(xlUp).Row
'Nb de colonnes non vides sur la ligne i
For j = 1 To .Cells(i, Columns.Count).End(xlToLeft).Column

'Definir la plage comme toutes le valeurs de la ligne i
'(de 1ere cellule de i a valeur de la derniere colonne vide)
Set Plage = .Range(.Cells(i, 1), .Cells(i, j))

' on incrémente d'une ligne pour avoir la plage de valeur sur la ligne du dessous
'(Démarre à zéro, 1ere ligne = 1)
'??
ligne = ligne + 1

'Ajouter sur la feuille Resultat
Sheets("Resultat").Cells(ligne, Columns.Count).End(xlToLeft) = Application.Transpose(Plage)
'.Cells(i, j).Copy Sheets("Resultat").Cells(ligne, Columns.Count).End(xlToLeft)

'Reset la definitionde la Plage de valeurs
Set Plage = Nothing

Next j
Next i
End If
End With
Next Ws
End Sub


Merci d'avance pour votre aide
Chloe
0