Macro: Copier Coller X fois, X étant un nombre dans une cellule

Résolu/Fermé
Signaler
Messages postés
70
Date d'inscription
vendredi 5 septembre 2014
Statut
Membre
Dernière intervention
8 mars 2016
-
Messages postés
70
Date d'inscription
vendredi 5 septembre 2014
Statut
Membre
Dernière intervention
8 mars 2016
-
Bonjour,


J'ai cherché une réponse sur le forum (et sur d'autres également merci Internet) mais je ne trouve pas la réponse au cas qui me concerne.


Voilà, j'aimerai que la macro effectue un copier/coller d'une plage de cellule dans une feuille A vers une feuille B un nombre X de fois sachant que X est un chiffre inscrit dans une cellule. Le copier/coller se fait à la suite en colonne vers la droite.

Alors après avoir essayé de bidouiller un truc qui, s'il a la gentillesse de ne pas m'afficher un signal d'erreur, ne me fait rien du tout, voici ce que j'ai:

Pouvez-vous m'expliquer pourquoi j'ai faux?

Sub COPIER_COLLER_PLS_FOIS()

Dim x As Integer
Dim Cpt As Integer



x = Range("D4").Value

Sheets("BlaBla1").Select
Range("C6:C20").Select
Selection.Copy


With Sheets("BlaBla2")
For Cpt = 1 To x

Sheets("BlaBla2").Select
Range("B4").End(xlToRight).Offset(0, 1).Select
Selection.PasteValue

Next Cpt
End With



End Sub


Je tiens à préciser que je débute avec les variables, cèst pour moi un nouveau langage face aux précédentes macro de simple copier coller que je faisais auparant.

Sincèrement,


Koalacid

2 réponses

Messages postés
14934
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 590
Bonjour,

un truc qui, s'il a la gentillesse de ne pas m'afficher un signal d'erreur, ne me fait rien du tout,

Ton truc n'était pas si loin que cela de la solution mais la programmation n'a pas beaucoup de gentillesse ;-)
Sub COPIER_COLLER_PLS_FOIS()

Dim x As Integer
Dim Cpt As Integer

    With Sheets("BlaBla1")
        x = .Range("D4").Value
        .Range("C6:C20").Copy
    End With
    
    With Sheets("BlaBla2")
        For Cpt = 1 To x
            .Paste Destination:=.Range("B4").Offset(0, Cpt)
        Next Cpt
    End With
End Sub

Essaie de ne pas utiliser les "select" qui ne servent pas souvent et surchargent le traitement.
1
Messages postés
70
Date d'inscription
vendredi 5 septembre 2014
Statut
Membre
Dernière intervention
8 mars 2016
2
Hello gbinforme,


Génial! Ca fonctionne! Merci beaucoup à toi!

Pour les .select, je sais ils ne servent pas à garnd chose, mais étant débutant, j'ai besoin d'écrire les étapes pour être sûr de les comprendre.

Dans le même contexte, sans vouloir abuser de ton temps, tu peux m'expliquer ce qui n'allait pas?

J'ai vu que la syntaxe n'était pas identique. c'était "juste" ca?

Est-ce que cette partie du code:

Range("B4").End(xlToRight).Offset(0, 1).Select


Et celle-là:
.Paste Destination:=.Range("B4").Offset(0, Cpt)


Sont similaires?

Je comprend ta méthode, mais pour savoir, est-ce que j'aurais pu lui demander d'aller chercher à chaque fois la dernière cellule pleine puis d'aller un cran plus loin et avoir le même résultat?


Sincèrement,

Koalacid
0
Messages postés
14934
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 590
Bonjour,

j'ai besoin d'écrire les étapes pour être sûr de les comprendre
Tu as parfaitement raison car lorsque l'on a compris le fonctionnement c'est plus facile de coder ce que l'on veut.

est-ce que j'aurais pu lui demander d'aller chercher à chaque fois la dernière cellule pleine
Tu aurais pu mais le "xlToRight" est assez bizarre comme réaction et difficile d'utilisation car l'on se retrouve souvent très à droite sur la dernière colonne (et avec un offset...) ou au milieu si tu as une colonne vide. Par exemple si tu n'as rien en B4, tu vas "planter".
Cependant ta méthode "Range" devrait fonctionner
Range("B4").End(xlToRight).Offset(0, 1).Select

j'utilise plus souvent Cells que Range car l'on joue plus facilement avec lignes et/ou colonnes à la fois
Cells(4, Cells(4, Columns.Count).End(xlToLeft).Column + 1).Select

Pour le end, xlToLeft ou xlup sont très fiables en partant du maxi mais xlToRight et xldown posent souvent problèmes avec les vides éventuels.

Plutôt que les select de feuilles qui sont très gourmands en temps, il vaut mieux utiliser :
- soit With sheets("xxx") puis . et tes objets de la feuille
- soit faire un set
. Dim ws as worksheet
. set ws = sheets("xxx")
. puis ws. et tes objets de la feuille
0
Messages postés
70
Date d'inscription
vendredi 5 septembre 2014
Statut
Membre
Dernière intervention
8 mars 2016
2
En faite, si j'utilise End(xlToRight).offset, c'est parce que je ne copie colle pas une plage comprenant qu'une colonne mais plusieurs colonne (22 pour être précis) et il n'y aura pas de cellule vide dans cette plage.

Ducoup j'ai essayé ainsi

.Paste Destination:=Cells(4, Cells(4, Columns.Count).End(xlToLeft).Column + 1)


Et ca fonctione! :)
Mais je sais pas pourquoi :(

Que signifie le critère Columns.Count? Pourquoi l'utiliser à ce moment et dans cette combianaison?

Autre chose, j'ai remarqué que si je lancais la macro depuis la feuille blabla1 le copier/coller se faisait en blabla1 et dans le cas ou j'étais sur blabla2 ca faisait sur blabla2.

Alors j'ai fait rajouté un .Select :D (je suis incorrigible je sais mais j'ai uen deadline donc pour l'instant je vais rester là-dessus et je regrderais pour la prochaine macro comment faire ces set qui sont assez intéressants!)

En tout cas merci pour ton aide!

Sincèrement
0
Messages postés
14934
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 590
Bonjour,

Que signifie le critère Columns.Count
c'est le nombre total de colonnes du classeur.

Autre chose, j'ai remarqué que si je lancais la macro

parce que tu n'a pas utilisé le with que je t'avais mis.

j'ai fait rajouté un .Select :D (je suis incorrigible je sais
il faut un certain nombre de plantages pour comprendre l'affection des feuilles et variables mais tu verras que lorsque tu auras suffisamment de données à manipuler tu comprendras pourquoi l'on supprime les select à moins que tu veuilles avoir du temps pour boire le café ;-)
0
Messages postés
70
Date d'inscription
vendredi 5 septembre 2014
Statut
Membre
Dernière intervention
8 mars 2016
2
Ok, bon je vais apprendre un peu par moi-même, il me faut tester pour apprendre.

En ce qui concerne les données, je sens arriver un grand nombre, en fait je le vois gros comme un cyclone! :D
0