VBA problème de copier-coller

Résolu/Fermé
ori05 Messages postés 56 Date d'inscription lundi 13 juillet 2009 Statut Membre Dernière intervention 7 septembre 2009 - 26 août 2009 à 16:23
ori05 Messages postés 56 Date d'inscription lundi 13 juillet 2009 Statut Membre Dernière intervention 7 septembre 2009 - 27 août 2009 à 10:51
Bonjour,
j'ai un petit problème avec le code suivant :

Sub macro1()

For i = 1 To 18 Step 1

If Sheets("EQUIPMENT CHARACTERISTICS").Range("nb" & i) <> "" Then
Range("A35").Select
Nbligne = 0
Do While ActiveCell <> ""
Selection.Offset(1, 0).Select
Nbligne = Nbligne + 1
Loop
Sheets("Data").Range("plage" & i).Copy
Sheets("EQUIPMENT CHARACTERISTICS").Rows(35 + Nbligne).Select
Selection.Insert Shift:=xlDown
End If

Next i

End Sub


En fait je voudrais copier des plages de cellules (allant de 1 à 18) venant de ma feuille data et les coller dans "equipment characteristic". Le problème est que il me colle bien les plages mais en ordre décroissant. En premier j'ai par exemple la plage18 ensuite la plage17.... alors que je voudrais la plage1 ensuite la plage2....
Je ne comprends pas du tout pourquoi ca me fait ça alors que je compte bien le nombre de cellule non vide avant et que je colle à partir de la première cellule vide !
En fait j'ai l'impression que Nbligne reste toujours à 0. et je ne vois pas pourquoi !!

Pourriez vous m'aider ???
merci beaucoup :-)
A voir également:

9 réponses

ori05 Messages postés 56 Date d'inscription lundi 13 juillet 2009 Statut Membre Dernière intervention 7 septembre 2009 3
26 août 2009 à 16:46
En fait je veux coller mes plages à partir de la cellule A35 (avant il y a autre chose). Le truc c'est que l'utilisateur choisit ce qu'il veut coller, c'est pour cela que à chaque fois je suis obligée de compter le nombre de ligne non vide à partir de la cellule A35 pour que mes plages se collent bien les une à la suite des autres.

Je ne comprend pas très bien ce que fait cette commande :

Sheets("EQUIPMENT CHARACTERISTICS").Range("A65536").End(xlUp)

Merci :-)
1
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
26 août 2009 à 16:50
Cette "commande", c'est juste l'endroit ou doit être collé ce que tu as copié.
Range("A65536").End(xlUp) c'est tout simplement la dernière cellule non vide de la colonne A.
Donc je me suis planté... Il te convient d'écrire :
Sheets("gnagnagna").Range("A65536").End(xlUp).Offset(1, 0) pour obtenir la première cellule vide de la colonne A.
Toutes mes excuses.
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
26 août 2009 à 16:38
Bonjour,
Ta macro m'a l'air très complexe pour un simple copier coller.
Tu veux coller tes plages (de la feuille data) sur la première ligne non vide de la feuille EQUIPMENT CHARACTERISTICS colonne A?

Sub macro1()
For i = 1 To 18 Step 1
If Sheets("EQUIPMENT CHARACTERISTICS").Range("nb" & i) <> "" Then
Sheets("Data").Range("plage" & i).Copy Sheets("EQUIPMENT CHARACTERISTICS").Range("A65536").End(xlUp)
End If
Next
0
ori05 Messages postés 56 Date d'inscription lundi 13 juillet 2009 Statut Membre Dernière intervention 7 septembre 2009 3
26 août 2009 à 16:56
Ok mais moi j'ai besoin de la première cellule vide à partir de A35...

merci :-)
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
26 août 2009 à 16:59
Milles excuses.... La voici :
Range("A35").End(xlDown).Offset(1, 0)
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743 > pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024
26 août 2009 à 17:02
Attention, petite précision importante : Range("A35").End(xlDown).Offset(1, 0) ne fonctionne que si A35 est non vide. Il vaux donc mieux indiquer (Si A35 est non vide bien sur) : Range("A34").End(xlDown).Offset(1, 0)
0
ori05 Messages postés 56 Date d'inscription lundi 13 juillet 2009 Statut Membre Dernière intervention 7 septembre 2009 3
26 août 2009 à 17:06
Désolée, je dois être un peu nulle... mais je ne vois pas comment l'utiliser....

merci pour ton aide !!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
27 août 2009 à 09:29
Salut,
Reprenons depuis le début. Tu as fait ceci :
Sub macro1()
For i = 1 To 18 Step 1 '-----> boucle de 1 à 18
If Sheets("EQUIPMENT CHARACTERISTICS").Range("nb" & i) <> "" Then '---> Si la cellule nb(1 à 18) est non vide
Range("A35").Select '-----> d'ici
Nbligne = 0
Do While ActiveCell <> ""
Selection.Offset(1, 0).Select
Nbligne = Nbligne + 1
Loop ' ----------------------> à ici tu cherches la 1ère cellule vide en dessous de A35
Sheets("Data").Range("plage" & i).Copy '-----> tu copies ce qui t'intéresse
Sheets("EQUIPMENT CHARACTERISTICS").Rows(35 + Nbligne).Select '----> sélectionne la cellule ou coller
Selection.Insert Shift:=xlDown ' --------> tu l'insères
End If
Next i '------> et hop au suivant
End Sub

La première partie de ta macro peux être simplifiée (en italique ce qui ne change pas):

Sub macro1()
For i = 1 To 18 Step 1 '-----> boucle de 1 à 18
If Sheets("EQUIPMENT CHARACTERISTICS").Range("nb" & i) <> "" Then

'la procédure qui suit évite de sélectionner "pas à pas" toutes les cellules jusqu'à trouver la 1ère vide
If Sheets("EQUIPMENT CHARACTERISTICS").Range("A35") <> "" Then
If Sheets("EQUIPMENT CHARACTERISTICS").Range("A36") <> "" Then
Range("A35").End(xlDown).Offset(1, 0).Select
Else
Range("A36").Select
End If
Else
Range("A35").Select
End if
Sheets("Data").Range("plage" & i).Copy
Sheets("EQUIPMENT CHARACTERISTICS").Rows(35 + Nbligne).Select
Selection.Insert Shift:=xlDown
End If
Next i
End Sub


En fait, en macro il faut éviter au maximum les "select". C'est pour cela qu'une boucle comme tu avais fait :
Do While ActiveCell <> ""
Selection.Offset(1, 0).Select
Nbligne = Nbligne + 1
Loop
doit être évitée au maximum.
Bon courage
0
ori05 Messages postés 56 Date d'inscription lundi 13 juillet 2009 Statut Membre Dernière intervention 7 septembre 2009 3
27 août 2009 à 09:48
Merci bien je vais essayer avec ça. par contre tu as laissé :

Sheets("EQUIPMENT CHARACTERISTICS").Rows(35 + Nbligne).Select

Or je n'ai plus Nbligne mais je ne vois pas comment que peux selectionner avec tout ce qui a été fait avant la première cellule vide a partir de A35 pour insérer au bon endroit.

Merci !!!
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
27 août 2009 à 09:51
oups!! décidément j'aurais pas du "sauter" le café ce matin....
Sheets("EQUIPMENT CHARACTERISTICS").Select 'suffit car tu as déjà sélectionner la bonne cellule juste avant.....
désolé
0
ori05 Messages postés 56 Date d'inscription lundi 13 juillet 2009 Statut Membre Dernière intervention 7 septembre 2009 3
27 août 2009 à 09:57
Bon ça marche mais malheureusement ça donne exactement la même chose que ma première macro !
ça colle les plages de la 18 à la 1 et non de la 1 à la 18 !!!
Comment faire ?

merci beaucoup !!! :-)
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
27 août 2009 à 10:00
oui parce que l'on "insère". Tu pourrais faire ta macro en insérant d'abord le nombre de lignes voulues et ensuite en copiant collant toutes tes lignes en 1 fois...
0
ori05 Messages postés 56 Date d'inscription lundi 13 juillet 2009 Statut Membre Dernière intervention 7 septembre 2009 3
27 août 2009 à 10:09
Ba alors la je ne comprends vraiment pas, le code est fait pour qu'il insère à la première cellule vide ! Il doit donc mettre les plages les unes à la suite des autres ! Je vais insérer les lignes d'abord alors ....

Merci beaucoup pour ton aide ! :-)
0
ori05 Messages postés 56 Date d'inscription lundi 13 juillet 2009 Statut Membre Dernière intervention 7 septembre 2009 3
27 août 2009 à 10:51
Bon finalement pour éviter d'avoir à insérer le nombre de ligne nécessaire j'ai fait ma boucle dans l'autre sens, et là ça donne le résultat escompté.

Sub macro1()
For i = 18 To 1 Step -1
If Sheets("EQUIPMENT CHARACTERISTICS").Range("nb" & i) <> "" Then
Sheets("Data").Range("plage" & i).Copy
Sheets("EQUIPMENT CHARACTERISTICS").Rows(35).Select
Selection.Insert Shift:=xlDown
End If
Next i
End Sub

Et le code est beaucoup plus simple !

Mais je ne comprends toujours pas pourquoi celui du début ne marchait pas comme je voulais !

Merci beaucoup pour ton aide !!
0