Copier / Coller une ligne entre deux fichiers depuis un 3ème fichier

Bonjour à tous,

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 Sub

Tout 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 Sub

A+

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 Sub

Penser à 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 Sub

Mais 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.

Rechercher des sujets similaires à "copier coller ligne entre deux fichiers 3eme fichier"