Boucler un copier coller avec une constante

Résolu/Fermé
Stien - 13 août 2015 à 10:14
 Stien - 17 août 2015 à 12:49
Bonjour,

Je débute en création de macro et on me demande d'en créer des "simples" pour le boulot. Je bloque un peu sur la dernière partie de ma macro et j'ai du mal à la formuler clairement pour chercher des réponses sur un forum. Je vous donne le cas en espérant que vous pouvez m'aider.

Je cherche à copier la cellule "A3" d'une feuil1 et à la coller dans la cellule "A2" d'une feuil2
Ensuite il faudrait intégrer une boucle avec une constante, je m'explique :

Il faut copier la cellule "A4" de la feuil1 pour la coller dans la cellule "A948" de la feuil2
La constante reste la même un certain nombre de fois par la suite :

Il faut copier la cellule "A5" de la feuil1 pour la coller dans la cellule "A(948+946)=1894" (soit "A1894")

et ainsi de suite en gardant le même écart entre la cellule à copier et la cellule à coller

La cellule cible (celle ou l'on applique le coller) peut-être vide, du coup pour coller j'ai intégrer
"Sheets("feuil2").Range("A" & Range("A65500").End(xlUp).Row + 1).Select
ActiveCell.Paste"

Afin que la macro retrouve toujours la bonne cellule.

La manoeuvre doit-être répété 346 fois, du coup je cherche un peu à automatiser tout ça.

Autre question : Je vais dépasser le nombre de 65500 lignes de mon bout de formule plus haut, il va y avoir un impact ou tout va continuer à fonctionner niquel ?


Merci d'avance pour vos réponses.

Cordialement,
A voir également:

3 réponses

michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
13 août 2015 à 11:36
Bonjour,

version Excel ?
0
2010 mais Pijaku a résolu mon problème, merci pour ta disponibilité !
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751
13 août 2015 à 11:38
Bonjour,

1- Si tu fais cette opération 346 fois, cela veut dire que tu dois copier-coller les données contenues dans la feuille Feuil1, de A4 à A350.

1-a) Ok?

1-b) tu dois disposer d'Excel en version supérieure ou égale à 2007. Car là, tu as besoin de 328 264 lignes.

2- Si tout bon, voici le code :
Sub test()
Dim Lig As Long

Sheets("Feuil1").Select 'au cas ou...
For Lig = 3 To 350
   With Sheets("Feuil2")
      .Cells(2 + (Lig - 3) * 946, 1) = Sheets("Feuil1").Cells(Lig, 1)
   End With
Next Lig
End Sub

0
Pas tout à fait, enfaite mon 346 est divisé en 5 groupes de longueur inégale et selon le groupe on doit ajouter 946 lignes par lignes de groupe. Un peu compliqué mais en modifiant un tout petit peu ta formule j'ai réussis à avoir le résultat attendu.

Merci pour ta réactivité !

J'ai Excel 2010, je devrais sans doute rajouter des lignes (je devrais arriver à un total de 700 000). Il y a une limite pour excel ?
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751 > Stien
13 août 2015 à 12:19
Il y a une limite pour excel ?
Oui... et non!
Oui : depuis excel 2007, le nombre de lignes est limité à 1 048 576

Mais non : ICI, Microsoft présente un fichier excel, construit sur 2010 et comportant 101 411 707 lignes.

Salutations à michel. Désolé, je n'ai pas rafraichit avant de poster.
A++
0
Je pensais à une limite dans les formules, par exemple j'ai des lignes qui ressemblent à :
" Range("A" & Range("A65500").End(xlUp).Row + 1).Select"

Le 65500 va me limiter ? ou il va continuer à faire une sélection même si j'ai 500 000 lignes ?

Deuxième petite question, je cherche à inclure un peu de dynamisme dans ma plage de données car elle risque de s'agrandir.
Si je reprends la formule que tu m'as donné (et qui marche pour l'instant super bien sur la plage fixe)

"Sub test()
Dim Lig As Long

Sheets("Feuil1").Select 'au cas ou...
For Lig = 3 To 350
With Sheets("Feuil2")
.Cells(2 + (Lig - 3) * 946, 1) = Sheets("Feuil1").Cells(Lig, 1)
End With
Next Lig
End Sub"

Au niveau de la ligne : For Lig = 3 To 350, serait-il possible d'ajuster la plage en fonction des cellules non vides ?
0
De plus j'ai une boucle au dessus :
"Sub boucle_for()

For i = 1 To 140

Range("A" & Range("A65500").End(xlUp).Row + 1).Select
ActiveSheet.Paste

Next

End Sub"



Si je veux vraiment rendre ma formule dynamique il faudrait que mon 140 puissent varier selon un compte de ligne (j'ai une colonne qui contient 140 élèments, demain cette colonne risque de passer à 142 par exemple.)

Tu aurais une solution à me donner ?

Ps : Dans ce cas la il vaut mieux recréer un nouveau post ou je fais ma demande au bon endroit ?
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751
14 août 2015 à 11:27
Bonjour,

Donne nous le contenu entier de ton code.
Explique nous ce que tu veux faire de manière précise.

Parce que là, tes bouts de code ne nous disent rien du tout.
0
Sub ca_manque_de_dynamisme_VM()
    Application.Goto "PLAGE1"

    Selection.Copy
    Sheets("target VM").Select
    Range("A2").Select
    ActiveSheet.Paste
    
    Call boucle_for
    Call numero_compte

End Sub


Sub boucle_for()
 
    For i = 1 To 140
         Range("A" & Range("A65500").End(xlUp).Row + 1).Select
         ActiveSheet.Paste
    Next
 
End Sub



Sub numero_compte()

Dim Lig As Long

Sheets("Classification des Comptes").Select 'au cas ou...
For Lig = 3 To 144
   With Sheets("target VM")
      .Cells(2 + (Lig - 3) * 957, 1) = Sheets("Classification des Comptes").Cells(Lig, 1)
   End With
Next Lig

End Sub





Voila mon code en entier.
J'ai réussis à rendre mon premier copier dynamique grâce à une formule "décaler" que j'ai appelé PLAGE1.
Cette Plage contient 956 lignes (avec formules) pour le moment et peut évoluer.
Dans l'onglet classification des comptes j'ai une liste de 140 comptes (qui peut évoluer aussi). Pour chacun de ces 140 comptes, il faut que je lui colle les 956 lignes. Je devrais avoir un total de 133 840 lignes à la fin donc.

Le problème est que le 140 peut évoluer ainsi que le 956. Pour fournir un code durable dans le temps il faudrait que j'inclus cette flexibilité dans ma formule.

Le problème est que ce n'est que ma deuxième macro, pour le coup je ne maitrise pas bien le Visual Basic.
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751 > Stien
14 août 2015 à 12:12
Essaye juste cette macro :
Sub essai()
Dim Lig As Integer, NbCel As Integer

NbCel = Range("PLAGE1").Rows.Count
For Lig = 3 To 144
   With Sheets("target VM")
      .Range("A" & 2 + (Lig - 3) * NbCel).Resize(NbCel) = Range("PLAGE1").Value
   End With
Next Lig
End Sub


Pour automatiser le "dynamisme" des 140, il faudrait savoir ou se trouve (feuille + plage de cellules) ta liste des 140 comptes...
0
Hello, de retour au bureau,

Ta macro me donne une erreur "dépassement de capacité" au niveau de ta ligne 7.
Pour le 140, il se trouve dans une feuille appelée "Classification des Comptes", de A3 à A142 pour le moment, mais justement j'aimerai que si ça passe de A3 à A143, la macro prenne en cours ce changement
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751 > Stien
17 août 2015 à 11:56
Bonjour,

Que te donne ce test :

Sub test()
Dim NbCel As Integer

NbCel = Range("PLAGE1").Rows.Count
MsgBox NbCel
End Sub
0
Stien > pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024
17 août 2015 à 12:49
Bonjour,

J'ai finalement résolu mon problème, j'ai réussis à gagner en flexibilité en rajoutant une feuille contenant toutes mes données non fixe (sous forme de tableau). A l'aide de simples formules il va toujours rester à jour et ma macro va chercher les informations dedans. Beaucoup plus simple que les arrachages de cheveux.

Merci à toi Pijaku de n'avoir pas désespéré sur mon cas, et d'avoir été aussi disponible.
0