Copier/Coller vers colonnes suivantes

Bonjour,

J'ai un fichier excel dans lequel les utilisateurs peuvent choisir de commander un panier de fruits de saison.

Sur le premier onglet, on peut donc choisir le numéro du panier (c'est surtout un identifiant pour savoir quel panier contient quoi) et le type de panier (un type par saison). De ce type découle la composition du panier (3 fruits qui s'affichent selon une recherche V).

Ce que je cherche à faire, c'est "enregistrer" les différents choix d'une personne dans un autre onglet. En quelques sortes, je souhaite avoir un onglet "récapitulatif" dans lequel est compilé les différents choix de panier.

Je voyais cela avec un bouton "commander", associé à une macro qui, viendrait copier le contenu actuel du tableau (c'est à dire, le numéro du colis, le type et la composition), puis coller cela dans un onglet "récapitulatif de la commande"). Une fois copié vers ce nouvel onglet, la personne pourrait changer les données dans le tableau pour composer son deuxième colis. Elle cliquerait alors de nouveau sur "commander" pour que ce nouveau choix s'incrémente dans la colonne suivante de l'onglet "récapitulatif".

Etc, etc. pour des colis numéro 3, 4...

Est-ce possible de faire cela ? Une sorte de copier/coller d'une plage de cellule (dont les données vont bouger) vers une colonne, puis la colonne suivante, puis la suivante, etc...

Merci d'avance pour votre aide, voici un fichier succinct pour éclairer ma problématique.

35test2.xlsx (13.23 Ko)

Bonjour,

Sub Commander()
    Dim k%
    With Worksheets("Récapitulatif")
        k = .Range("XFD2").End(xlToLeft).Column - 1
        .Range("B2:B6").Offset(, k).Value = Worksheets("Saisie de commande").Range("C3:C7").Value
    End With
End Sub

A améliorer avec des noms...

Cordialement.

79dlct-test2.xlsm (20.86 Ko)

Bonjour MFerrand,

Merci pour cette solution qui a l'air de fonctionner ! Je vais tenter de la ré-appliquer à mon fichier plus complexe !

Peux-tu m'expliquer un peu les différents éléments de ce code ? Que je puisse le comprendre à 100% et le reproduire dans un autre fichier ?

Pourrais-tu également ce que je dois rajouter au code pour rajouter une condition. Par exemple, en fonction de s'il y a une pomme dans mon panier, la copie du tableau se fait dans un onglet "Récapitulatif 1". Si ce n'est pas le cas, la copie se fait dans un autre onglet, "Récapitulatif 2".

En gros, si ma cellule lambda contient "Pomme" alors copie dans "Récapitulatif 1", sinon copie dans "Récapitulatif 2".

Merci d'avance,

Deux lignes de code, yapas grandchose à expliquer !

On a une plage qui contient la commande, et on a une plage récap, de taille égale, où l'on doit placer cette commande.

Il suffit donc d'affecter les valeurs de la première plage à la seconde ! En VBA, on l'écrit simplement sous la forme :

PlageRécap.Value = PlageCommande.Value

et il le fait ! Sans copier-coller ou autre méthode encore plus compliquée ! Ce que l'on ne peut pas faire manuellement (et que l'on ne peut non plus enregistrer puisqu'on ne peut le faire manuellement).

Mais la plage récap va se décaler d'une colonne à chaque commande... : on va donc considérer la plage initiale d'intitulé et calculer le décalage de la plage récap par rapport à cette plage fixe à chaque commande.

La méthode End(xlToLeft) sur la ligne 2 va nous permettre d'obtenir l'index de colonne de la dernière récapitulation. S'il n'y en a pas encore eu, on obtiendra 2, colonne de la plage fixe (en B) dont il faut retrancher 1 (en raison de sa position en B) pour obtenir le premier décalage. Et l'on applique la méthode précédemment indiquée à cette plage décalée.

Pour améliorer, on nomme la plage de commande (C3:C7) : Commande

On nomme la plage récap de référence (B2:B6) : Récap

La procédure se simplifie :

Sub Commander()
    Dim k%
    With [Récap]
        k = .Worksheet.Range("XFD2").End(xlToLeft).Column - 1
        .Offset(, k).Value = [Commande].Value
    End With
End Sub

Cordialement.

Merci beaucoup pour toutes ces explications, j'y vois plus clair !

J'ai essayé de reproduire ce code sur un autre fichier. Le copié/collé se passe bien. Cependant, je n'ai plus l'incrémentation de chacun des paniers, comme cela était le cas sur le fichier Test2. Pourtant, rien à bouger en termes de code. La seule chose qui a changé, c'est ma plage de cellule (qui est plus grande, elle contient 12 cellules).

est-ce que cela pourrait venir de " k = .Worksheet.Range("XFD2" ??? C'est la seule inconnue qu'il me reste dans la formule... Peux-tu m'expliquer à quoi cela sert ?

XFD2 est la cellule de la dernière colonne de la ligne 2. On lui applique End avec le paramètre xlToLeft pour atteindre la dernière cellule utilisée sur la ligne 2 et on en récupère le numéro de colonne.

Worksheet réfère (car précédé d'un point) à [Récap], plage nommée mise en bloc With (toutes les expressions débutant par un point dans le bloc réfèrent à cette plage).

Donc on pose la plage nommée Récap, avec .Worksheet on renvoie la feuille dans laquelle elle se trouve, avec .Range("XFD2") on renvoie la cellule indiquée de ladite feuille, avec .End(xlToLeft) on renvoie la cellule la plus à droite utilisée de la ligne concernée, et avec .Column le numéro de colonne de cette dernière cellule, qu'on diminue de 1 pour avoir notre décalage.

A la ligne suivante, .Offset réfère également à [Récap]...

En travaillant avec des noms de plage, le code ne peut fonctionner que si les plages concernées ont bien été nommées.

Cordialement.

Bonjour MFerrand,

Merci encore pour les explications. C'est pas évident, mais je crois avoir compris le fonctionnement.

Toutefois, quand je tente d'intégrer ce code dans mon fichier de travail, la copie en décalé ne se fait plus. En gros, le collé précédent est remplacé par la nouveau collé.

Je ne comprends pas où j'ai faux puisque j'ai bien fait attention à ce que ma plage copiée et ma plage collée contienne le même nombre de cellules.

Si tu pouvais jeter un coup d'oeil au fichier ci-joint, ce serait super

La plage que je tente de copier est dans l'onglet "Calepinage", c'est C39:C61, que j'ai renommé "copier".

La première colonne pour la copie est dans l'onglet "Récap1000", c'est C3:C25, que j'ai renommé "coller".

Le bouton "sélectionner" en face de la plage "copier" est le bouton auquel j'affecte la macro.

A noter : c'est le même principe que mon premier fichier avec les paniers. Les données de la plage C39:C61 vont changer en fonction des paramètres plus haut dans cette feuille. A tout moment, le bouton "selectionner" me permet de "sauvegarder" la solution afficher dans C39:C61 dans l'onglet "Récap1000".

Ne tiens pas compte du contenu du reste du fichier, ce n'a pas de valeur concernant ce problème ^^

Merci encore si tu peux m'aider

66test-3.xlsm (129.68 Ko)

Bonjour,

Ta plage coller doit correspondre à la plage fixe à partir de laquelle les autres seront décalées de 1, 2, 3...

Ton premier collage se fera en C, la plage à nommer est donc en B, là où tu mets tes en-têtes de lignes...

Première rectif : coller = B3:B25 (logique, pour servir de référence ce ne peut être une plage vide...)

En maintenant XFD2 tu fais ta recherche de colonne en ligne 2, mais ta plage débute ligne 3, la ligne 2 est vide.

Il te faut donc mettre XFD3, à partir de quoi tu rencontreras l'inscription en B3 (au premier collage) qui te renverra 2 comme numéro de colonne.

Le décalage, ajusté à partir du numéro de colonne avec -1 renvoie bien 1 pour le premier collage, donc à maintenir. (Mais si ta plage avait été effectivement en C3:C25, il aurait fallu faire -2 pour le même résultat !)

Cordialement.

Re-bonjour Mferrand,

Super ça fonctionne !

Merci encore pour le temps que tu as passé à m'expliquer toute la mécanique ! Très sympa de ta part !

A bientôt

Rechercher des sujets similaires à "copier coller colonnes suivantes"