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

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

Crdlt

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 If

Bonjour,

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 Sub

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

Rechercher des sujets similaires à "appel fonction workbook beforeclose"