Copier cellules d'une feuille à une autre

Hello,

Je galère un peu sur un simple copier/coller du worksheet "DataBase" au worksheet "Combined Table", mais comme je débute en vba.... pas facile de comprendre ce qui ne va pas.

Message d'erreur : "Application-defined or object-defined error" au niveau de la ligne Set target.

Sub Data_Copy()

    Dim first_blank_row, last_row_to_copy As Integer
    Dim copy_Data As Range
    Dim target As Range

    first_blank_row = Worksheets("Combined Table").Range("A" & Rows.Count).End(xlUp).Offset(1).Row
    last_row_to_copy = Worksheets("DataBase").Range("A" & Rows.Count).End(xlUp).Row

    'MsgBox ("first_blank_row : " & first_blank_row & Chr$(10) & "last_row_to_copy : " & last_row_to_copy)

    Set copy_Data = Worksheets("DataBase").Range(Cells(first_blank_row, "A"), Cells(last_row_to_copy, "AP"))
    Set target = Worksheets("Combined Table").Range(Cells(first_blank_row, "A"), Cells(last_row_to_copy, "AP"))

    copy_Date.Copy Destination:=target

End Sub

Merci bien d'avance.

Bonjour,

C'est un bon début, mais tu as 2 sources d'erreurs à mon avis. La première est que tu utilises un numéro de ligne définit sur une autre feuille pour dimensionner tes plages.

  • -> first_blank_row est définit à partir de la feuille "Combined Table", mais tu l'utilises comme la 1ère ligne de ta plage "copy_Data" appartenant à la feuille "Database". Vice-versa avec "last_row_to_copy".
  • -> Tu as bien définit la Feuille à laquelle fait référence chacun des tes objets "Range", mais il faut également le faire pour les objets "Cells".
Tu peux dans ce cas utiliser une instruction du type :
With Worksheets("DataBase")
    Set copy_Data = .Range(.Cells(first_blank_row, "A"), .Cells(last_row_to_copy, "AP"))
End With

Merci pour la réponse.

À partir du moment où "first_blank_row" et "last_row_to_copy" sont justes 2 nombres, je ne peux plus les utiliser pour définir une adresse de cellule quelle que soit la feuille ?

Aussi, si je comprends bien, quand j'écris :

Worksheets("DataBase").Range(Cells(first_blank_row, "A"), Cells(last_row_to_copy, "AP"))

.Range est défini sur la Feuille "DataBase" mais les cellules de ce même Range ne savent plus à quoi faire référence ?

Merci pour la réponse.

À partir du moment où "first_blank_row" et "last_row_to_copy" sont justes 2 nombres, je ne peux plus les utiliser pour définir une adresse de cellule quelle que soit la feuille ?

Aussi, si je comprends bien, quand j'écris :

Worksheets("DataBase").Range(Cells(first_blank_row, "A"), Cells(last_row_to_copy, "AP"))

.Range est défini sur la Feuille "DataBase" mais les cellules de ce même Range ne savent plus à quoi faire référence ?

Pour ta première question, oui tu peux, mais je ne vois pas bien l'intérêt (je ne sais pas non plus ce qu'il y a dans ton fichier ni ce que tu cherches à faire). Aussi, pense à mettre le n° de ligne le plus faible en 1er, le plus élevé en 2nd dans ton "Range".

Pour ta seconde question, oui ça arrive, le plus prudent en VBA pour éviter les erreurs et de définir la feuille (voir le fichier) relatif à chaque objet.

Ok je comprends et prends note merci.

Cependant, je pense qu'avec l'exemple suivant, tu pourras m'éclairer sur les propriétés de Worksheet car un truc m'échappe vraiment dans cette affaire

Sub Combined_data()

    Dim search_data As Range
    Dim search_data_cell As Range
    Dim processed_data As Range

    Set search_data = Worksheets("Combined Table").Range("C4", Range("C4").End(xlDown))

    For Each search_data_cell In search_data

        If IsEmpty(search_data_cell) Then
            Exit For
        End If

        Set processed_data = search_data_cell.Offset(0, 40)
        processed_data = Application.VLookup(search_data_cell.Value, Worksheets("Reference").Range("B5:E127"), 2, False)

        If IsError(processed_data) Then
            processed_data = "Other"
        End If

    Next

End Sub

Le code fonctionne très bien mais uniquement lorsque je suis sur la Feuille "Combined Table".

Moi je souhaite être sur une autre feuille mais que la macro tourne quand même. Or si je ne suis pas sur la feuille "Combined Table" pour éxecuter la macro, encore le même message d'erreur: "Application-defined or object-defined error" pour la ligne suivante :

Set search_data = Worksheets("Combined Table").Range("C4", Range("C4").End(xlDown))

Qu'est-ce que j'ai pas pigé en fait ?

Je rajoute que dans le premier code à la base du topic, le copier/coller fonctionne quelle que soit la feuille sur laquelle je me trouve. Qu'est-ce qui est différent avec ce 2ème code ?

Par défaut, un objet comme Range fait référence à la feuille active. C'est pour ça qu'il faut préciser à chaque fois la feuille de travail, ou, comme le fait l'enregistreur de macro, activer au préalable la feuille que tu vas utiliser.

Mais les instructions Activate ou Select sont peu utiles (à la différence d'un utilisateur, pas besoin pour VBA de se trouver sur la feuille en question ou de sélectionner la cellule à travailler) et ralentissent l’exécution du code.

D'accord je vois.

Cependant, quand j'écris cela :

Set search_data = Worksheets("Combined Table").Range("C4", Range("C4").End(xlDown))

J'ai donc bien précisé que ce Range "search_data" est celui de la Feuille "Combined Table", non ? Alors pourquoi cela ne fonctionne pas si je ne suis pas sur la Feuille ?

D'accord je vois.

Cependant, quand j'écris cela :

Set search_data = Worksheets("Combined Table").Range("C4", Range("C4").End(xlDown))

J'ai donc bien précisé que ce Range "search_data" est celui de la Feuille "Combined Table", non ? Alors pourquoi cela ne fonctionne pas si je ne suis pas sur la Feuille ?

Tu as un 2ème Range dans cette ligne...

La vache !!!!

Ok, écrire ".Range" au lieu de "Range" (rajouter le point) permet de lier l'objet à ce qui précède c'est cela (ici le Worksheets("Combined Table")) ?

".Range" seulement dans une instruction "With Sheets("TaFeuille")", sinon il faut tout réécrire à chaque objet.

Ok merci beaucoup !!!

Mais de rien ! Courage !

Rechercher des sujets similaires à "copier feuille"