VBA problème de copier-coller

Résolu
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 :-)
Configuration: Windows XP Internet Explorer 7.0

9 réponses

  1. 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. Modérateur
      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.
  2. Modérateur
    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
    1. Ok mais moi j'ai besoin de la première cellule vide à partir de A35...

      merci :-)
      1. Modérateur
        Milles excuses.... La voici :
        Range("A35").End(xlDown).Offset(1, 0)
      2. Modérateur
        @pijakuAttention, 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)
    2. Désolée, je dois être un peu nulle... mais je ne vois pas comment l'utiliser....

      merci pour ton aide !!
      1. Modérateur
        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
        1. 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 !!!
          1. Modérateur
            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é
        2. 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 !!! :-)
          1. Modérateur
            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...
        3. 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 ! :-)
          1. 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 !!