Microsoft 365 décaler les colonnes dans une boucle

Excellerateur

XLDnaute Occasionnel
Bonjour chers membres!



Je cherche un code VBA qui me permettra de décaler les colonnes dans une boucle à chaque fois que la boucle se répète. Je sais faire le décalage de ligne,

mais je ne sais pas comment faire pour les colonnes.



j'espère m'être fait comprendre.



Excellement votre,



@Excellerateur
 
Solution
VB:
Option Explicit
Sub CopierClasser()
   Dim RngSrc As Range, RngCbl As Range, Cs&, Cc&
   Set RngSrc = Feuil1.ListObjects(1).DataBodyRange
   For Cs = 3 To 8
      Cc = 1 + 3 * (Cs - 3)
      Set RngCbl = Feuil3.Cells(3, Cc).Resize(RngSrc.Rows.Count, 2)
      RngCbl.Columns(1).Value = RngSrc.Columns(1).Value
      RngCbl.Columns(2).Value = RngSrc.Columns(Cs).Value
      RngCbl.Sort RngCbl.Columns(2), xlDescending
      RngCbl.Rows(5).Resize(RngCbl.Rows.Count - 4).ClearContents
      Next Cs
   End Sub

Dranreb

XLDnaute Barbatruc
VB:
Option Explicit
Sub CopierClasser()
   Dim RngSrc As Range, RngCbl As Range, Cs&, Cc&
   Set RngSrc = Feuil1.ListObjects(1).DataBodyRange
   For Cs = 3 To 8
      Cc = 1 + 3 * (Cs - 3)
      Set RngCbl = Feuil3.Cells(3, Cc).Resize(RngSrc.Rows.Count, 2)
      RngCbl.Columns(1).Value = RngSrc.Columns(1).Value
      RngCbl.Columns(2).Value = RngSrc.Columns(Cs).Value
      RngCbl.Sort RngCbl.Columns(2), xlDescending
      RngCbl.Rows(5).Resize(RngCbl.Rows.Count - 4).ClearContents
      Next Cs
   End Sub
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Oui, on peut aussi faire comme ça, si on a le droit de changer l'ordre du tableau source :
Code:
Option Explicit
Sub CopieEspacée()
   Dim LOt As ListObject, RngSrc As Range, RngCbl As Range, Cs&, Cc&
   Set LOt = Feuil1.ListObjects(1)
   Set RngSrc = LOt.DataBodyRange
   For Cs = 3 To 8
      With LOt.Sort
         .SortFields.Clear
         .SortFields.Add2 Key:=LOt.ListColumns(Cs).Range, Order:=xlDescending, _
            SortOn:=xlSortOnValues, DataOption:=xlSortNormal
         .Header = xlYes
         .MatchCase = False
         .Orientation = xlTopToBottom
         .SortMethod = xlPinYin
         .Apply: End With
      Cc = 1 + 3 * (Cs - 3)
      Set RngCbl = Feuil3.Cells(3, Cc).Resize(4, 2)
      RngCbl.Columns(1).Value = RngSrc.Columns(1).Value
      RngCbl.Columns(2).Value = RngSrc.Columns(Cs).Value
      Next Cs
   End Sub
Mais ce n'est pas plus simple.
 

Excellerateur

XLDnaute Occasionnel
Pas sûr d'avoir compris la réponse.
pour chaque colonne à traiter, il faut donc non pas copier seulement les 4 1ères lignes, mais les copier toutes, classer par ordre décroissant puis supprimez celles à partir de la 5ème place ?
En fait je ré-explique.

Sur l'onglet "Calculs ratios" les colonnes qui m'interressent sont la colonne "A" et les colonnes de "C" à "H".
Entre les colonnes "C" et "H", chaque fois que je fais un tri (du plus grand au plus petit), l'ordre des pays en colonne "A" pourrait éventuellement changer selon le nouveau tri qui a été fait.

Donc sur l'onglet "Feuille A", je voudrais ressortir dans chacun des mini tableaux la liste des 4 premiers pays en fonction du tri qui a été fait dans la colonne correspondante (voir les noms des colonnes).

Je sais pas si tu comprends ma requête maintenant
 

Dranreb

XLDnaute Barbatruc
Avez vous essayé les deux procédures que je vous ai proposées au #16 et #17 ?
Parce que dans le classeur que vous aviez joint les tableaux n'étaient pas tous dans le même ordre. Ils résultaient donc de tris différents et non d'un même dernier tri de l'ensemble sur une des colonnes comme vous semblez dire.
 

Excellerateur

XLDnaute Occasionnel
Bonjour à tous,

Excellerateur tellement adepte du cross posting... qu'il n'est pas certain qu'il vous répondra 🤔 :rolleyes:
Bonjour,

je trouve ça quand même triste toute l'énergie que vous déployez sur moi.
Je vous ai clairement présenté toutes mes excuses à vous @BrunoM45 et à toute la communauté. Vous pouvez facilement voir sur mon profil que je suis nouveau sur ces plateformes et des méthodes d'utilisation.

Je ne savais pas que cette pratique de "cross posting" était interdite; désolé de mon manque d'attention là dessus.

Après , de revenir ici faire des commentaires sur des gens alors que vous ne savez pas comment ils gèrent leur disponibilité ou leur accès à un ordinateur, je trouve ça pathétique à la limite. Vous pourriez même me signaler aux administrateurs ils liront et comprendront certainement ma démarche et les excuses que j'ai clairement exposé sans aucune formalité.

Je ne sais pas pourquoi tout cet acharnement sur moi à l'heure de la "distanciation 😜" .

Personnellement je suis quelqu'un de toujours souriant dans un maximum de mon temps. Je vous souhaite tout de même de garder la pêche malgré tout cet acharnement.


Bonne journée à vous et à la communauté "excel-downloads"

Excellemment votre!

@Excellerateur
 

Excellerateur

XLDnaute Occasionnel
as tu vu ma solution post #15 ?
Bonjour @vgendron !

Merci pour ta contribution. En effet, j'essaye de l'incrémenter, mais je t'avoue qu'elle est un peu difficile à comprendre à mon niveau. Surtout que le fichier original a un format différent de celui-ci.

Par exemple, je ne comprends vraiement pas cette partie

VB:
Sheets("Feuille A").Cells(9 - i + 2, (cycle - 1) * 3 + 1) = a(i, 1)
Sheets("Feuille A").Cells(9 - i + 2, (cycle - 1) * 3 + 2) = a(i, cycle + 2)

J'aimerais mieux illustrer ce que j'ai dans mon code original pour que vous compreniez.
 

Excellerateur

XLDnaute Occasionnel
Oui, on peut aussi faire comme ça, si on a le droit de changer l'ordre du tableau source :
Code:
Option Explicit
Sub CopieEspacée()
   Dim LOt As ListObject, RngSrc As Range, RngCbl As Range, Cs&, Cc&
   Set LOt = Feuil1.ListObjects(1)
   Set RngSrc = LOt.DataBodyRange
   For Cs = 3 To 8
      With LOt.Sort
         .SortFields.Clear
         .SortFields.Add2 Key:=LOt.ListColumns(Cs).Range, Order:=xlDescending, _
            SortOn:=xlSortOnValues, DataOption:=xlSortNormal
         .Header = xlYes
         .MatchCase = False
         .Orientation = xlTopToBottom
         .SortMethod = xlPinYin
         .Apply: End With
      Cc = 1 + 3 * (Cs - 3)
      Set RngCbl = Feuil3.Cells(3, Cc).Resize(4, 2)
      RngCbl.Columns(1).Value = RngSrc.Columns(1).Value
      RngCbl.Columns(2).Value = RngSrc.Columns(Cs).Value
      Next Cs
   End Sub
Mais ce n'est pas plus simple.
Bonjour @Dranreb ,

En effet ce n'est pas facile à comprendre pour quelqu'un de mon niveau.

J'ai de la peine à cerner tout ce qui est dit dans #16 afin de l'adapter.

Je suis déjà très reconnaissant des efforts que vous mettez à m'aider à trouver une solution. Mais là c'est de ma faute si je n'arrive pas à incrémenter tout cela dans mon code.

Pour le moment la solution de @vgendron me semble plus potable, même si pour le moment rien de marche encore...

Toute fois, je reste convaincu d'atteindre un niveau comme le votre un jour :D

Excellemment votre!

@Excellerateur
 

vgendron

XLDnaute Barbatruc
Hello

ci dessous le meme code avec des commentaires en plus pour expliquer
la partie que tu ne comprends pas, c'est juste une logique pour passer de la bonne colonne à l'autre
pour mieux te rendre compte, si tu as toujours du mal, fais toi le calcul à coté avec cycle =1 et 2 et i = 1 puis i=2
VB:
Option Compare Text
Sub TriTableau2D()
Dim a()

a = ActiveSheet.ListObjects("TabData").DataBodyRange.Value ' Tableau 2D

For cycle = 1 To 6 'pour les 6 cycles du tableau feuille "Calculs ratios"
    Tri a(), cycle + 2, LBound(a, 1), UBound(a, 1) 'on tri le tableau en ordre croissant: on ajuste avec Cycle+2 pour donner le numéro de colonne==ex: cycle 1 = ratioVeille, il est en colonne C (3eme colonne de la feuille)
    For i = UBound(a, 1) To UBound(a, 1) - 3 Step -1 'on prend les 4 derniers elements: on part du dernier (c'est le plus grand) et on remonte
        Sheets("Feuille A").Cells(9 - i + 2, (cycle - 1) * 3 + 1) = a(i, 1)
            ' a(i,1) = élément du tableau à recopier
            ' Sheets("Feuille A").Cells(9 - i + 2, (cycle - 1) * 3 + 1)' c'est la cellule de la feuille A qui recoit le résultat
            ' pour le numéro de ligne: 9-i+2 ==> 9-i: quand i va de 8 à 5: 9-i va de 1 à 4
                                            '+2==> parce que on commence à la ligne 3 dans la feuille A
            'pour  le numéro de colonne: (cycle-1)*3+2==> chaque cycle occupe 3 colonnes= ex: Cycle 1: sur les colonnes A et B + C(colonne vide), Cycle 2: colonnes D E F
                                                        '==> c'est donc pour pouvoir décaler de 3 colonnes à chaque nouveau cycle
                                                        
        Sheets("Feuille A").Cells(9 - i + 2, (cycle - 1) * 3 + 2) = a(i, cycle + 2)
    Next i
Next cycle
End Sub

Sub Tri(a(), ColTri, gauc, droi) ' Quick sort: tri par ordre croissant du tableau a, sur la colonne "ColTri"
  ref = a((gauc + droi) \ 2, ColTri)
  g = gauc: d = droi
  Do
    Do While a(g, ColTri) < ref: g = g + 1: Loop
    Do While ref < a(d, ColTri): d = d - 1: Loop
    If g <= d Then
       For k = LBound(a, 2) To UBound(a, 2)
         temp = a(g, k): a(g, k) = a(d, k): a(d, k) = temp
       Next k
       g = g + 1: d = d - 1
    End If
  Loop While g <= d
  If g < droi Then Call Tri(a, ColTri, g, droi)
  If gauc < d Then Call Tri(a, ColTri, gauc, d)
End Sub
 

Excellerateur

XLDnaute Occasionnel
Bonjour.
Dans mon #16 il y a juste un code, d'ailleurs assez court, et plutôt simple il me semble.
Mais s'il y a un point que vous ne comprenez pas, vous pouvez toujours me demander des précisions.
Bonjour chers tous!

En effet je suis finalement arrivé solutionner mon problème grâce en partie à ce que tu as proposé dans ta solution en #16 qui me permettais de comprendre que je pouvais faire correspondre les cellules des deux tables.
je me suis également inspiré d'une autre proposition qui m'a été faite afin d'en arriver au bout de ce problème qui me chagrinait tant.

Bon courage et à bientôt chers membres.

@Excellerateur
 

Discussions similaires

Statistiques des forums

Discussions
312 193
Messages
2 086 059
Membres
103 110
dernier inscrit
Privé