Copier/coller plage variable entre deux onglets

Bonjour le forum,

je cherche à automatiser une petite procédure qui consiste à :

- copier les données d'une plage variable en colonne A feuille "BASE";

- coller les éléments à la première ligne vide de la colonne A dans la feuille "N_cde";

ça j'ai trouvé en faisant comme ceci :

Sub trouver_numero()

    Last_Row1 = Worksheets("BASE").Range("A" & Rows.Count).End(xlUp).Row
    Last_Row2 = Worksheets("N_cde").Range("A" & Rows.Count).End(xlUp).Row + 1

    Worksheets("BASE").Range("A2:A" & Last_Row1).Copy
    Worksheets("N_cde").Range("A" & Last_Row2).PasteSpecial Paste:=xlPasteValues

End Sub

mais pour le reste je sèche pour récupérer les numéros de commandes mentionnés dans la colonne B de la feuille "N_cde" (mais que pour l'équivalent de la zone copiée-collée précédemment).

Je ne sais pas si je peux déduire le nombre de lignes copiées-collées et en déduire de fait la dimension de la plage à copier-

8essai-forum.xlsm (18.08 Ko)

coller en retour.

merci pour vos retours

Bonjour dav86, le forum,

Un essai à partir de tableaux structurés et de l'enregistreur de macro.

Je me suis basé sur ta formule...

5dav86.xlsm (20.17 Ko)

Cordialement,

Bonjour Xorsankukaï,

merci pour ton retour.

en fait je me suis mal exprimé car les données collées dans la feuille "N_cde" ont vocation s'incrémentent au fur et à mesure (d'où mon idée de trouver la dernière ligne remplie)

Est ce que l'approche par tableaux structurés est compatible avec cette contrainte ?

je vais prendre le temps de lire le lien sur les tableaux que tu as indiqué.

Re,

Peut-être ainsi alors,

7dav86-v2.xlsm (21.26 Ko)

Cordialement,

je suis désolé, c'est moi qui ai vraiment très mal exprimé ma demande

tout fonctionne parfaitement avec ce que tu as proposé mais en fait (puisque je n'ai pas exprimé clairement mon besoin tu ne pouvais pas le deviner) je voudrais copier/coller les numéros de commandes (calculées dans la feuille N_cde) vers la plage B2 et suivants de la feuille "BASE". Mon souci c'est de prendre uniquement les numéros correspondant à l'export réalisé avec la macro à l'instant T.

désolé pour ces explications peu claires

voilà ce que j'aurai voulu faire. C'est sans doute pas très propre et d'ailleurs ça coince sur la ligne.

.Range("A" & Last_Row2 & ":A" & Last_Row3).Copy

j'ai le message "propriété ou méthode non géré par cette objet". J'ai mis "A" pour tester mais ce sont les valeurs en colonne "B" que je veux reprendre.

Est ce la syntaxe de la ligne qui n'est pas bonne ?

Sub trouver_numero()

    Last_Row1 = Worksheets("BASE").Range("A" & Rows.Count).End(xlUp).Row
    Last_Row2 = Worksheets("N_cde").Range("A" & Rows.Count).End(xlUp).Row + 1
    FindRow = Worksheets("BASE").Cells(Rows.Count, 1).End(xlUp).Row - 1

    Worksheets("BASE").Range("A2:A" & Last_Row1).Copy
    Worksheets("N_cde").Range("A" & Last_Row2).PasteSpecial Paste:=xlPasteValues

With Worksheets("N_cde")

Last_Row3 = Range("A" & Rows.Count).End(xlUp).Row
Range("A" & Last_Row2 & ":A" & Last_Row3).Copy
Worksheets.Range("B2").Pastepecial Paste:=xlPasteValues
End With

End Sub

Bonjour à tous,

Nouvelle tentative....de ce que j'ai compris....

14dav86-v3.xlsm (21.74 Ko)

Cordialement,

un grand merci xorsankukai !

c'est juste parfait et je n'aurai pas cru possible d'utiliser les tableaux structurés pour réaliser cette opération. je pense que cela va m'aider sur d'autres tableaux.

désolé pour le peu de clarté de l'expression du besoin au démarrage de ce fil.

Très bonne journée :)

Bonjour à tous,

je me réponds à moi même et rouvre le fil (peut-être aurait-il fallu ouvrir un autre sujet).

J'ai essayé d'adapter la proposition de Xorsankukaï au fait de copier / coller la colonne prestataire du tableau "tb_base" (classeur1) vers le tableau "tb_cde" (classeur2).

Sub Plaque2_Cliquer()

Dim rcell As Range, tb, lig%
Dim WB1 As Workbook, WB2 As Workbook
Dim ws1 As Worksheet, ws2 As Worksheet
Dim tb_cde As ListObject
Dim tb_base As ListObject

Set WB1 = ActiveWorkbook
Set ws1 = WB1.Sheets("BASE")
Set WB2 = Workbooks.Open("\\filer-td-02.crpc.fr\Transverses_alpc\EchangesCRF_DCI\MATIERE_LIMOGES\N_cde.xlsx")
Set ws2 = WB2.Sheets("N_cde")

  'définit la première cellule vid edu tableau tb_cde de la feuille N_cde
  With ws2.ListObjects("tb_cde")
   If .InsertRowRange Is Nothing Then
    Set rcell = .HeaderRowRange.Cells(1).Offset(.ListRows.Count + 1)
   Else
    Set rcell = .InsertRowRange.Cells(1)
   End If
   lig = rcell.Row - 2
  End With

  With ws1.ListObjects("tb_base")
  'si le tableau tb_base de la feuille BASE contient des données
   If Not .DataBodyRange Is Nothing Then
    'copy la colonne personne du tableau de la feuille BASE dans la colonne personne du tableau de la feuille N_cde
    'à partir de la première cellule 'rcell)
     Range("tb_base[Prestataire]").Copy rcell.Resize(.ListRows.Count, 1)
    'inscrit la formule dans la colonne numéro à partir de la première cellule (donc à droite de rcell)
     rcell.Offset(0, 1).FormulaR1C1 = _
        "=COUNTIF(tb_cde[[#Headers],[Prestataire]]:[@Prestataire],[@Prestataire])"
    'définit le tableau de valeur à partir de rcell
     tb = Sheets("N_cde").ListObjects("tb_cde").DataBodyRange.Offset(lig, 0).Value
     'copie le tableau tb dans le tableau tb_base
     Range("tb_base").Cells(2).Resize(Sheets("BASE").ListObjects("tb_base").ListRows.Count, 2) = tb
   End If
  End With
 'libère la mémoire
 Erase tb: Set rcell = Nothing
End Sub

J'obtiens une erreur sur le range à la ligne "Range("tb_base[Prestataire]")...

je cherche mais je n'arrive pas à comprendre ce qu'il faut modifier.....

merci pour votre coup de main :)

erreur ncde

J'ai trouvé. J'avais oublié de préciser que la feuille (N_cde) était dans le classeur défini en tant que WB2.

Par j'ai ajouté un WB1.activate (je sais que ce n'est pas idéal) mais sans cela l'erreur 1004 reste présente.

Sub Plaque2_Cliquer()

Dim rcell As Range, tb, lig%
Dim WB1 As Workbook, WB2 As Workbook
Dim ws1 As Worksheet, ws2 As Worksheet
Dim tb_cde As ListObject
Dim tb_base As ListObject

Set WB1 = ActiveWorkbook
Set ws1 = WB1.Sheets("BASE")
Set WB2 = Workbooks.Open("\\filer-td-02.crpc.fr\Transverses_alpc\EchangesCRF_DCI\MATIERE_LIMOGES\N_cde.xlsx")
Set ws2 = WB2.Sheets("N_cde")

  'définit la première cellule vid edu tableau tb_cde de la feuille N_cde
  With ws2.ListObjects("tb_cde")
   If .InsertRowRange Is Nothing Then
    Set rcell = .HeaderRowRange.Cells(1).Offset(.ListRows.Count + 1)
   Else
    Set rcell = .InsertRowRange.Cells(1)
   End If
   lig = rcell.Row - 2
  End With

    WB1.Activate
    With ws1.ListObjects("tb_base")
  'si le tableau tb_base de la feuille BASE contient des données
   If Not .DataBodyRange Is Nothing Then
    'copy la colonne personne du tableau de la feuille BASE dans la colonne personne du tableau de la feuille N_cde
    'à partir de la première cellule 'rcell)
     Range("tb_base[Prestataire]").Copy rcell.Resize(.ListRows.Count, 1)
    'inscrit la formule dans la colonne numéro à partir de la première cellule (donc à droite de rcell)
     rcell.Offset(0, 1).FormulaR1C1 = _
        "=COUNTIF(tb_cde[[#Headers],[Prestataire]]:[@Prestataire],[@Prestataire])"
    'définit le tableau de valeur à partir de rcell
     tb = ws2.ListObjects("tb_cde").DataBodyRange.Offset(lig, 0).Value
     'copie le tableau tb dans le tableau tb_base
     Range("tb_base").Cells(2).Resize(Sheets("BASE").ListObjects("tb_base").ListRows.Count, 2) = tb
   End If
  End With
 'libère la mémoire
 Erase tb: Set rcell = Nothing
 WB2.Save
 WB2.Close
End Sub
Rechercher des sujets similaires à "copier coller plage variable entre deux onglets"