Transformer un tableau de plusieurs colonnes en 1 seule colonne

loulourav

XLDnaute Occasionnel
Bonjour à tous,

je suis souvent confronté à ce genre de manip que je réalise à la main, mais je suis sûr qu'il y a un moyen via des formules de faire ceci en "automatique"

voici le genre de tableau que j'ai de base :

tab.PNG

et ce que je souhaite obtenir :

tab2.jpg

soit en littéral :
les valeurs en ligne sont transposées, et la colonne B (avec les code 1010,1011,1012 etc ...) est recopiée 12 fois en l’occurrence, du moins autant de fois qu'il y a de valeurs.


Qu'est il possible de faire pour ne pas faire des copié/coller/transposer ... ???

merci de votre aide
 

Pièces jointes

  • tab.PNG
    tab.PNG
    58.5 KB · Affichages: 272
  • help.xlsx
    18.2 KB · Affichages: 71
  • help.xlsx
    18.2 KB · Affichages: 74
  • help.xlsx
    18.2 KB · Affichages: 78
Dernière édition:

Papou-net

XLDnaute Barbatruc
Re : Transformer un tableau de plusieurs colonnes en 1 seule colonne

Bonjour loulourav,

Ne crois-tu pas qu'il serait plus simple, et moins laborieux pour ceux qui se pencheront sur ton problème, de joindre un fichier reprenant les données à traiter au lieu des images?

A +

Cordialement.
 
Dernière édition:

loulourav

XLDnaute Occasionnel
Re : Transformer un tableau de plusieurs colonnes en 1 seule colonne

alors ca c'est génial !!!
comment je me suis fais #@#@# et en un clic ....
merci beaucoup je vais garder précieusement cet outil.
petite question bête, si je veux étendre le nombre de lignes à transposer que dois je modifier ???
 

Papou-net

XLDnaute Barbatruc
Re : Transformer un tableau de plusieurs colonnes en 1 seule colonne

RE:

Arf... Philippe (que je salue bien bas) a profité de mon absence momentanée pour me griller la politesse. Mais c'est sans rancune, sa solution est quasi identique à la mienne.

Je ferai quand-même une petite simplification dans son code, mais c'est juste pour me "venger":

Code:
Sheets("Feuil2").Cells.ClearContents
au lieu de

Code:
Sheets("Feuil2").Range("A1:C" & Sheets("Feuil2").Range("A65535").End(xlUp).Row).ClearContents
Cordialement.
 

phlaurent55

Nous a quittés en 2020
Repose en paix
Re : Transformer un tableau de plusieurs colonnes en 1 seule colonne

Re,
petite question bête, si je veux étendre le nombre de lignes à transposer que dois je modifier ???

Il n'y a rien à modifier, tout a été prévu
tu peux faire un essai en ajoutant ou supprimant des lignes

Arf... Philippe (que je salue bien bas) a profité de mon absence momentanée pour me griller la politesse
@ Papou,

tu pourras me la griller demain, j'ai trop de boulot en ce moment, je me tiendrai éloigné de XLD pendant plus d'une semaine pour aller faire des copeaux et préparer mes marchés de Noël

à+
Philippe
 

loulourav

XLDnaute Occasionnel
Re : Transformer un tableau de plusieurs colonnes en 1 seule colonne

j'ai du mal m'exprimer je pense
ce que je voulais dire c'est comme tu as certainement du le remarquer les valeurs 1 à 12 correspondent aux 12 mois de l'année, imaginons que j'ai un tableau avec tout autre chose sur 20 ou 30 colonnes que je souhaites transposer de la même façon en ligne.
j'imagine qu'il que j'ajoute quelque plage de données à la macro ? non ?

en tout cas encore une fois merci c'est génial !
 

phlaurent55

Nous a quittés en 2020
Repose en paix
Re : Transformer un tableau de plusieurs colonnes en 1 seule colonne

re,

je ne sais malheureusement pas ouvrir le fichier sur ma tablette

de mémoire, les colonnes sont prises en compte dans la boucle For J = 3 To ?

si ajout de colonnes, pour en tenir compte, la modif doit de faire en changeant la valeur de ?

à+
Philippe
 

Papou-net

XLDnaute Barbatruc
Re : Transformer un tableau de plusieurs colonnes en 1 seule colonne

RE

@ Philippe:
On est déjà presque demain, alors je commence.

@ loulourav:
Voici la procédure de Philippe remaniée:

Code:
Sub Bouton1_Clic()
With Sheets("Feuil2")
  .Range("A1:C" & .Range("A65535").End(xlUp).Row).ClearContents
  .Range("A1") = "EXERCICE 2104"
  ligne = 2
  ncol = Feuil1.Rows(2).SpecialCells(xlCellTypeConstants).Count
  For i = 3 To Feuil1.Range("A65535").End(xlUp).Row
    For j = 3 To ncol
      If Feuil1.Cells(i, j) <> "" Then
        .Cells(ligne, 1) = Feuil1.Cells(i, 1)
        .Cells(ligne, 2) = Feuil1.Cells(2, j)
        .Cells(ligne, 3) = Feuil1.Cells(i, j)
        ligne = ligne + 1
      End If
    Next j
  Next i
  .Select
End With
End Sub
Le code recherche le nombre de cellules remplies en ligne 2 (variable ncol) et en affecte la valeur à la variable j. Ainsi, peu importe le nombre de colonnes du tableau.

NB: il faut effacer la colonne AD de Feuil1 qui comporte des valeurs apparemment non organisées et qui influe inutilement sur le calcul du nombre de colonnes.

Cordialement.
 

klin89

XLDnaute Accro
Re : Transformer un tableau de plusieurs colonnes en 1 seule colonne

Bonsoir à tous,

Avant d'exécuter la macro, efface le contenu de A1
Résultat en Feuil2
VB:
Sub test1()
Dim a, b(), i As Long, j As Long, n As Long
    With Sheets("Feuil1").Range("a2").CurrentRegion
        a = Application.Index(.Value, Evaluate("row(1:" & _
                                               .Rows.Count & ")"), Array(1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14))
        ReDim b(1 To Application.CountA(.Cells), 1 To 3)
    End With
    For i = 2 To UBound(a, 1)
        For j = 2 To UBound(a, 2)
            n = n + 1
            b(n, 1) = a(i, 1)
            b(n, 2) = a(1, j)
            b(n, 3) = a(i, j)
        Next
    Next
    With Sheets("Feuil2").Cells(1)
        .CurrentRegion.Clear
        With .Resize(n, 3)
            .Value = b
            On Error Resume Next
            .Columns(3).SpecialCells(xlCellTypeBlanks) = 0
            On Error GoTo 0
        End With
    End With
End Sub
Klin89
 
Dernière édition:

loulourav

XLDnaute Occasionnel
Re : Transformer un tableau de plusieurs colonnes en 1 seule colonne

merci Papou-net et klin89 c'es tout à fait ce dont j'ai besoin !
je test les versions et reviens vers vous !!

ok tout fonctionne très bien ;) j'ai pris la version de Papou-net ! (dsl Klin89 elle est plus "parlante" pour moi :rolleyes:)
est ce possible d'ajouter un bout de code pour effacer les données éventuellement présente en feuil2 ...??

merci ;)
 
Dernière édition:

Papou-net

XLDnaute Barbatruc
Re : Transformer un tableau de plusieurs colonnes en 1 seule colonne

Bonjour loulourav, Philippe, klin89, le Forum,

est ce possible d'ajouter un bout de code pour effacer les données éventuellement présente en feuil2 ...??

Il me semble que c'est pourtant ce que fait déjà le code, en ligne 3:

Code:
.Range("A1:C" & .Range("A65535").End(xlUp).Row).ClearContents
Si c'est la feuille complète que tu veux effacer, alors je t'ai donné la solution en #6:

Code:
Sheets("Feuil2").Cells.ClearContents
Ou alors, je n'ai pas compris ton message précédent?

Cordialement.
 

loulourav

XLDnaute Occasionnel
Re : Transformer un tableau de plusieurs colonnes en 1 seule colonne

j'ai fais un test et il restait des lignes des précédents calcul. (edit : j'ai capté, j'avais plus de 65000 lignes, je pense que c'est pour ca ;) )
je vais regarder de plus près ;)
merci en tout cas ;)

edit 2 :

maintenant il ne transpose plus que les 8 premières colonnes ....
HTML:
Sub Bouton1_Clic()
With Sheets("Feuil2")
  Sheets("Feuil2").Cells.ClearContents
  ligne = 2
  ncol = Feuil1.Rows(2).SpecialCells(xlCellTypeConstants).Count
  For i = 3 To Feuil1.Range("A65535").End(xlUp).Row
    For j = 3 To ncol
      If Feuil1.Cells(i, j) <> "" Then
        .Cells(ligne, 1) = Feuil1.Cells(i, 1)
        .Cells(ligne, 2) = Feuil1.Cells(2, j)
        .Cells(ligne, 3) = Feuil1.Cells(i, j)
        ligne = ligne + 1
      End If
    Next j
  Next i
  .Select
End With
End Sub

qu'est ce que j'ai loupé ?.??
 
Dernière édition:

Papou-net

XLDnaute Barbatruc
Re : Transformer un tableau de plusieurs colonnes en 1 seule colonne

RE:

Le fait d'effacer des cellules fausse parfois la détection des cellules vides.

Essaie donc en remplaçant ClearContents par Delete:

Code:
Sub Bouton1_Clic()
With Sheets("Feuil2")
  Sheets("Feuil2").Cells.Delete
  ligne = 2
  ncol = Feuil1.Rows(2).SpecialCells(xlCellTypeConstants).Count
  For i = 3 To Feuil1.Range("A65535").End(xlUp).Row
    For j = 3 To ncol
      If Feuil1.Cells(i, j) <> "" Then
        .Cells(ligne, 1) = Feuil1.Cells(i, 1)
        .Cells(ligne, 2) = Feuil1.Cells(2, j)
        .Cells(ligne, 3) = Feuil1.Cells(i, j)
        ligne = ligne + 1
      End If
    Next j
  Next i
  .Select
End With
End Sub
A +

Cordialement.
 

Discussions similaires

Réponses
16
Affichages
438

Statistiques des forums

Discussions
312 100
Messages
2 085 293
Membres
102 853
dernier inscrit
jetstream69