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. 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. 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
      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. Super !! C'est exactement ce que je voulais !

        Merci beaucoup Michel !