Copie à la suite
bonjour,
Je fais appel a vous car j'essaie de créer une amcro qui copie des données d'un fichier excel à un autre.
Jusque là, ok,
Cependant je rencontre 2 problèmes, malgrès ma macro, ma ligne source ne se colle pas à la première ligne vide du fichier qui reçoit la ligne.
2eme points : mon classeur receveur (classeur2) s'ouvre en lecture seule, et donc il m'est impossible de le fermer et de le sauvegarder par macro....
voici mon code :
Sub commandClick_1()
Application.DisplayAlerts = False 'desactive les message d'alerte
Application.ScreenUpdating = False ' desactive l'affichage des manip a l'ecran
Dim classeurSource As Workbook, classeurDestination As Workbook 'définition des variables
'ouvrir le classeur source (en lecture seule)
Set classeurSource = ThisWorkbook
'définir le classeur destination
Set classeurDestination = Application.Workbooks.Open("N:\essais macro\Classeur2.xlsm", , True)
'copier les données de la "Feuil1" du classeur source vers la "Feuil1" du classeur destination
classeurSource.Sheets("Feuil1").Range("A1:AJ1").Copy classeurDestination.Sheets("Feuil1").Cells.Range("A65535").End(xlUp)
'fermer le classeur source
Dim nom As String
nom = Range("E1") & "_" & ActiveWorkbook.Name
'changer le chemin du repertoire d'enregistrement en remplaçant ActiveWorkbook.Path par le chemin souhaité
ActiveWorkbook.SaveCopyAs ActiveWorkbook.Path & "\" & nom
rep = MsgBox("Votre base de données est sauvegardée sous le nom : " & nom, vbYes + vbInformation, "Copie sauvegarde classeur")
End SubMerci par avance pour voter aide
Bonjour,
C'est toi qui l'a écrit ainsi dans ton code !
Tu ouvres ton classeur en lecture seule (supprime donc tous les arguments après le nom du fichier !)
Tu définis le collage sur la dernière ligne occupée (.Offset(1) pour aller à ligne suivante !)
Maaaaa !!
ça marche du feu de Dieu !!
J'abuse si je te demande une ligne pour enregistrer les modifications du classeur destination et le fermer dans la foulée ?
J'ai essayé avec saveAs, saVe, etc... rien n'y fait !
En tout cas merci encore !
Bonjour,
Il y avait quelques autres anomalies (restes d'éléments antérieurs probablement...)
Sub commandClick_1()
Dim wbD As Workbook, nom As String
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Set classeurDestination = Workbooks.Open("N:\essais macro\Classeur2.xlsm")
With wbD.Worksheets("Feuil1")
ThisWorkbook.Worksheets("Feuil1").Range("A1:AJ1").Copy .Range("A65535").End(xlUp)(2)
nom = .Range("E1") & "_" & wbD.Name
End With
wbD.SaveCopyAs wbD.Path & "\" & nom
MsgBox "Votre base de données est sauvegardée sous le nom : " & nom, vbInformation, _
"Copie sauvegarde classeur"
wbD.Close True
End SubLa dernière ligne ferme le classeur en l'enregistrant.
Cordialement.
Merci beaucoup pour ce retour
J'ai essayé de comprendre mes erreurs par rapport aux modifications que tu as apporté, je ne comprend pas le (2) après le :
" End(xlUp )"
Je suis vraiment novice ( et c'est peu de le dire), mais du coup j''aimerai comprendre, histoire qu'à la prochaine je sache me débrouiller
en tout cas ça marche niquel !
Encore Merci !
Bonjour,
C'est la même chose que .Offset(1).
End(xlUp) renvoie la dernière cellule occupée. La cellule renvoyée est .Cells(1) ou (1) par définition, ou (A1 selon le type d'écriture).
En mettant (2) [ou .Cells(2)] tu renvoies la cellule de la ligne suivante.
De même quand tu mets .Offset(1).
Et tu aurais le même résultat en ajoutant .Range("A2").
Petit test :
Sub test()
MsgBox ActiveSheet.Range("C5").Cells(-3, -1).Address
End SubLa réponse qui sera renvoyée est : $A$1...
Cordialement.