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

Excellerateur

XLDnaute Occasionnel
Bonjour

Sans exemple concret, pas évident..

VB:
for i=1 to 10 'pour les lignes de 1 à 10
      for j=1 to 15 'pour les colonnes de 1 a 15
          msgbox cells(i,j) 'affichage de la celulle i,j
     next j
next i
Bonjour @vgendron et merci pour ta contribution

Je vois bien qu'il faut définir un j entre deux bornes. comment est-ce que je matérialise cela dans le code?
J'ai une connaissance qui me disait que je pouvais utiliser la fonction "cells" mais je ne sais pas exactement comment.

Mon but c'est de selectionner la cellule de droite à chaque fois que la boucle reprend.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
Soit Cel une variable As Range convenablement initialisée de façon à représenter une seule cellule, Cel(1, 2) est alors une expression Range qui représente celle à sa droite.
VB:
Sub Test()
   Dim Cel As Range
   Set Cel = ActiveCell
   MsgBox Cel(1, 2).Address(False, False) & " est la cellule à droite de la " _
      & Cel.Address(False, False), vbInformation, "Test"
   End Sub
 

Excellerateur

XLDnaute Occasionnel
Bonjour.
Soit Cel une variable As Range convenablement initialisée de façon à représenter une seule cellule, Cel(1, 2) est alors une expression Range qui représente celle à sa droite.
VB:
Sub Test()
   Dim Cel As Range
   Set Cel = ActiveCell
   MsgBox Cel(1, 2).Address(False, False) & " est la cellule à droite de la " _
      & Cel.Address(False, False), vbInformation, "Test"
   End Sub
Merci beaucoup pour votre contribution.

En effet depuis ce matin je cherche à appliquer cette formule avec cel, mais j'y arrive pas.

Voici un bout du code que je voudrais modifier
VB:
'DEC
Sheets("DEC").Range("Y14", "Z18").ClearContents

If Sheets("plus gros porteurs").Range("B4").Value = "Dorval Convictions" Then

Sheets("plus gros porteurs").PivotTables("Tableau croisé dynamique15").PivotFields("Nom du Compte Titre").AutoSort xlDescending, "Somme de Encours Fin de Periode", Sheets("plus gros porteurs").PivotTables("Tableau croisé dynamique15").PivotColumnAxis.PivotLines(1), 1
[COLOR=rgb(184, 49, 47)]Sheets("plus gros porteurs").Range("A5", "A9").Copy[/COLOR]
Sheets("DEC").Range("Y14").PasteSpecial xlPasteValues
Sheets("plus gros porteurs").[COLOR=rgb(85, 57, 130)]Range("B5", "B9").Copy[/COLOR]
Sheets("DEC").Range("Z14").PasteSpecial xlPasteValues
Sheets("DEC").Range("Z1") = Application.WorksheetFunction.SumIf(Sheets("Inventaire").Columns("E"), Sheets("DEC").Range("Y2"), Sheets("Inventaire").Columns("AG"))

End If

'decp
Sheets("decp").Range("Y14", "Z18").ClearContents
If Sheets("plus gros porteurs").Range("C4").Value = "Dorval Convictions PEA" Then
Sheets("plus gros porteurs").PivotTables("Tableau croisé dynamique15").PivotFields("Nom du Compte Titre").AutoSort xlDescending, "Somme de Encours Fin de Periode", Sheets("plus gros porteurs").PivotTables("Tableau croisé dynamique15").PivotColumnAxis.PivotLines(2), 1
[COLOR=rgb(226, 80, 65)]Sheets("plus gros porteurs").Range("A5", "A9").Copy[/COLOR]
Sheets("decp").Range("Y14").PasteSpecial xlPasteValues
Sheets("plus gros porteurs").[COLOR=rgb(85, 57, 130)]Range("C5", "C9").Copy[/COLOR]
Sheets("decp").Range("Z14").PasteSpecial xlPasteValues
Sheets("decp").Range("Z1") = Application.WorksheetFunction.SumIf(Sheets("Inventaire").Columns("E"), Sheets("decp").Range("Y2"), Sheets("Inventaire").Columns("AG"))
End If

En effet si vous voyez bien (lignes de code en couleur), celui qui a développé ce code avant moi faisait en 'dec un copier/coller du range "A5", "A9", sur une autre sheet, puis le range "B5", "B9" et ensuite passait à la suite c'est à dire 'decp et faisait la même chose avec le range "A5", "A9" mais prenait plutot le range "C5" , "C9" (voir lignes en couleur).

C'est le fait que nous ayons un TCD qui fait qu'il ait procédé ainsi car en fonction des filtres pré-établis, nous avons un tableau étendu sur plusieurs colonnes et ce n'est pas pratique si on doit aller chercher une cellule à copier sur une centaine de colonnes. C'est la raison pour laquelle je voudrais faire une boucle.


Le souci avec cette méthode est que le code ne marche plus à partir du moment ou lors de l'extraction les données ne sont plus agencées dans le même ordre, ou alors si une donnée est intercallée dans le tableau.
Moi mon challenge est de faire un boucle en utilisant une fonction qui va aller sélectionner la cellule de droite à chaque fois.
Je crois en effet que vous m'avez mis sur une bonne piste avec la fonction cel, mais je n'arrive pas à le matérialiser.

Espérant m'être fait comprendre,
 

Dranreb

XLDnaute Barbatruc
Pas clair tout ça.
Et je n'ai pas du tout l'habitude de voir des Range("A5", "A9"). Plutôt Range("A5:A9")
Pour corriger une variable Rng déclarée As Range de telle sorte qu'elle représente une plage décalée par rapporte à celle qu'elle représentait jusque là, vous pouvez faire Set Rng = Rng.Offset(NbLignes, NbColonnes)
 

Excellerateur

XLDnaute Occasionnel
Pas clair tout ça.
Et je n'ai pas du tout l'habitude de voir des Range("A5", "A9"). Plutôt Range("A5:A9")
Pour corriger une variable Rng déclarée As Range de telle sorte qu'elle représente une plage décalée par rapporte à celle qu'elle représentait jusque là, vous pouvez faire Set Rng = Rng.Offset(NbLignes, NbColonnes)
Je crois en effet que vous avez raison sur la syntaxe qui était utilisée jusque là.
Pas clair tout ça.
Et je n'ai pas du tout l'habitude de voir des Range("A5", "A9"). Plutôt Range("A5:A9")

Cependant, je ne comprends pas la solution que vous proposez actuellement.
 

Excellerateur

XLDnaute Occasionnel
Salut l'équipe!

Je viens de joindre un fichier Excel pour illustrer mon propos.

En effet je cherche à créer une macro VBA qui fera une boucle qui va dans chaque cycle faire un tri (du plus grand au plus petit) sur les colonnes "C", "D", "E", "F", "G", et "H".

Puis en 2nde étape je veux que le code copie la liste des 4 premières cellules de la colonne "A" donc les range("A3:A6") et la colle sur une autre feuille (feuille A, range(("A3:A6"), puis sur la feuille Calculs ratios vient copier la liste triée en colonne "C" et la colle à la suite de la copie précédente (sur feuille A, range("B3:B6")).

Puis par la suite sur la feuille Calculs ratios, après avoir fait le tri (du plus grand au plus petit) sur la colonne "D" on copie encore les range("A3:A6") que l'on colle sur la feuille A en range(("D3: D6"), ensuite on revient sur la feuille Calculs ratios, on copie la liste triée en colonne "D" et la colle à la suite de la copie précédente (sur feuille A, range("E3:E6")).

Et ainsi de suite jusqu'à remplir les 6 tableaux en feuille A. Sur le modèle réel chaque tableau à créer est sur un autre onglet et il y a bien plus de 6 tableaux à créer d'où tout l'intérêt d'un code.

Le fait de trier du plus grand au plus petit à chaque fois change l'ordre des intitulés en colonne "A" donc j'ai réellement besoin de créer une boucle pour cela.

Vous pouvez vous servir du fichier pour le comprendre.

Merci d'avance de votre attention.

Excellemment votre.
 

Pièces jointes

  • Copie de pays-et-ratios-v11.xlsx
    16.5 KB · Affichages: 9
Dernière édition:

Excellerateur

XLDnaute Occasionnel
Bonjour.
Dans votre macro, si jamais pour un des résultat c'était une autre ville qu'une des 4 premières qui supasserait le 4ème, devrait elle la remplacer ?
Pas sûr d'avoir compris la question, mais si la question est de savoir si une autre ville que l'une des 4 première pourrait être classée dans le top 5 et bien je dis OUI cela dépend en effet du tri qui est fait dans la colonne sur laquelle tu effectues le tri.
 

Dranreb

XLDnaute Barbatruc
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 ?
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
311 720
Messages
2 081 909
Membres
101 836
dernier inscrit
karmon