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

Résolu
Koalacid Messages postés 70 Statut Membre -  
Koalacid Messages postés 70 Statut Membre -
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

  1. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    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
    1. Koalacid Messages postés 70 Statut Membre 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
    2. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
       
      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
    3. Koalacid Messages postés 70 Statut Membre 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
  2. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    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
    1. Koalacid Messages postés 70 Statut Membre 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