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

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

        Merci beaucoup Michel !