Appel de fonction dans Workbook_BeforeClose
Bonjour à tous, désolé d'avance si je ne peux partager tout le code du classeur, car très long.
Je cherche donc sans succès, à partir du module Workbook_BeforeClose d'un classeur A, d'ouvrir un classeur B pour y faire une modification (modification de la valeur d'une cellule) avant la fermetture du classeur A.
Cette modification consiste à garder une trace de la fermetture du classeur A dans un classeur externe.
Voici le code :
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Call EtatOuvertureWbDevisMod.SaveWbDevisFerme 'sauvegarde fermetture du fichier
End SubSub SaveWbDevisFerme()
Dim tempWb As Workbook
Dim wbName As String
Application.ScreenUpdating = False
wbName = Dir(tempPath) 'extrait seulement le nom du fichier (sans le chemin)
On Error Resume Next
Set tempWb = Workbooks(wbName) 'cherche dans les fichiers déjà ouverts
On Error GoTo 0
If tempWb Is Nothing Then
'pas déjà ouvert ? on ouvre
Set tempWb = Workbooks.Open(Filename:=tempPath, ReadOnly:=False)
End If
If tempWb Is Nothing Then
MsgBox "Impossible d'accéder au fichier : " & tempPath
Exit Sub
End If
' Utilisation normale
tempWb.Worksheets("Config").Range("E2").Value = 0
tempWb.Close SaveChanges:=True
Application.ScreenUpdating = True
End SubLe code marche très mal, une fois sur 2, et bloque au niveau de tempWb.Worksheets("Config").Range("E2").Value = 0de la fonctionSaveWbDevisFerme() : -> erreur 800401A8.
D'après mes recherches, cela viendrait du fait que quandWorkbook_BeforeClose() de la feuille A est lancé, cela bloque l'execution de certain module interne (librairies COM des add-ins ou des connections DDE/COM peuvent être partiellement désactivées ??) qui font donc echouer l'execution du code tempWb.Worksheets("Config").Range("E2").Value = 0
Existe t'il une solution pour contourner ce problème ?
Merci d'avance
Bonsoir,
C'est toujours le souci de savoir ce qu'excel voit lorsque l'on exécute des codes
Ce n'est peut-être pas la solution mais testez un peu le code comme ceci :
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Cancel = True
Call EtatOuvertureWbDevisMod.SaveWbDevisFerme 'sauvegarde fermeture du fichier
Cancel = False
End SubCrdlt
Edit : pensez à cloturer vos fils une fois terminé. Il y a celui ci qui reste ouvert et en attente de votre retour --> https://forum.excel-pratique.com/excel/erreur-1004-insertion-ligne-197803
Bonsoir Dan. Désolé pour le post ouvert non clotûrer (j'avais fini par abandonner).
Autrement, avec ton bout de code, j'obtiens la msgbox d'erreur MsgBox "Impossible d'accéder au fichier : " & tempPath
Mais etrangement, la ligne de code qui suit marche bien tempWb.Worksheets("Config").Range("E2").Value = 0
Je n'ai plus d'erreur d'execution 800401A8 et je vois bien dans le fichier B que l'enregistrement a bien été effectué
Je vais attendre d'utiliser quelques jours le fichier pour savoir si le résultat sera stable.
Merci beaucoup !
Bonjour,
A mon avis vous avez le message d'erreur car il faut laisser à Excel un peu de temps pour ouvrir le classeur en question. Peut-être que la petite modification suivante suffira (sinon il faudra mettre un temps d'attente) :
If tempWb Is Nothing Then
'pas déjà ouvert ? on ouvre
Set tempWb = Workbooks.Open(Filename:=tempPath, ReadOnly:=False)
' laisser au classeur le temps de s'ouvrir
DoEvents
' sinon, décommenter la ligne suivante pour attendre 2 secondes
' Application.Wait Now + TimeValue("00:00:02")
End IfBonjour,
Autrement, avec ton bout de code, j'obtiens la msgbox d'erreur MsgBox "Impossible d'accéder au fichier : " & tempPath
Mais etrangement, la ligne de code qui suit marche bien tempWb.Worksheets("Config").Range("E2").Value = 0
Cela n'a pas de sens là. Si vous avez le message d'erreur, la macro s'arrête puisque vous avez un EXIT SUB juste en dessous de la ligne Msgbox
Je suppose que vous désactivez la partie Msgbox ?
Par contre dans votre code tempPath correspond à quoi car la variable n'est pas déclarée et j'ai naturellement un bug puisqu'en collant votre code dans un fichier cela me renvoie une erreur à l'instruction DIR
Crdlt
Bonjour Saboh.
J'ai essayé les 2 methodes, mais meme msgbox qui s'affiche.
Dan, c'est vrai que le exit sub aurait du empecher l'écriture du zero dans le classeur B, je ne comprends pas du tout ^^
J'ai fais une copie du fichier B, juste au moment ou apparait la msgbox (avant de cliquer sur ok) et je constate que la valeur zéro est bien déjà noté avant validation de la msgbox
Le tempPath, c'est un string, chemin d'accès complet au fichier B
Je ne comprends moi non plus plus rien... Comme l'a dit dan, a moins d'une modification non répertoriée ici, si la msgbox s'affiche, l'instruction tempWb.Worksheets("Config").Range("E2").Value = 0 n'est pas effectuée.
Par ailleurs vous ne devriez même pas pouvoir arriver à la msgbox car si le fichier n'est pas trouvé, c'est la ligne Set tempWb = Workbooks.Open(Filename:=tempPath, ReadOnly:=False) qui devrait lever une erreur (1004)...
Etes-vous sûr de ne pas avoir groupé tout cela dans un "on error resume next" ?
Si vous pouviez joindre le fichier je pense qu'on y verrait plus clair (supprimez tout ce qui est inutile sauf le code).
Re
Dan, c'est vrai que le exit sub aurait du empecher l'écriture du zero dans le classeur B, je ne comprends pas du tout ^^
J'ai fais une copie du fichier B, juste au moment ou apparait la msgbox (avant de cliquer sur ok) et je constate que la valeur zéro est bien déjà noté avant validation de la msgbox
bah c'est impossible que le code lise une ligne qui est située après votre msgbox. Je ne comprends rien là (comme Saboh12617 d'ailleurs...)
Puis votre temppath est défini où ? On ne voit rien dans votre code car là votre code devrait buguer à la première ligne
Si le fichier B est toujours le même et que le répertoire dans lequel il se trouve ne bouge pas, faites plutôt le code comme ceci :
Remplacez les points par le répertoire complet (C:\users\.....) et le nom du fichierB avec son extension
Sub SaveWbDevisFerme()
Dim tempWb As Workbook
Dim fichier As String
Dim temppath As String
Application.ScreenUpdating = False
temppath = "......." 'répertoire du fichierB
fichier = "...." ' nom fichierB avec extension
Set tempWb = Workbooks.Open(temppath & fichier)
' Utilisation normale
With tempWb
.Sheets("Config").Range("E2").Value = 0
.Close SaveChanges:=True
End With
Application.ScreenUpdating = True
End SubMerci pour vos réponses.
Pour faciliter les choses Je vais dès que possible partager les fichiers en enlevant les parties confidentielles que je ne peux partager.
Le codage etant très long, cela va me prendre un peu de temps...