Copié/collé avec variable

Résolu
Bonjour,

Après cet après midi de tentatives et de recherches, je me résigne à poster sur le forum.

Je vous explique mon problème :
Sur un premier onglet, il y a un tableau avec un nombre variable de ligne selon les semaines.
Sur la première colonne, il y a un nombre qui identifie la ligne (qui est, dans mon contexte, un document).
J'ai envie de créer une macro qui me permet de copier/coller ces lignes sur un autre onglet suivant le numéro de la ligne.

J'ai essayé pas mal de choses, dont ce dernier essai :
Sub diffusion()
Dim num As Long
Dim h As Integer
Dim i As Long

num = 13 
'mon tableau commence à la ligne 13

While Not IsEmpty(Cells(num, 1))
'tant que la case n'est pas vide je fais le copié collé

h = Sheets("Diffusion").Cells(num, 1).Value
'h sera la valeur du numéro du document

Range(Cells(num, 1), Cells(num, 8)).Copy Destination:=Sheets("Suivi de Diffusion").Range(Cells(h, 1)).Offset(14, 0) 
'la ligne de mon premier onglet à copier va de la colonne A à H, d'où le Range(Cells(num, 1), Cells(num, 8))
'à la ligne 30 de mon deuxième onglet il y a le doc 16 par exemple, d'où le offset(14, 0)

num = num + 1
'j'incrémente pour ma boucle

Wend

End Sub


Lorsque je lance ma maccro, rien ne se passe.
Je vous remercie beaucoup pour toute aide !

4 réponses

  1. Super !! C'est exactement ce que je voulais !

    Merci beaucoup Michel !
    1. Contributeur
      Bonjour
      hé oui, il faut alors une boucle ;o)

      Option Explicit
      '--------
      Sub diffuser()
      Dim Derlig As Byte, Lig_d As Byte, Num As Byte, T_diff
      Dim Lig_s As Byte
      Application.ScreenUpdating = False

      With Sheets("diffusion")
      Derlig = .Columns("A").Find("", .Range("A12")).Row - 1
      For Lig_d = 13 To Derlig
      Num = .Cells(Lig_d, "A")
      T_diff = .Range(.Cells(Lig_d, "B"), .Cells(Lig_d, "H")).Value
      With Sheets("Suivi de diffusion")
      Lig_s = .Columns("A").Find(Num, .Range("A12")).Row
      .Range(.Cells(Lig_s, "B"), .Cells(Lig_s, "H")) = T_diff
      .Rows(Lig_s).Rows.AutoFit ' voir si OK avec XL<2007
      End With
      Next
      End With
      Sheets("Suivi de diffusion").activate
      End Sub


      Michel
      1. Bonjour Michel,

        Je vous remercie beaucoup d'avoir pris le temps de me répondre.

        Lorsque je lance le programme, VBA m'envoie un message d'erreur : "Le mode Activate de la classe Range a échoué".

        De plus, je pense m'être mal exprimé :
        Si je comprends bien votre procédure, elle copie mon tableau entier dans le deuxième onglet. Or, j'aimerai pouvoir "ranger" les lignes de mon tableau une par une...
        C'est à dire que dans le premier onglet j'ai qqch du type :
        21. Plan
        24. Note de calcul
        23. Fiche technique

        et que dans le deuxième onglet, après avoir lancé ma procédure, j'ai :
        1.
        2.
        ...
        20.
        21. Plan
        22.
        23. Fiche technique
        24. Note de calcul

        par exemple...
        C'est la raison pour laquelle une boucle me semblait le plus judicieux (Peut-être à tort !!).

        Je vous remercie encore du temps que vous m'avez accordé.
        1. Contributeur
          OK pour activate à supprimer
          ,mais que vient faire
          Plan, fiche technique etc
          avec "suivi de diffusion"

          au besoin
          mettre le classeur sans données confidentielles en pièce jointe sur
          http://cjoint.com/
          puis copier l'adresse du lien et la coller dans le message de réponse
      2. Contributeur
        Bonjour

        Sans boucle

        Option Explicit
        '--------
        Sub diffuser()
        Dim Num As Byte, Derlig As Integer, T_copie

        Application.ScreenUpdating = False
        Num = 13
        'mon tableau commence à la ligne 13
        ' range A12 ne doit pas être vide (un espace suffira)

        Derlig = Columns("A").Find("", Range("A12"), xlValues).Row - 1
        T_copie = Range(Cells(Num, 1), Cells(Derlig, 8))
        With Sheets("Suivi de Diffusion").Range("A" & 30).Resize(UBound(T_copie), 8)
        .Value = T_copie
        .Activate
        End With
        End Sub


        Michel