Copier / Coller une ligne entre deux fichiers depuis un 3ème fichier
J'ai actuellement un fichier vierge qui me permet d'exécuter une macro sur un fichier que j'ouvre depuis un logiciel (et dont ce fichier n'est pas sauvegardé vu qu'il est généré à la volée par le logiciel). Cette macro met en page les données du fichier généré puis dans cette macro, je souhaite copier la ligne 65 entière pour enfin la coller dans un autre fichier.
Le problème, je n'arrive pas à copier / coller la ligne entre deux fichiers... Les données sont bien copiées, mais cela pose problème lors du collage dans le 3ème fichier test.xlsx.
Si par contre je ne copie que 5 cellules au maximum, cela fonctionne... Au delas, j'ai un message d'erreur indiquant "Erreur d'exécution 1004, Excel ne peut pas coller les données".
J'ai tenté plusieurs rédaction du code suivant ce que j'ai pu trouver sur le net mais rien à faire, je n'y arrive pas.
Je travaille donc sur 3 fichiers :
Un fichier sans extension car non sauvegardé qui s'appelle "Classeur1". Ce fichier s'ouvre dans une nouvelle instance Excel
Un fichier sauvegardé appelé test.xlsx où sont stockés ligne par ligne les données de la ligne 65 de "Classeur1" du dessus
Un fichier sauvegardé appelé : StartMacro.xlsx où la macro est enregistrée et que je lance depuis ce fichier pour mettre les données qui m'intéresse en forme ligne 65 du fichier "Classeur1" puis ensuite les coller dans test.xlsm.
J'ai donc besoin que le script cherche la dernière ligne vide du fichier test.xlsx pour la coller dessus.
En gros le process :
Le fichier Classeur1 se génère et s'ouvre, ma macro sur StartMacro s'exécute automatiquement et réalise le formatage des données sur la ligne 65, puis ouvre le fichier test.xlsx pour coller la ligne 65 sur la dernière ligne vide du fichier, puis sauvegarde et ferme test.xlsx, puis ferme Classeur1 et ainsi de suite à chaque ouverture d'un nouveau Classeur1.....
Pour information, si j'exécute la macro sur le fichier Classeur1, sans passer par le fichier StartMacro, cela fonctionne bien. Cependant, ce n'est pas la solution recherchée car le fichier Classeur1 est un fichier généré à la volée.
Voici la macro que j'exécute dans le fichier "StartMacro.xlsm", dans un Module appelé Module 1:
VB:
Sub Recup()
With GetObject("Classeur1").Sheets(1)
.UsedRange.Replace What:="lundi ", Replacement:=""
.UsedRange.Replace What:="mardi ", Replacement:=""
-------- Pour éviter de surcharger, je supprime le reste de la macro qui permet de mettre les données en forme car cela fonctionne ---------
.Range("A65:CW65").Select
.Range("A65:CW65").Copy
End With
Workbooks.Open Filename:="C:\d\test.xlsx"
Workbooks("test.xlsx").Worksheets("Test").Activate
Range("a65536").End(xlUp)(2).Select
ActiveCell.PasteSpecial Paste:=xlPasteValues
End SubTout s'exécute jusqu'à le PasteSpecial où j'ai le message d'erreur ci-dessus.
Sur le fichier test.xlsx qui s'ouvre bien, il vient bien chercher la dernière ligne vide. Donc le problème se situe réellement au niveau du coller et qui plus est, est seulement quand je sélectionne plus de 5 cellules à coller.... Sachant que j'ai besoin de coller toute la ligne ou tout du moins, au moins de A65 à CW65.
Information peut-être importante, j'ai bien dans le presse papier l'intégralité de la ligne 65 de copiée. Et je peux par contre la coller manuellement dans le fichier test.xlsx MAIS si je veux coller la ligne avec CTRL+V j'ai aussi un message d'erreur "Excel ne peut pas coller les données".
Par contre, un clique droit puis "Coller" cela fonctionne parfaitement.
Je vous remercie par avance pour votre aide.
Bonjour xorf76
Pour moi, mieux vaut déclarer des variables objet et travailler avec
De plus les "Select" son totalement inutiles et chronophages
Sub Recup()
Dim Wbk As Workbook, Sht As Worksheet
Dim dLig As Long
With GetObject("Classeur1").Sheets(1)
.UsedRange.Replace What:="lundi ", Replacement:=""
.UsedRange.Replace What:="mardi ", Replacement:=""
'-------- Pour éviter de surcharger, je supprime le reste de la macro qui permet de mettre les données en forme car cela fonctionne ---------
.Range("A65:CW65").Copy
End With
Set Wbk = Workbooks.Open(Filename:="C:\d\test.xlsx")
Set Sht = Wbk.Worksheets("Test")
dLig = Sht.Range("A" & Rows.count).End(xlUp).Offset(2, 0).Row
Sht.Range("A" & dLig).PasteSpecial Paste:=xlPasteValues
End SubA+
Bonjour,
Merci pour ce retour.
Effectivement le code semble nettement plus agréable merci !
Par contre, cela ne règle pas le problème. Niveau débogage, j'ai toujours le message d'erreur 1004 La méthode PasteSpecial de la classe Range a échoué. En jaune est sélectionné "Sht.Range("A" & dLig).PasteSpecial Paste:=xlPasteValues"
Dans le fichier test.xlsx il ne sélectionne plus la dernière ligne vide mais la 2ème ligne vide (petit détail).
Par contre, aucun collage. Si je fais CTRL +V il me dit "Microsoft Excel ne peut pas coller les données".
Mais dans le presse-papiers j'ai bien la ligné copié (donc la fonction Copy fonctionne). Si je fais clique droit et Collage cela fonctionne. Si je clique aussi simplement dans le presse-papier à gauche, cela fonctionne aussi...
Enfin, si je colle la macro dans le fichier "Classeur1" directement et que j'exécute, cela fonctionne parfaitement et cela copy bien les données de Classeur1 et les colle dans test.xlsx (mais cette solution n'est pas envisageable pour automatiser).
Si néanmoins j'exécute la macro depuis test.xlsx dans un Module, j'ai exactement le même problème avec le message d'erreur lors du collage.
Je pense qu'il y a un soucis au niveau du fait que Classeur1 n'est pas enregistré et/ou ne s'exécute pas dans la même instance.
Car si j'enregistre Classeur1 sur le PC et que je modifie le script pour remplacer"With GetObject("Classeur1" PAR "With GetObject("C:\Users\Users\Desktop\Classeur1.xlsx").Sheets(1)", la fonction copy/past fonctionne parfaitement aussi bien lancé du 3ème fichier ou de test.xlsx.
Mais pareil, le but recherché est d'automatiser à l'ouverture de Classeur1 la macro sur test.xlsx puis le fermer...
Merci de votre aide
Re,
Désolé, je n'avais pas testé, mais voici un code qui fonctionne chez moi à voir
Sub Recup()
Dim ShtS As Worksheet
Dim Wbk As Workbook, Sht As Worksheet
Dim dLig As Long
'
Set ShtS = Workbooks("Classeur1").Sheets(1)
ShtS.UsedRange.Replace What:="lundi ", Replacement:=""
ShtS.UsedRange.Replace What:="mardi ", Replacement:=""
'-------- Pour éviter de surcharger, je supprime le reste de la macro qui permet de mettre les données en forme car cela fonctionne ---------
'
Set Wbk = Workbooks.Open(Filename:="C:\d\test.xlsx")
Set Sht = Wbk.Worksheets("Test")
dLig = Sht.Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Row
Sht.Range("A" & dLig & ":CW" & dLig).Value = ShtS.Range("A65:CW65").Value
End SubPenser à libérer les variables objet par Set MonObjet = Nothing
A+
Re
Merci pour cette nouvelle aide.
Alors cela n'a rien changé au niveau de l'erreur. J'ai tenté autre chose : désinstaller complètement Office 2021 avec suppression des paramètres et réinstallation : même problème.
J'ai désinstallé avec un downgrade vers Office 2019 et maintenant cela fonctionne sans rien toucher.
Par contre, merci pour cette amélioration du code et je vais me lancer dans l'amélioration en reprenant ta base.
J'espérais qu'avec Office 2019 la détection de l'ouverture d'Excel dans une nouvelle instance serait aussi fonctionnelle avec
Private Sub App_WorkbookOpen(ByVal wB As Workbook)
If ActiveWorkbook.Name = "Classeur1" Then
Call Macro
End If
End SubMais cela ne change rien.... L'ouverture n'est pas détecté et donc la macro ne se lance pas automatiquement.
Je me contenterai de trouver une solution qui exécutera la macro toutes les X secondes au lieu de la détection d'ouverture du tableau Excel, au moins, cela devrait fonctionner j'espère.
Merci encore.