XL 2010 Convertir Tableau Lignes en Tableau double entrées VBA

cathodique

XLDnaute Barbatruc
Bonjour,

Au fil de mes consultations, j'ai trouvé le fichier ci-joint dans lequel avec un code le tableau double entrées est transformé en tableau classique (lignes).
Ma question est comment parvenir à faire l'inverse. C'est à dire transformé le tableau classique en tableau double entrées.

Merci.

Bon dimanche.
 

Pièces jointes

  • xlsdl2.xlsm
    18.4 KB · Affichages: 6
Solution
Bonjour @cathodique :), @chris :),

En VBA puisque PQ a déjà été fait.

Deux remarques dont une déjà mentionnée par @chris :
  1. sur la feuille "Initial", les référence des mois sont incohérentes. Si juin et juillet sont ont les mêmes abréviations, on ne pourra pas revenir au tableau initial. J'ai donc modifié les en-têtes de la ligne du haut sur la feuille initiale. J'ai mis les références abrégées des mois d'Excel.
  2. la macro qui construit le tableau de la feuille "Souhait" est selon moi incorrecte. Son résultat fait que les mois en colonne C sont tantôt un texte tantôt une date (au sens d'Excel). J'ai modifié la macro pour que les données en colonne C ne soient que du texte.
Code pour revenir au tableau...

cathodique

XLDnaute Barbatruc
Bonjour

Le plus simple est d'utiliser PowerQuery, en add on sur 2010

A noter qu'utiliser la même abréviation pour juin et juillet n'est pas judicieux
Bonjour Chris;),

Je te remercie beaucoup pour ton aide. Je voulais juste un code pour faire l'inverse de ce qui a été fait en VBA sur le fichier joint.
A noter qu'utiliser la même abréviation pour juin et juillet n'est pas judicieux
Ce n'est pas mon fichier. Je n'ai donc pas choisi les abréviations que tu me signales. J'avoue que je n'y ai même pas fait attention.

Encore merci.

Bon dimanche.
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @cathodique :), @chris :),

En VBA puisque PQ a déjà été fait.

Deux remarques dont une déjà mentionnée par @chris :
  1. sur la feuille "Initial", les référence des mois sont incohérentes. Si juin et juillet sont ont les mêmes abréviations, on ne pourra pas revenir au tableau initial. J'ai donc modifié les en-têtes de la ligne du haut sur la feuille initiale. J'ai mis les références abrégées des mois d'Excel.
  2. la macro qui construit le tableau de la feuille "Souhait" est selon moi incorrecte. Son résultat fait que les mois en colonne C sont tantôt un texte tantôt une date (au sens d'Excel). J'ai modifié la macro pour que les données en colonne C ne soient que du texte.
Code pour revenir au tableau initial :
VB:
Sub aDoubleEntree()
Dim t, tpremcol, tpremlig, i&, k&, m&, n&
   Application.ScreenUpdating = False
   t = Sheets("souhait").Range("a1").CurrentRegion
   With Sheets("RevenirInitial")
      .Range("a1").CurrentRegion.Clear
      .Columns(3).NumberFormat = "@"
      .Range("a1").Resize(UBound(t), 3) = t
      .Columns("a:b").RemoveDuplicates Columns:=Array(1, 2), Header:=xlYes
      .Columns(3).RemoveDuplicates Columns:=1, Header:=xlYes
      tpremcol = .Range(.Range("a2"), .Cells(.Rows.Count, "b").End(xlUp))
      tpremlig = .Range(.Range("c2"), .Cells(.Rows.Count, "c").End(xlUp))
      ReDim r(1 To UBound(tpremcol), 1 To UBound(tpremlig))
      For i = 2 To UBound(t)
         For m = 1 To UBound(tpremcol)
            If tpremcol(m, 1) = t(i, 1) And tpremcol(m, 2) = t(i, 2) Then Exit For
         Next m
         For n = 1 To UBound(tpremlig)
            If tpremlig(n, 1) = t(i, 3) Then Exit For
         Next n
         If m <= UBound(tpremcol) And n <= UBound(tpremlig) Then r(m, n) = t(i, 4)
      Next i
      .Range("a1").CurrentRegion.Clear
      .Range("c2").Resize(UBound(tpremcol), UBound(tpremlig)) = r
      .Range("a1").Resize(, UBound(tpremlig) + 2).NumberFormat = "@"
      .Range("c1").Resize(, UBound(tpremlig)) = Application.Transpose(tpremlig)
      .Range("a2").Resize(UBound(tpremcol), 2) = tpremcol
      .Range("a1") = "Libellé": .Range("b1") = "Libellé2"
      .Range("a1").CurrentRegion.Borders.LineStyle = xlContinuous
      .Range("a1").CurrentRegion.Columns("a:b").Interior.Color = RGB(222, 222, 222)
      .Range("a1").CurrentRegion.Rows("1:1").Interior.Color = RGB(222, 222, 222)
      .Range("a1").CurrentRegion.Rows("1:1").HorizontalAlignment = xlCenter
   End With
End Sub
 

Pièces jointes

  • cathodique- Liste-Tableau- v1.xlsm
    27.7 KB · Affichages: 4
Dernière édition:

cathodique

XLDnaute Barbatruc
Bonjour @cathodique :), @JHA :),

En VBA puisque PQ a déjà été fait.

Deux remarques dont une déjà mentionnée par @JHA .
  1. sur la feuille "Initial", les référence des mois sont incohérentes. Si juin et juillet sont ont les mêmes abréviations, on ne pourra pas revenir au tableau initial. J'ai donc modifié les en-têtes de la ligne du haut sur la feuille initiale. J'ai mis les références abrégées des mois d'Excel.
  2. la macro qui construit le tableau de la feuille "Souhait" est selon moi incorrecte. Son résultat fait que les mois en colonne C sont tantôt un texte tantôt une date (au sens d'Excel). J'ai modifié la macro pour que les données en colonne C ne soient que du texte.
Code pour revenir au tableau initial :
VB:
Sub aDoubleEntree()
Dim t, tpremcol, tpremlig, i&, k&, m&, n&
   Application.ScreenUpdating = False
   t = Sheets("souhait").Range("a1").CurrentRegion
   With Sheets("RevenirInitial")
      .Range("a1").CurrentRegion.Clear
      .Columns(3).NumberFormat = "@"
      .Range("a1").Resize(UBound(t), 3) = t
      .Columns("a:b").RemoveDuplicates Columns:=Array(1, 2), Header:=xlYes
      .Columns(3).RemoveDuplicates Columns:=1, Header:=xlYes
      tpremcol = .Range(.Range("a2"), .Cells(.Rows.Count, "b").End(xlUp))
      tpremlig = .Range(.Range("c2"), .Cells(.Rows.Count, "c").End(xlUp))
      ReDim r(1 To UBound(tpremcol), 1 To UBound(tpremlig))
      For i = 2 To UBound(t)
         For m = 1 To UBound(tpremcol)
            If tpremcol(m, 1) = t(i, 1) And tpremcol(m, 2) = t(i, 2) Then Exit For
         Next m
         For n = 1 To UBound(tpremlig)
            If tpremlig(n, 1) = t(i, 3) Then Exit For
         Next n
         If m <= UBound(tpremcol) And n <= UBound(tpremlig) Then r(m, n) = t(i, 4)
      Next i
      .Range("a1").CurrentRegion.Clear
      .Range("c2").Resize(UBound(tpremcol), UBound(tpremlig)) = r
      .Range("a1").Resize(, UBound(tpremlig) + 2).NumberFormat = "@"
      .Range("c1").Resize(, UBound(tpremlig)) = Application.Transpose(tpremlig)
      .Range("a2").Resize(UBound(tpremcol), 2) = tpremcol
      .Range("a1") = "Libellé": .Range("b1") = "Libellé2"
      .Range("a1").CurrentRegion.Borders.LineStyle = xlContinuous
      .Range("a1").CurrentRegion.Columns("a:b").Interior.Color = RGB(222, 222, 222)
      .Range("a1").CurrentRegion.Rows("1:1").Interior.Color = RGB(222, 222, 222)
      .Range("a1").CurrentRegion.Rows("1:1").HorizontalAlignment = xlCenter
   End With
End Sub
Bonjour Mapomme;),
Deux remarques dont une déjà mentionnée par @JHA
Tu dois te tromper @JHA n'est pas intervenu dans cette discussion, c'est @chris qui m'a proposé une solution Powery Query.

En tout cas bravo! Pour moi c'est parfait. Juste entête de colonne pour la feuille 'Souhait'.
Pour ça, je peux me débrouiller.

Encore merci.

Bon week-end.
 

Discussions similaires

Statistiques des forums

Discussions
312 325
Messages
2 087 307
Membres
103 513
dernier inscrit
adel.01.01.80.19