Transposer des lignes en une seule et même colonne

Bonjour à tous !

Pouvez-vous m'aider à réaliser la macro qui est demandée dans le fichier excel que j'ai joint au commentaire, après de multiples tentatives impossible de trouver la solution !! est-ce qu'une âme charitable pourrait m'aider ?????? SVPPP

42exercise2-forum.xlsx (373.25 Ko)

Bonsoir,

s'agissant d'un exercice, je suppose que le but est que tu puisses le faire toi-même et pas que nous le fassions à ta place.

est-ce l'algorithme qui te pose problème ?

est-ce sa traduction en vba ?

les deux ?

qu'as-tu essayé ?

Bonjour à tous,

@h2so4

je ne travaille pas très souvent avec les variable tableau, alors j'ai essayé cette exercice,

mais j'ai un erreur sur la ligne

sh2.Range("A2:C" & a) = Application.Transpose(var)

peux-tu regarder pour voir ou est mon erreur ?

Sub test()
Dim sh1 As Worksheet, sh2 As Worksheet
Dim col As Integer, y As Integer
Dim lig As Long, i As Long, a As Long
Dim var(), t

Set sh1 = Sheets("Data")
Set sh2 = Sheets("Resultat")
col = sh1.Cells(1, Columns.Count).End(xlToLeft).Column
lig = sh1.Cells(Rows.Count, 1).End(xlUp).Row
t = sh1.Range("A1:" & Cells(lig, col).Address)
a = 0

For i = 2 To lig
  For y = 2 To col
      ReDim Preserve var(2, a)
      var(0, a) = t(1, y)
      var(1, a) = t(i, 1)
      var(2, a) = t(i, y)
      a = a + 1
  Next y
Next i

a = a + 1
sh2.Range("A2:C" & a) = Application.Transpose(var)
End Sub

Merci pour votre réponse , oui comme vous le dites c'est un exercice mais à titre personnel !

Je suis débutant et j'ai vraiment du mal avec celui la d'exercice .

bonjour

@i20100

edit : correction de 32767 en 65535 suite au message de Jean-Eric (voir ci-dessous), merci à lui.

j'ai remarqué à plusieurs reprises que application.transpose avait du mal à gérer les tableaux dont le nombre de lignes ou de colonnes est supérieur à 65535 (nombre max pour une variable de type entier).

voici donc une correction possible du code.

Sub test()
    Dim sh1 As Worksheet, sh2 As Worksheet
    Dim col As Integer, y As Integer
    Dim lig As Long, i As Long, a As Long, ligneresultat
    Dim var(65535, 2), t

    Set sh1 = Sheets("Data")
    Set sh2 = Sheets("resultats")
    col = sh1.Cells(1, Columns.Count).End(xlToLeft).Column
    lig = sh1.Cells(Rows.Count, 1).End(xlUp).Row
    t = sh1.Cells(1, 1).Resize(lig, col)
    a = 0
    ligneresultat = 2
    For i = 2 To lig
        For y = 2 To col
            If a = 65535 Then 'tableau rempli on transfère son contenu sur la feuille
                sh2.Cells(ligneresultat, 1).Resize(a, 3) = var
                ligneresultat = ligneresultat + a
                a = 0
            End If
            var(a, 0) = t(1, y)
            var(a, 1) = t(i, 1)
            var(a, 2) = t(i, y)
            a = a + 1
        Next y
    Next i

    If a <> 0 Then 'on transfère le résidu du tableau
        sh2.Cells(ligneresultat, 1).Resize(a, 3) = var
    End If
End Sub

@Nicolas07600

l'algorithme

tant qu'il y a une ligne non vide
 tant qu'il y a une colonne non vide
  ajouter une ligne résultat qui contient la date (ligne en cours, colonne 1), le nom de l'action (ligne 1, colonne en cours), cours de l'action (ligne en cours, colonne en cours)

le code VBA ci-dessus est basé sur cet algorithme mais inclut des optimisations de performance.

Merci beaucoup pour votre aide !!!

Bonjour,

@ h2so4,

Le souci n'est pas la valeur de i mais de la valeur de a supérieure à +/- 65535 pour la restitution dans la feuille de calcul !?

Me trompe je ?

Cdlt.

Bonjour,

Le souci n'est pas la valeur de i mais de la valeur de a supérieur à +/- 65535 pour la restitution dans la feuille de calcul !?

@Jean-Eric

c'est tout à fait ça (j'avais en tête une limite basée sur ce qu'une variable de type entier peut contenir comme nombre d'où 32767 (nombre signé), mais je n'ai plus vérifié si le nombre pouvait être non signé (auquel cas la limite est de 65535 comme tu le mentionnes).

Re,

J'ai regardé hier au soir, mais des résultats erronés et des N/A. !?

En gros, 65535 lignes / 12 colonnes = 5462 lignes. ; les données comprennent 6767 lignes : Souci !...

Cdlt.

re-bonjour

@Jean-Eric

une info trouvée sur le net (en anglais)

http://excelmatters.com/2016/03/08/transpose-bug-in-2013-and-2016/

Bonjour Nicolas06700, h2so4, Jean-Eric

@ h2so4, Jean-Eric

Merci! Pour ces éclaircissements,

avec Application.Transpose la limite est bien à 65536 (à 65537 -->message d'erreur)

Voici la macro finale

Sub test2()
    Dim sh1 As Worksheet, sh2 As Worksheet
    Dim col As Integer, y As Integer
    Dim lig As Long, i As Long, a As Long, ligneresultat
    Dim tbl(), t

    Set sh1 = Sheets("Data")
    Set sh2 = Sheets("Resultat")
    sh2.Range("A:C").ClearContents

    col = sh1.Cells(1, Columns.Count).End(xlToLeft).Column
    lig = sh1.Cells(Rows.Count, 1).End(xlUp).Row
    t = sh1.Cells(1, 1).Resize(lig, col)
    a = 0
    ligneresultat = 2

    For i = 2 To lig
        For y = 2 To col
            If a = 65536 Then 'tableau rempli au max 65536, on transfère son contenu sur la feuille
                sh2.Cells(ligneresultat, 1).Resize(a, 3) = Application.Transpose(tbl)
                ligneresultat = ligneresultat + a
                a = 0
            End If

            ReDim Preserve tbl(2, a)
            tbl(0, a) = t(i, 1)
            tbl(1, a) = t(1, y)
            tbl(2, a) = t(i, y)
            a = a + 1
        Next y
    Next i

    If a <> 0 Then 'on transfère le résidu du tableau
        sh2.Cells(ligneresultat, 1).Resize(a, 3) = Application.Transpose(tbl)
    End If
End Sub

Bonjour,

dans ce cas comme tu connais la dimension maximale que la table peut avoir, tu as intérêt à éviter le redim preserve et à dimensionner ton tableau dès le départ aux dimensions souhaitées. Plusieurs centaines de fois plus rapide pour un tableau de 1.000.000 d'éléments

re,

ho oui, très rapide,

les données: feuille Data plage A1:Q65537

le tableau est mit sur la feuille en une seule fois, 13 sec pour 1 048 576 lignes,

bravo! h2so4 c'est la meilleur méthode.

voici le fichier pour ceux qui voudrait faire le test,

attention ! 5742 ko

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

Rechercher des sujets similaires à "transposer lignes seule meme colonne"