Microsoft 365 décaler les colonnes dans une boucle

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 !

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
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:
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
 
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,
 
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)
 
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.
 
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

Dernière édition:
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.
 
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:
- 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
2
Affichages
293
  • Question Question
XL 2016 Syntaxe
Réponses
129
Affichages
2 K
Réponses
2
Affichages
507
Réponses
18
Affichages
943
Retour