Copier une plage de cellules dans un autre classeur

Bonjour à tous!

Je suis nouveau sur le forum et aussi débutant/bidouilleur en vba

J'ai toujours plus ou moins réussi à faire ce que je voulais, mais là je suis un peu bloqué sur une macro.

Je pense que j'y suis presque, mais il me manque un petit quelque chose.

J'explique la situation. J'ai 2 fichiers excel un avec (Template_work-2016-12.xlsm) et l'autre (Database_work-2016-12.xlsx) sans macro.

Template_work-2016-12.xlsm : que j'appellerai "Template"

Database_work-2016-12.xlsx : que j'appellerai "Database"

Je souhaite par l'action d'une macro envoyer une plage de cellules de l'onglet "DATA-EXPORT" du fichier "Template" vers l'onglet "DATA-IMPORT" du fichier "Database" et ce à la suite des données existantes. Le nombre de lignes des données à copier est vouée à évoluer (il peut n'y en avoir qu'une seule comme 10).

J'y suis en partie arrivé j'arrive bien à envoyer les données d'un fichier à un autre mais le soucis est que comme les données exportées sont composées de formules, une fois dans le fichier destination les valeurs ne sont plus les bonnes car ce sont les formules qui sont copiées et non pas le résultat de ces formules.

Voici le code et ci-joint les deux fichiers en question.

    Sub transfert()

    Dim Last_Row1 As Long, Last_Row2 As Long
    Dim WB1 As Workbook, WB2 As Workbook
    Dim ws1 As Worksheet, ws2 As Worksheet

    Set WB1 = ThisWorkbook
    Set ws1 = WB1.Sheets("DATA-EXPORT")
    Set WB2 = Workbooks.Open("C:\Users\Desktop\Database_work-2016-12.xlsx")
    Set ws2 = WB2.Sheets("DATA-IMPORT")

    Last_Row1 = ws1.Range("A" & RowS.Count).End(xlUp).Row
    Last_Row2 = ws2.Range("A" & RowS.Count).End(xlUp).Row + 1

    ws1.Range("A3:H" & Last_Row1).Copy ws2.Range("A" & Last_Row2)

    End Sub

Si quelqu'un à quelque chose à proposer qui fonctionne sans trop modifier le code existant ce serait super!

Merci d'avance.

Cdt

Guillermo

Bonjour,

Essaie avec :

    ws1.Range("A3:H" & Last_Row1).Copy
    ws2.Range("A" & Last_Row2).PasteSpecial Paste:=xlPasteValues

A+

Salut Guizite,

je n'ai jamais vraiment joué avec les options de copier-coller de COPY, mais, avant l'intervention d'un vrai crack, tu devrais chercher du côté de PASTE ou PASTESPECIAL xlValues.

Désolé de ne pouvoir t'aider plus!

A+

Hein, quand je parlais de crack!

Salut Frangy!

Je note le code et j'essaie moi-même!

Merci!

A+

frangy a écrit :

Bonjour,

Essaie avec :

    ws1.Range("A3:H" & Last_Row1).Copy
    ws2.Range("A" & Last_Row2).PasteSpecial Paste:=xlPasteValues

A+

Bonjour Frangy!

Je viens d'essayer ta solution, et je dis un grand merci car cela fonctionne! J'avais essayé des "paste special" mais je ne trouvais pas la bonne syntaxe!

Encore merci!

Guillermo


curulis57 a écrit :

Salut Guizite,

je n'ai jamais vraiment joué avec les options de copier-coller de COPY, mais, avant l'intervention d'un vrai crack, tu devrais chercher du côté de PASTE ou PASTESPECIAL xlValues.

Désolé de ne pouvoir t'aider plus!

A+

Hein, quand je parlais de crack!

Salut Frangy!

Je note le code et j'essaie moi-même!

Merci!

A+

Merci de ta réponse, et en effet le crack m'a bien aidé

Cdt

Guillermo

guizite a écrit :
frangy a écrit :

Bonjour,

Essaie avec :

    ws1.Range("A3:H" & Last_Row1).Copy
    ws2.Range("A" & Last_Row2).PasteSpecial Paste:=xlPasteValues

A+

Bonjour Frangy!

Je viens d'essayer ta solution, et je dis un grand merci car cela fonctionne! J'avais essayé des "paste special" mais je ne trouvais pas la bonne syntaxe!

Encore merci!

Guillermo

Re-bonjour,

J'ai répondu un peu trop rapidement, en effet cela fonctionne mais je suis confronté à un autre problème. Lorsqu'il fait le "Copy/Paste special" il copie également les cellules en apparence vide mais qui contiennent des formules, ce qui fait que la fois suivante les données ne sont pas collées juste en dessous mais plusieurs lignes en dessous. Je ne sais pas si c'est clair?

J'ai essayé un subterfuge en copiant/collant spécial dans une autre plage du fichier source et ensuite copiant/collant cette nouvelle plage dans le fichier destination mais le résultat est le même...

Merci

Cdt

Guillermo

Bonjour,

Pas sûr d'avoir bien compris

Fais un essai avec :

Last_Row1 = ws1.Columns("A:A").Find("*", , xlValues, , , xlPrevious).Row

A+

frangy a écrit :

Bonjour,

Pas sûr d'avoir bien compris

Fais un essai avec :

Last_Row1 = ws1.Columns("A:A").Find("*", , xlValues, , , xlPrevious).Row

A+

Merci de ta réponse, j'ai trouvé une solution (ci-après) mais je vais quand même creuser ce que tu me dis pour comprendre

En fait je n'utilise plus le "copy/paste", j'ai rajouté une variable et fait une boucle qui s'arrête quand une certaine cellule est vide.

    Dim i As Long

    For i = 3 To 13

    If Cells(i, 1) <> "" Then
    Last_Row2 = ws2.Range("A" & RowS.Count).End(xlUp).Row + 1
    ws2.RowS(Last_Row2).Value = ws1.RowS(i).Value
    i = i + 1
    End If

    Next

Encore merci.

BàV

Guillermo

Rechercher des sujets similaires à "copier plage classeur"