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

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

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

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...
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.
 
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

Dernière édition:
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.
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
9
Affichages
683
Réponses
10
Affichages
313
Réponses
32
Affichages
1 K
Retour