Transposer colonne en multiple colonnes

Bonjour,

J'aimerai savoir comment je pourrai transposer une longue colonne de 1000 ligne en multiple colonnes mais pas après un nombre fixe mais dès qu'une entité (numero) change car malheureusement il n'y pas le meme nombre de ligne pour chaque entité

Ex:

609944_web.jpg

609944_ghost_web.jpg

609944_ghost_2_web.jpg

609944_focus_face_web.jpg

609944_focus_dos_web.jpg

609944_detail_web.jpg

609944_2_web.jpg

609940_web.jpg

609940_ghost_web.jpg

609940_ghost_2_web.jpg

609940_focus_face_web.jpg

609940_focus_dos_web.jpg

609940_ensemble_web.jpg

609940_ensemble_2_web.jpg

609940_detail_web.jpg

609940_2_web.jpg

Exemple ici il faudrait créer un nouvelle colonne dès le 609940

A mon avis ca va passer par une Macro et là je suis largué ?!

Si quelqu'un a une idée

Merci

Bonjour Sonny, bonjour le forum,

J'aimerai savoir comment je pourrai transposer une longue ligne de 1000 cellule en multiple colonnes

??

Les données que tu proposes semblent se trouver dans une colonne plutôt que dans une ligne. Un fichier exemple serait le bienvenu...

oui en effet c'était pas clair désolé c'est bien 1 colonne de 1000 lignes

j'attache le fichier ici

Merci

21url-transpose.xlsx (56.16 Ko)

Bonjour,

Je n'ai pas trop le temps de faire la macro et je n'ai pas le fichier pour la faire dessus...

Du coup je vais t'expliquer comment je vois la macro :

Tu vas avoir les variables suivantes :

pos_symbole : pour enregistrer la position du _ dans le texte

Nombre1 : pour stocker le nombre que tu vas comparer

Nombre2 : ídem

ligne_dep : pour stocker la première ligne de la sélection que tu vas couper, puis coller

ligne_fin : ídem mais pour la dernière ligne

col_dep : numéro de la première colonne dans laquelle tu colleras

Tu vas faire une boucle sur l'ensemble de tes lignes sur ta colonne :

Avant de faire cette boucle tu initialise tes variables Nombre 1 = première ligne, ligne_dep = première ligne, Nombre1 qui doit prendre la valeur du nombre de la première ligne.

Et tu commences de suite à la seconde.

Dans la seconde tu fais une fonction trouve "_" qui te renverra sa position que tu enregistres dans pos_symbole

tu utilises pos_symbole pour trouver le nombre dans la chaine de texte avec un string text qui commence au premier caractère, tu y enregistres dans Nombre2

Tu compares ensuite Nombre1 et Nombre2, si ils sont différents alors:

ligne_fin = ligne actuelle - 1

Tu coupes et colles

Tu incrémente col_dep de 1

Tu enregistres Nombre1 de nouveau avec la valeur de la cellule actuelle, tu changes ligne_dep en mettant la ligne actuelle.

Et tu recommences.

Conditions à ajouter, un OU dans le SI pour prendre en compte le fait que tu arrives à la fin de ta colonne, si c'est le cas, tu copies colles.

Bonne chance

Bonjour le fil, bonjour le forum,

Peut-être comme ça :

Sub Macro1()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Integer 'déclare la variable J (incrément)
Dim AV As String 'déclare la variable AV (Ancienne Valeur)
Dim NV As String 'déclare la variable NV (Nouvelle Valeur)
Dim TB() As Variant 'déclare la variable TB (Tableau des Blocs)
Dim COL As Integer 'déclare la variable COL (COLonne)

Application.ScreenUpdating = False 'masque les rafraîchissements d'écran
Set O = Worksheets("Sheet1") 'définit l'nglet O
O.Range(O.Cells(1, 2), O.Cells(1, Application.Columns.Count)).EntireColumn.ClearContents 'efface d'eventuelles anciennes données
DL = O.Cells(Application.Rows.Count, "A").End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne A de l'onglet O
TV = O.Range("A1:A" & DL) 'définit le tableau des valeurs TV
AV = Left(TV(1, 1), 6) 'inicialise l'ancienne valeur AV
ReDim Preserve TB(0): TB(0) = TV(1, 1) 'initialise la tableau des blocs TB
J = 1 'initialise la variable J
COL = 2 'initialise la variable COL
For I = 2 To DL 'boucle sur toutes les lignes I du tableau des valeurs TV
    NV = Left(TV(I, 1), 6) ''definit la nouvelle valeur NV
    If NV = AV Then 'condition : si la nouvelle valeur NV est égale à l'ancienne valeur  AV
        ReDim Preserve TB(J): TB(J) = TV(I, 1) 'ajoute la donnée ligne I colonne 1 de TV au tableau des blocs TB
        J = J + 1 'incrément J
    Else 'sinon (si la nouvelle valeur NV est différente de l'ancienne valeur AV)
        O.Cells(1, COL).Resize(UBound(TB) + 1, 1) = IIf(UBound(TB) = 0, TB(0), Application.Transpose(TB)) 'renvoie le tableau TB transposé dans la cellule redimensionnée ligne 1 colonne COL
        Erase TB 'efface le tableau TB
        ReDim Preserve TB(0): TB(0) = TV(I, 1) 'initialise le tableau des blocs TB
        AV = Left(TV(I, 1), 6) 'redéfinit l'ancienne valeur AV
        J = 1 'initialise la variable J
        COL = COL + 1 'icrémene la colonne COL
    End If 'fin de la condition
Next I 'prochaine ligne de la boucle
Application.ScreenUpdating = True 'affiche les rafraîchissements d'écran
End Sub

bonjour

test de faisabilité sans vba ..........

35sonny7.xlsx (23.67 Ko)

cordialement

Ahhhh ThauTheme ca a marché direct !!! C'est génial

Me sauve la vie ca !!!

Par contre, 2ème question on ne sait jamais j'aurai besoin de trier chaque colonne avec une façon bien précise

Problème c'est que certaines colonnes ont 1 cellules et d'autres 12 !

Mais je voudrai que le tri se fasse toujours dans le meme ordre mais du coup il y a des trous et la fonction tri d'Excel ne fonctionne pas donc je me dis qu'une Macro pourrai aider :

Voila l'ordre : Attention au début les numéros changent comme ici

609958_focus_face_web.jpg

609954_focus_face_web.jpg

focus_face_web.jpg

web.jpg

2_web.jpg

focus_dos_web.jpg

3_web.jpg

4_web.jpg

5_web.jpg

LS_web.jpg

ensemble_web.jpg

ensmble_2_web.jpg

ensemble2_web.jpg

ensemble2_2_web.jpg

detail_web.jpg

ghost_web.jpg

ghost_2_web.jpg

ghost_A_web.jpg

ghost_A_2_web.jpg

detail_B_web.jpg

ghost_B_2_web.jpg

Une idée les amis ?

Bonjour le fil, bonjour le forum,

Remplace le premier code que je t'avais proposé par celui-ci (intégralement) :

Private IND As Byte 'déclare la variable IND (INDex)

Sub Macro1()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Integer 'déclare la variable J (incrément)
Dim K As Byte 'déclare la variable K (incrément)
Dim AV As String 'déclare la variable AV (Ancienne Valeur)
Dim NV As String 'déclare la variable NV (Nouvelle Valeur)
Dim TB(1 To 19) As Variant 'déclare la variable TB (Tableau des Blocs)
Dim COL As Integer 'déclare la variable COL (COLonne)

Application.ScreenUpdating = False 'masque les rafraîchissements d'écran
Set O = Worksheets("Sheet1") 'définit l'onglet O
O.Range(O.Cells(1, 2), O.Cells(1, Application.Columns.Count)).EntireColumn.ClearContents 'efface d'eventuelles anciennes données
DL = O.Cells(Application.Rows.Count, "A").End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne A de l'onglet O
TV = O.Range("A1:A" & DL) 'définit le tableau des valeurs TV
AV = Left(TV(1, 1), 6) 'initialise l'ancienne valeur AV
Call Tri(Mid(TV(1, 1), 8)) 'appelle la fonction Tri
TB(IND) = TV(1, 1) 'indexe le tableau TB en fonction du tri
'J = 1 'initialise la variable J
COL = 2 'initialise la variable COL
For I = 2 To DL 'boucle sur toutes les lignes I du tableau des valeurs TV
    NV = Left(TV(I, 1), 6) 'définit la nouvelle valeur NV
    If NV = AV Then 'condition : si la nouvelle valeur NV est égale à l'ancienne valeur  AV
        Call Tri(Mid(TV(I, 1), 8)) 'appelle la fonction Tri
        TB(IND) = TV(I, 1) 'indexe le tableau TB en fonction du tri
        'J = J + 1 'incrémente J
    Else 'sinon (si la nouvelle valeur NV est différente de l'ancienne valeur AV)
        For K = 1 To 19 'boucle sur les 19 valeurs possibles du tableau TB
            'si la valeur indexée n'est pas vide, renvoie cette valeur dans la ligne L colonne COL de l'onglet O, incrémente L
            If TB(K) <> "" Then O.Cells(L + 1, COL).Value = TB(K): L = L + 1
        Next K 'prochaine valeur de la boucle
        Erase TB 'efface le tableau TB
        Call Tri(Mid(TV(1, 1), 8)) 'appelle la fonction Tri
        TB(IND) = TV(I, 1) 'indexe le tableau TB en fonction du tri
        AV = Left(TV(I, 1), 6) 'redéfinit l'ancienne valeur AV
        L = 0 'initialise la variable L
        'J = 1 'initialise la variable J
        COL = COL + 1 'icrémene la colonne COL
    End If 'fin de la condition
Next I 'prochaine ligne de la boucle
Application.ScreenUpdating = True 'affiche les rafraîchissements d'écran
End Sub

Public Function Tri(V As String)
Select Case V
    Case "focus_face_web.jpg"
        IND = 1
    Case "web.jpg"
        IND = 2
    Case "2_web.jpg"
        IND = 3
    Case "focus_dos_web.jpg"
        IND = 4
    Case "3_web.jpg"
        IND = 5
    Case "4_web.jpg"
        IND = 6
    Case "5_web.jpg"
        IND = 7
    Case "LS_web.jpg"
        IND = 8
    Case "ensemble_web.jpg"
        IND = 9
    Case "ensmble_2_web.jpg"
        IND = 10
    Case "ensemble2_web.jpg"
        IND = 11
    Case "ensemble2_2_web.jpg"
        IND = 12
    Case "detail_web.jpg"
        IND = 13
    Case "ghost_web.jpg"
        IND = 14
    Case "ghost_2_web.jpg"
        IND = 15
    Case "ghost_A_web.jpg"
        IND = 16
    Case "ghost_A_2_web.jpg"
        IND = 17
    Case "detail_B_web.jpg"
        IND = 18
    Case "ghost_B_2_web.jpg"
        IND = 19
End Select
End Function

Ahhh j'ai rééssayé plusieurs fois mais visiblement ca a marché !!!

juste énorme !! Trop la classe Charlie

BRAVO !

Et merci

Salut a tous et salut ThauThème,

J'ai eu besoin de réutiliser ta Macro mais en rajoutant du texte car j'ai des nouvelles variables.

Le problème c'est qu'avec mon nouveau listing cela ne marche plus..

J'ai eu beau regarder, je ne vois pas le problème ?!

Comme puis-je faire fonctionner de nouveau avec ce listing ?

Merci d'avance

focus_face_web.jpg

web.jpg

2_web.jpg

focus_dos_web.jpg

LS_web.jpg

ensemble_web.jpg

ensemble_2_web.jpg

ensemble2_web.jpg

ensemble2_2_web.jpg

detail_web.jpg

ghost_web.jpg

ghost_2_web.jpg

ghost_A_web.jpg

ghost_A_2_web.jpg

detail_B_web.jpg

ghost_B_2_web.jpg

focus_dentelle_web.jpg

focus_face_1_web.jpg

focus_face_2_web.jpg

focus_dos_1_web.jpg

focus_dos_2_web.jpg

focus_quart_web.jpg

ghost_1_web.jpg

3_web.jpg

4_web.jpg

5_web.jpg

6_web.jpg

7_web.jpg

8_web.jpg

9_web.jpg

10_web.jpg

11_web.jpg

12_web.jpg

13_web.jpg

14_web.jpg

Bon au cas ou cela sert a quelqu'un j'ai trouvé.

Il fallait remplacer

Dim TB(1 To 35) 

et plus bas

For K = 1 To 35 '

Etrangement il me semblait l'avoir fait mais bon, la ça marche c'est certain

Merci encore pour ce code, vraiment top !

Rechercher des sujets similaires à "transposer colonne multiple colonnes"