XL 2010 Transformer un Tableau à double entrée en liste en VBA

Bichette001

XLDnaute Junior
Bonjour
j'ai un tableau avec 6 colonnes et en ligne des dates
je souhaiterai un code vba pour le transformer en liste
ex :
A B C D E
3/12/18 1 2 3 4 5
4/12/18 6 7 8 9 10

j'ai regardé le post du 21/2/13 mais je n'arrive pas à moduler pour fixer le nb de colonne qui ici est de 6

un grand merci pour votre aide

:) Bichette
 

Pièces jointes

  • Test Bichette.xlsx
    9 KB · Affichages: 30
Dernière édition:

vgendron

XLDnaute Barbatruc
Hello tous !

avec ceci
VB:
Sub Tab1toTab2()
Dim tabInit() As Variant
Dim tabFinal() As Variant

With Sheets("Data")
    fin = .Range("A" & .Rows.Count).End(xlUp).Row
    tabInit = .Range("A1:F" & fin).Value
    taille = (UBound(tabInit, 1) - 2) * UBound(tabInit, 2)
    ReDim tabFinal(1 To taille, 1 To 3)
    j = 1
    For i = 2 To UBound(tabInit, 1)
        For k = LBound(tabInit, 2) + 1 To UBound(tabInit, 2)
            tabFinal(j, 1) = tabInit(i, 1)
            tabFinal(j, 2) = tabInit(1, k)
            tabFinal(j, 3) = tabInit(i, k)
            j = j + 1
        Next k
       
    Next i
End With

With Sheets("RES")
    .UsedRange.Offset(1, 0).Clear
    .Range("A2").Resize(UBound(tabFinal, 1), UBound(tabFinal, 2)) = tabFinal
End With
End Sub
 

job75

XLDnaute Barbatruc
Re,

Si l'on tient absolument au VBA il suffit d'entrer les formules de mon post #4 :
Code:
Private Sub Worksheet_Activate()
Dim ncol%, h&
ncol = 5 'à adapter
ThisWorkbook.Names.Add "ncol", ncol 'nom défini
h = ncol * (Application.Max(Sheets("Data").[A:A]) - Application.Min(Sheets("Data").[A:A]) + 1)
Application.ScreenUpdating = False
If FilterMode Then ShowAllData 'si la feuille est filtrée
Range("A2:C" & Rows.Count).ClearContents 'RAZ
[A2] = Application.Min(Sheets("Data").[A:A])
If h > 1 Then [A3].Resize(h - 1) = "=A2+NOT(MOD(ROW()-2,ncol))"
[B2].Resize(h) = "=INDEX(Data!$1:$1,2+MOD(ROW()-2,ncol))"
[C2].Resize(h) = "=IFERROR(INDEX(Data!A:IV,MATCH(A2,Data!A:A,0),2+MOD(ROW()-2,ncol)),"""")"
End Sub
La macro est à placer dans le code de la feuille, elle se déclenche quand on active la feuille.

Fichier joint.

A+
 

Pièces jointes

  • Test Bichette VBA(1).xlsm
    23.2 KB · Affichages: 19

ChTi160

XLDnaute Barbatruc
Bonjour Bichette001
Bonjour le Fil ,le Forum
histoire de vous saluer !
Bichette
pour ce qui est des formules pour ne pas les conserver tu ajoutes ce qui est en Gras à cet emplacement:
[C2].Resize(h) = "=IFERROR(INDEX(Data!A:IV,MATCH(A2,Data!A:A,0),2+MOD(ROW()-2,ncol)),"""")"
With [A2].Resize(h, 3)
.Value = .Value
End With

End Sub (/Quote]
jean marie
 

job75

XLDnaute Barbatruc
Merci également pour ta solution qui sera pt-etre - lourde que du vba ?
Le VBA n'est pas lourd et les macros proposées par zebanx et vgendron sont très rapides : 0,3 seconde chez moi avec 6000 dates en 1ère feuille.

L'intérêt de mes formules c'est qu'elles ne sont pas volatiles, elles se recalculent uniquement quand on modifie la 1ère feuille.
A quoi sert de mettre (MOD(LIGNE()-2;5) stp?
La fonction MOD crée une périodicité de 5 puisque c'est le nombre de types de flux.
 

Bichette001

XLDnaute Junior
Re,

Si l'on tient absolument au VBA il suffit d'entrer les formules de mon post #4 :
Code:
Private Sub Worksheet_Activate()
Dim ncol%, h&
ncol = 5 'à adapter
ThisWorkbook.Names.Add "ncol", ncol 'nom défini
h = ncol * (Application.Max(Sheets("Data").[A:A]) - Application.Min(Sheets("Data").[A:A]) + 1)
Application.ScreenUpdating = False
If FilterMode Then ShowAllData 'si la feuille est filtrée
Range("A2:C" & Rows.Count).ClearContents 'RAZ
[A2] = Application.Min(Sheets("Data").[A:A])
If h > 1 Then [A3].Resize(h - 1) = "=A2+NOT(MOD(ROW()-2,ncol))"
[B2].Resize(h) = "=INDEX(Data!$1:$1,2+MOD(ROW()-2,ncol))"
[C2].Resize(h) = "=IFERROR(INDEX(Data!A:IV,MATCH(A2,Data!A:A,0),2+MOD(ROW()-2,ncol)),"""")"
End Sub
La macro est à placer dans le code de la feuille, elle se déclenche quand on active la feuille.

Fichier joint.

A+


Merci pour ce code , si j'ajoute des colonnes et /ou lignes dans mon data qu'est-ce que je modifie ds le code d'après toi ?
 

Bichette001

XLDnaute Junior
Hello tous !

avec ceci
VB:
Sub Tab1toTab2()
Dim tabInit() As Variant
Dim tabFinal() As Variant

With Sheets("Data")
    fin = .Range("A" & .Rows.Count).End(xlUp).Row
    tabInit = .Range("A1:F" & fin).Value
    taille = (UBound(tabInit, 1) - 2) * UBound(tabInit, 2)
    ReDim tabFinal(1 To taille, 1 To 3)
    j = 1
    For i = 2 To UBound(tabInit, 1)
        For k = LBound(tabInit, 2) + 1 To UBound(tabInit, 2)
            tabFinal(j, 1) = tabInit(i, 1)
            tabFinal(j, 2) = tabInit(1, k)
            tabFinal(j, 3) = tabInit(i, k)
            j = j + 1
        Next k
      
    Next i
End With

With Sheets("RES")
    .UsedRange.Offset(1, 0).Clear
    .Range("A2").Resize(UBound(tabFinal, 1), UBound(tabFinal, 2)) = tabFinal
End With
End Sub

merci pour ce code, si par ex mon data va jusque col H qu'est-ce que je modifie dans le code d'après toi vgendron?merci...
 

Discussions similaires

Réponses
8
Affichages
405

Statistiques des forums

Discussions
312 046
Messages
2 084 839
Membres
102 685
dernier inscrit
med_remi021