[Résolu] Copier/Coller dans un autre fichier (Before Save)

Int0x

XLDnaute Occasionnel
Bonjour le forum,

Je me permets de vous exposer mon problème (que je ne comprends vraiment pas).

Edit: en écrivant ce message, j'ai eu une idée que je viens de tester. Ne pas mettre ce code en "passif" (lors de la sauvegarde du fichier), mais en action sur un bouton (déplacé le code dans un module). Et là, le code fonctionne parfaitement ! Nouvelle question: comment rendre ce code "passif" (transparent pour l'utilisateur) ? Ce code n'aime pas le Before Save ?


J'ai un fichier A avec 4 onglets.
Lors de l'ouverture de ce fichier (A), un autre Fichier (B) s'ouvre, copie le contenu du seul onglet dispo, rebascule sur le fichier A et colle le contenu dans l'onglet 2. Le fichier (B) se ferme.

Toute cette opération fonctionne parfaitement et est transparente pour l'utilisateur.
Ci-desous le code, qui est très certainement optimisable, mais qui fonctionne.

Private Sub Workbook_Open()
Application.ScreenUpdating = False
Application.DisplayAlerts = True

Dim v_FichierBdD As String, v_FichierProd As String, v_BdD As String
v_FichierBdD = Sheets("Résultats").Range("H48").Value
v_FichierProd = ActiveWorkbook.Name

Workbooks.Open Filename:=v_FichierBdD
v_BdD = ActiveWorkbook.Name

Workbooks(v_BdD).Activate
Cells.Select
Selection.Copy
Workbooks(v_FichierProd).Activate
Sheets("BdD").Select
Cells.Select
ActiveSheet.Paste
Range("A1").Select
Workbooks(v_BdD).Activate
Application.CutCopyMode = False
ActiveWindow.Close
Workbooks(v_FichierProd).Activate
Sheets("Résultats").Select

MsgBox "Onglet BdD correctement mis à jour !"

Application.DisplayAlerts = False
Application.ScreenUpdating = True
End Sub

Je voudrais maintenant faire l'opération inverse : à chaque fois qu'on sauvegarde, toutes les informations de l'onglet 2 du Fichier A aillent se coller dans le Fichier B. C'est sensiblement la même opération, dans le sens inverse. Malheureusement, Excel refuse de faire le "coller" (tout se déroule parfaitement bien, sauf qu'il ne colle pas).

Ci-dessous le code, qui ne fait pas le coller:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Application.ScreenUpdating = False
Application.DisplayAlerts = True

Dim v_FichierBdD As String, v_FichierProd As String, v_BdD As String
v_FichierBdD = Sheets("Résultats").Range("H48").Value
v_FichierProd = ActiveWorkbook.Name

Workbooks.Open Filename:=v_FichierBdD
v_BdD = ActiveWorkbook.Name

Workbooks(v_FichierProd).Activate
Sheets("BdD").Select
Cells.Select
Selection.Copy

Workbooks(v_BdD).Activate
Cells.Select
ActiveSheet.Paste '(opération non réalisée !)
Range("A1").Select
ActiveWorkbook.Save
ActiveWorkbook.Close

Workbooks(v_FichierProd).Activate
Application.CutCopyMode = False
Sheets("Résultats").Select

Application.DisplayAlerts = False
Application.ScreenUpdating = True
End Sub

Je ne parviens pas à mettre le doigt sur ce qui cloche. Un oeil neuf du forum saurait-il me dire d'où provient l'erreur ? (j'insiste sur le fait que mon code n'est pas nécessairement optimisé et qu'il y'a sûrement bien mieux à faire)

Par avance merci pour vos remarques / critiques / solutions,
Int0x
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Copier/Coller dans un autre fichier (Before Save)

Bonjour.

On peut vraiment se demander ce que vous attendiez pour optimiser alors :
VB:
Private Sub Workbook_Open()
Application.ScreenUpdating = False
Application.DisplayAlerts = True
Workbooks.Open Filename:=Me.Worksheets("Résultats").[H48].Value
ActiveSheet.Cells.Copy Destination:=Me.Worksheets("BdD").[A1]
ActiveWorkbook.Close
Application.DisplayAlerts = False
Application.ScreenUpdating = True
MsgBox "Onglet BdD correctement mis à jour !"
End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Application.ScreenUpdating = False
Application.DisplayAlerts = True
Workbooks.Open Filename:=Me.Worksheets("Résultats").[H48].Value
Me.Worksheets("BdD").Cells.Copy Destination:=ActiveSheet.[A1]
ActiveWorkbook.Close
Application.DisplayAlerts = False
Application.ScreenUpdating = True
End  Sub
Préviendrait, contrairement à votre code les effets d'une Workbook_Activate de l'autre classeur qui viderai le presse papier, puisque le Copy est effectué juste après son ouverture.
 

Int0x

XLDnaute Occasionnel
Re : Copier/Coller dans un autre fichier (Before Save)

Merci Dranreb.
Je n'ai malheureusement pas votre niveau pour parvenir à optimiser mon code, d'où ma précision (ce qui ne m'évite finalement pas la réponse un peu sèche).

Merci pour votre retour, qui me sera fort utile.
Int0x
 

Int0x

XLDnaute Occasionnel
Re : Copier/Coller dans un autre fichier (Before Save)

Je me permets d'up mon sujet, puisque le code proposé par Dranreb ne fonctionne pas correctement.

Code 1
Action souhaitée: à l'ouverture du fichier A, un fichier B s'ouvre, copie les valeurs depuis le seul et unique onglet, colle dans l'onglet "BdD" du fichier A.
Résultat de la macro: à l'ouverture du fichier, c'est l'onglet "Résultats" du fichier A qui est copié sur l'onglet "BdD" du même fichier.

Code 2
Action souhaitée: à chaque enregistrement du fichier A, le contenu de l'onglet "BdD" est copié dans un fichier B
Résultat de la macro: à l'enregistrement, le contenu de l'onglet "BdD" du fichier A est copié dans l'onglet "Résultats" du même fichier.

Il y'a donc un problème "d'adressage", les copier-coller ne se faisant que sur le même fichier.

Par avance merci pour vos retours,
Int0x
 

Dranreb

XLDnaute Barbatruc
Re : Copier/Coller dans un autre fichier (Before Save)

Bonjour.
Vérifiez si la cellule H48 de votre feuille Résultat ne contiendrait pas le nom du classeur A lui même au lieu de contenir celui du B.
Par ailleurs est-ce normale que cette feuille Résultat soit la feuille active et donc celle à copier ? Est-ce que l'autre classeur n'aurait pas le même dispositif ?
 
Dernière édition:

Int0x

XLDnaute Occasionnel
Re : Copier/Coller dans un autre fichier (Before Save)

Merci pour votre retour Dranreb.

Le fichier en H48 fait bien référence au fichier B.
Le fichier A est composé de 4 onglets, dont l'onglet Résultats (aucune idée de quel onglet sera actif à l'ouverture, en fonction de l'utilisateur qui a sauvegardé).
Le fichier B est composé d'un seul onglet.

Merci,
Int0x
 

Dranreb

XLDnaute Barbatruc
Re : Copier/Coller dans un autre fichier (Before Save)

Le fichier en H48 fait bien référence au fichier B.
Je ne vous crois purement et simplement pas. Ce serait alors rigoureusement impossible que la Workbook_Open copie la feuille Résultat de son classeur A.
À moins que le classeur B soit déjà ouvert et que vous répondiez "Non" à une question demandant à le réouvrir ! Dans ce cas évidemment au lieu d'avoir la feuille du B active, et donc à copier, on en demeure à celle du A, qui peut éventuellement être sa feuille Résultat…
Il faudrait peut être prévoir une tentative d'activation du classeur B avant d'essayer de l'ouvrir. Mais la question qui se pose alors c'est: Y a t-il lieu dans ce cas de le fermer après avoir copié sa feuille, ou faut-il au contraire laisser la situation dans le même état qu'on l'a trouvé en entrant ?
Cette fameuse H48 contient-elle un chemin ou juste le nom du ficher ? Dans ce dernier cas les deux fichiers sont-ils dans le même dossier ? Bien des questions auraient eues leur réponses sur vos classeurs joints…
 
Dernière édition:

Int0x

XLDnaute Occasionnel
Re : Copier/Coller dans un autre fichier (Before Save)

Dranreb, je te suis vraiment reconnaissant de te pencher sur mon cas et de m'aider.

Cependant, en aucun cas tes capacités de codage supérieures aux miennes ne te donnent le droit d'être aussi hautain / méprisant / agressif. Sur tes 2 post, j'ai juste à chaque fois l'impression que tu cherches à me faire passer pour un gros neuneu. Est-ce que je t'ai été désagréable (par le passé) ou tu es juste aigri de base ?

Pour en revenir au problème, effectivement, ça aurait pu être une erreur de ma part avec un mauvais chemin en H48. Il n'en est rien, et que tu me crois ou non, le résultat est celui décrit plus haut (j'ai d'ailleurs dû refaire l'onglet "Résultats" car "BdD" s'était collé dedans).

Pour répondre à tes questions, si agréablement formulées :

- le classeur B n'est pas ouvert en même temps (et je ne réponds à rien du tout)
- Pour le workbook_open : le classeur B doit s'ouvrir, copier les données de son onglet et aller les coller dans le classeur A. Le classeur B se referme ensuite (aucune modification apportée)
- Pour le before_save: le contenu de l'onglet "BdD" du classeur A doit aller se coller dans le classeur B (qui se ferme en enregistrant)
- En H48, il s'agit du chemin entier du classeur B (\\serveur\répertoire\). De plus, ils sont actuellement dans le même dossier.

Le fichier actuel étant sensible, j'essayerai de faire une version allégée au plus vite afin de pouvoir joindre des fichiers (ça te détendra peut-être).

Bien cordialement,
Int0x
 

Dranreb

XLDnaute Barbatruc
Re : Copier/Coller dans un autre fichier (Before Save)

C'est clair. On perd toujours un temps fou à se comprendre dans les discussions ou aucun classeur n'est joint.
On peu imaginer des tas de choses qui ne peuvent pas se deviner, comme par exemple que la feuille unique du classeur B soit masquée de sorte qu'elle ne peut pas être active. Dans les cas de figure courant le code que je vous ai fourni devrait marcher comme vous le souhaitez, je ne vois pas d'erreur. Déroulez le en pas à pas, peut être, mettez des espions avant chaque exécution pour vérifier quel est le classeur actif et la feuille active.
 

Int0x

XLDnaute Occasionnel
Re : Copier/Coller dans un autre fichier (Before Save)

Bonjour le forum,

Avec beaucoup de retard (agenda un peu chargé), je me permets d'ajouter le fichier exemple.

Fichier A = Fichier joint
Fichier B = un fichier avec un seul onglet, absolument identique à l'onglet BDD du fichier A

Je rappelle l'objectif :
- avoir l'adresse du fichier B en H48 de l'onglet Résultats du fichier A
- quand j'ouvre le fichier A, ça va me copier l'intégralité du contenu de l'onglet du fichier B sur l'onglet BDD du fichier A
- quand je ferme le fichier B, ca fait le chemin inverse (onglet BDD fichier A vers Fichier B)

Par avance merci pour vos éclaircissements,
Int0x
 

Pièces jointes

  • Exemple.xls
    624 KB · Affichages: 59
  • Exemple.xls
    624 KB · Affichages: 61
  • Exemple.xls
    624 KB · Affichages: 63

Dranreb

XLDnaute Barbatruc
Re : Copier/Coller dans un autre fichier (Before Save)

Bonjour.

Essayez comme ça :
VB:
Private Sub Workbook_Open()
Dim ChNomF As String, ClsSrc As Workbook
ChNomF = Feuil4.[H48].Value
If ChNomF = "" Then
   Feuil4.Activate: Feuil4.[H48].Select
   MsgBox "Chemin et nom de fichier non précisé.", _
      vbCritical, "Ouverture fichier": Exit Sub: End If
On Error Resume Next
Application.EnableEvents = False ' Au cas où ce classeur serait équipé du même dispositif…
Set ClsSrc = Workbooks.Open(Filename:=ChNomF)
Application.EnableEvents = True
If Err Then MsgBox "Problème à l'ouverture de :" & vbLf & ChNomF _
   & vbLf & Err.Description, vbCritical, "Ouverture fichier": Exit Sub
On Error GoTo 0
ClsSrc.Worksheets(1).Cells.Copy Destination:=Feuil8.[A1]
ClsSrc.Close
MsgBox "Onglet BdD correctement mis à jour !", vbInformation, "Ouverture fichier"
End Sub
Faite pareil pour la Workbook_BeforeSave en mettant :
VB:
Feuil8.Cells.Copy Destination:=ClsSrc.Worksheets(1).[A1]
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
311 724
Messages
2 081 936
Membres
101 844
dernier inscrit
pktla