XL 2021 Macro copier-coller colonnes précédentes

Retraite

XLDnaute Nouveau
Bonjour,
Par macro, je cherche à copier coller les 3 colonnes précédentes chaque semaine.

exemple la semaine 1, je copie-colle les colonnes A,B,C en D,E,F
la semaine suivante je voudrais copier-coller les colonnes D,E,F en G,H,I et ainsi de suite.

Comment mettre une référence relative dans une macro ?

Merci d'avance
 
Solution
Bonjour.
Ben voilà, on voit tout de suite des choses que vous n'aviez pas dites ou inexactement, à savoir :
— Il y a une date en 1ère ligne de l'avant dernière colonne ce qui permettrait de détecter une condition par rapport à la date du jour,
— Ce sont 2 colonnes et non pas 3 qui sont concernées.
— Vous demandez à écraser les formules de l'ancienne dernière colonne, ce qui n'a pas de sens vu qu'elles sont conservées dans les colonnes précédentes, mais on peut supposer qu'en fait ce sont plutôt les #N/A de la nouvelle dernière colonne qui vous gênent.
Je vous propose ce code dans le module Feuil1 (Feuil1) :
VB:
Option Explicit
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
   Dim Rng As Range, C As Integer
   Set Rng =...

Retraite

XLDnaute Nouveau
Non, car les infos des colonnes sont mis a jour chaque semaine. Pour l'instant je copie manuellement les 3 dernières colonnes puis je fais un collage spéciale-valeur pour écraser les formules des colonnes précédentes.
Dans les nouvelles colonnes, je mets à jour la saisie en ayant gardé les formules d'avant.
Merci Dranreb de se pencher sur ma question
 

Dranreb

XLDnaute Barbatruc
Peut être :
VB:
Intersect(Columns(X).Resize(, 3),ActiveSheet.UsedRange).FormulaR1C1 = "=RC[-3]"
En mettant à la place de X la 1ère colonne où vous voulez mettre la formule.
Mais si vous ne voulez au bout du compte que les valeurs pourquoi mettre des formules à références relatives aux 3 colonnes précédentes ?
Soit RngSrc un Range représentant la plage de 3 colonnes dont vous voulez copier les valeurs, faire :
VB:
RngSrc.Offset(, 3].Value = RngSrc.Value
Si ce sont par exemple toujours les 3 dernières colonnes de la plage utilisée :
VB:
Dim RngSrc As Range
Set RngSrc = ActiveSheet.UsedRange
Set RngSrc = RngSrc.Columns(RngSrc.Columns.Count - 2).Resize(, 3)
RngSrc.Offset(, 3).Value = RngSrc.Value
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
Ben voilà, on voit tout de suite des choses que vous n'aviez pas dites ou inexactement, à savoir :
— Il y a une date en 1ère ligne de l'avant dernière colonne ce qui permettrait de détecter une condition par rapport à la date du jour,
— Ce sont 2 colonnes et non pas 3 qui sont concernées.
— Vous demandez à écraser les formules de l'ancienne dernière colonne, ce qui n'a pas de sens vu qu'elles sont conservées dans les colonnes précédentes, mais on peut supposer qu'en fait ce sont plutôt les #N/A de la nouvelle dernière colonne qui vous gênent.
Je vous propose ce code dans le module Feuil1 (Feuil1) :
VB:
Option Explicit
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
   Dim Rng As Range, C As Integer
   Set Rng = Me.UsedRange
   C = Cells(1, Columns.Count).End(xlToLeft).Column
   If Rng(1, C).Value >= Date Then Exit Sub
   Application.EnableEvents = False
   Rng.Columns(C).Resize(, 2).Copy Destination:=Rng.Columns(C + 2)
   Rng(1, C + 2).FormulaR1C1 = "=RC[-2]+7"
   Set Rng = Rng(3, C + 2).Resize(Rng.Rows.Count - 2, 2)
   Rng.Columns(1).ClearContents
   Rng.Columns(2).FormulaR1C1 = "=IFERROR(RANK(RC[-1]," & Rng.Columns(1) _
      .Address(True, False, xlR1C1, False, Rng.Columns(2)) & "),"""")"
   Application.EnableEvents = True
   End Sub
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Mettez tout dans le module de l'objet Worksheet représentant la feuille concernée, c'est le Feuil1 (Feuil1) ou bien depuis Excel, clic droit sur l'onglet, commande Visualiser le code et collez tout dans la fenêtre de code.
Ça réagit quand vous sélectionnez une cellule, et que la dernière date en ligne 1 est inférieure à la date du jour.
Je ne vois pas l'utilité de figer la formule des Rang, surtout que celle de la nouvelle dernière colonne n'affiche plus les #N/A, mais si vous y teniez vous pourriez ajouter une instruction Rng.Columns(0).Value = Rng.Columns(0).Value devant la Rng.Columns(1).ClearContents
 

Discussions similaires

Réponses
20
Affichages
721

Statistiques des forums

Discussions
315 088
Messages
2 116 088
Membres
112 656
dernier inscrit
VNVT