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