Copier une plage de cellules dans un autre classeur

Y compris Power BI, Power Query et toute autre question en lien avec Excel
g
guizite
Nouveau venu
Nouveau venu
Messages : 4
Inscrit le : 10 décembre 2016
Version d'Excel : 2007

Message par guizite » 11 décembre 2016, 17:02

Template_work-2016-12.xlsm
Fichier source "Template"
(18.34 Kio) Téléchargé 24 fois
Database_work-2016-12.xlsx
Fichier destination "Database"
(13.77 Kio) Téléchargé 31 fois
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
f
frangy
Passionné d'Excel
Passionné d'Excel
Messages : 4'342
Inscrit le : 19 novembre 2012
Version d'Excel : 2007 FR

Message par frangy » 11 décembre 2016, 18:41

Bonjour,

Essaie avec :
    ws1.Range("A3:H" & Last_Row1).Copy
    ws2.Range("A" & Last_Row2).PasteSpecial Paste:=xlPasteValues
A+
Avatar du membre
curulis57
Membre impliqué
Membre impliqué
Messages : 2'826
Appréciations reçues : 90
Inscrit le : 4 janvier 2016
Version d'Excel : 2013 FR

Message par curulis57 » 11 décembre 2016, 18:45

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+
g
guizite
Nouveau venu
Nouveau venu
Messages : 4
Inscrit le : 10 décembre 2016
Version d'Excel : 2007

Message par guizite » 11 décembre 2016, 19:41

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
g
guizite
Nouveau venu
Nouveau venu
Messages : 4
Inscrit le : 10 décembre 2016
Version d'Excel : 2007

Message par guizite » 12 décembre 2016, 09:30

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
f
frangy
Passionné d'Excel
Passionné d'Excel
Messages : 4'342
Inscrit le : 19 novembre 2012
Version d'Excel : 2007 FR

Message par frangy » 12 décembre 2016, 10:22

Bonjour,

Pas sûr d'avoir bien compris :scritch:

Fais un essai avec :
Last_Row1 = ws1.Columns("A:A").Find("*", , xlValues, , , xlPrevious).Row
A+
g
guizite
Nouveau venu
Nouveau venu
Messages : 4
Inscrit le : 10 décembre 2016
Version d'Excel : 2007

Message par guizite » 12 décembre 2016, 19:12

frangy a écrit :Bonjour,

Pas sûr d'avoir bien compris :scritch:

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
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message