Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Question à la fermeture de classeur

2 réponses
Avatar
Eliot Naiss
Bonjour à vous,
le sujet a surement déjà été évoqué, m'enfin je pose quand même la question,
désolé ...
j'ai un classeur (http://cjoint.com/?mdpbvcdqiP) dans lequel je vais
travailler.
A sa fermeture une question est posée :
- modifier une cellule particulière, enregistrer et fermer le classeur
- ne rien sauvegarder et fermer le classeur
Dans le code de l'userform("usfDate"), la zone de texte contient :
"Voulez-vous modifier la date de mise à jour, enregistrer le classeur puis
le fermer ?"
pour les deux boutons, les codes :
Private Sub cmdNon_Click()
'fermeture sans rien enregistrer
Application.DisplayAlerts = False
ActiveWorkbook.Close (False)
End Sub

Private Sub cmdOui_Click()
'écriture de la date système
Sheets("Infos").Range("B7").Value = Date
'fermeture du classeur actif, avec enregistrement des changements
ActiveWorkbook.Save
ActiveWorkbook.Close '(True)
End Sub

Dans le code du classeur j'ai placé :
Private Sub Workbook_BeforeClose(Cancel As Boolean)
'Application.DisplayAlerts = False
usfDate.Show
End Sub
J'ai essayé vainement l'instruction DisplayAlerts, mais cela bug !
J'ai une erreur 400, (feuille déjà affichée; affichage modal impossible)

La réponse à mon problème doit surement être devant mon nez, mais je ne la
vois pas !...
Merci de votre assistance.
Cordialement.
Eliot.

2 réponses

Avatar
francois.forcet
On 3 déc, 15:49, Eliot Naiss
wrote:
Bonjour à vous,
le sujet a surement déjà été évoqué, m'enfin je pose quand m ême la question,
désolé ...
j'ai un classeur (http://cjoint.com/?mdpbvcdqiP) dans lequel je vais
travailler.
A sa fermeture une question est posée :
- modifier une cellule particulière, enregistrer et fermer le classeur
- ne rien sauvegarder et fermer le classeur
Dans le code de l'userform("usfDate"), la zone de texte contient :
"Voulez-vous modifier la date de mise à jour, enregistrer le classeur pu is
le fermer ?"
pour les deux boutons, les codes :
Private Sub cmdNon_Click()
'fermeture sans rien enregistrer
Application.DisplayAlerts = False
ActiveWorkbook.Close (False)
End Sub

Private Sub cmdOui_Click()
'écriture de la date système
Sheets("Infos").Range("B7").Value = Date
'fermeture du classeur actif, avec enregistrement des changements
ActiveWorkbook.Save
ActiveWorkbook.Close '(True)
End Sub

Dans le code du classeur j'ai placé :
Private Sub Workbook_BeforeClose(Cancel As Boolean)
'Application.DisplayAlerts = False
usfDate.Show
End Sub
J'ai essayé vainement l'instruction DisplayAlerts, mais cela bug !
J'ai une erreur 400, (feuille déjà affichée; affichage modal impossi ble)

La réponse à mon problème doit surement être devant mon nez, mais je ne la
vois pas !...
Merci de votre assistance.
Cordialement.
Eliot.


Salut à toi

Ton bug est tout à fait normal

A la fermeture tu commande l'affichage de ton Userform par le code du
Thisworkbook
Lorsque tu cliques sur l'un des boutons de ce Userform tu commande une
2° fermeture par le code VBA de tes boutons par la ligne de commande :

ActiveWorkbook.Close

ce qui active un 2° fois la macro du Thisworkbook et donc l'affichage
de ton Userform déjà affiché et donc ton plantage

2 solutions :

la première consiste de modifier ainsi les codes de tes boutons :

Bouton Non :

Private Sub cmdNon_Click()
'fermeture sans rien enregistrer
Application.DisplayAlerts = False
usfDate.Hide
End Sub

Bouton Oui :

Private Sub cmdOui_Click()
'écriture de la date système
Sheets("Infos").Range("B7").Value = Date
'fermeture du classeur actif, avec enregistrement des
changements
ActiveWorkbook.Save
usfDate.Hide
End Sub


cette solution est la plus propre

La deuxième solution consiste à s'affranchir de ton message d'erreur
en incluant la ligne de commande suivant en tête de code de ton
Thisworkbook :

On Error Resume Next

ce qui donne pour le This Workbook :

Private Sub Workbook_BeforeClose(Cancel As Boolean)
On Error Resume Next
usfDate.Show
End Sub

A toi de voir mais tu devrais trouver ainsi ton bonheur

Dis moi !!!!

Avatar
Eliot Naiss
Bonsoir François,
ta réponse m'a été d'un grand secours !
Avec une explication, je comprend mieux !!
J'ai donc opté pour ta première solution, qui me va très bien.
Encore merci.
Cordialement.
Eliot


On 3 déc, 15:49, Eliot Naiss
wrote:
Bonjour à vous,
le sujet a surement déjà été évoqué, m'enfin je pose quand même la question,
désolé ...
j'ai un classeur (http://cjoint.com/?mdpbvcdqiP) dans lequel je vais
travailler.
A sa fermeture une question est posée :
- modifier une cellule particulière, enregistrer et fermer le classeur
- ne rien sauvegarder et fermer le classeur
Dans le code de l'userform("usfDate"), la zone de texte contient :
"Voulez-vous modifier la date de mise à jour, enregistrer le classeur puis
le fermer ?"
pour les deux boutons, les codes :
Private Sub cmdNon_Click()
'fermeture sans rien enregistrer
Application.DisplayAlerts = False
ActiveWorkbook.Close (False)
End Sub

Private Sub cmdOui_Click()
'écriture de la date système
Sheets("Infos").Range("B7").Value = Date
'fermeture du classeur actif, avec enregistrement des changements
ActiveWorkbook.Save
ActiveWorkbook.Close '(True)
End Sub

Dans le code du classeur j'ai placé :
Private Sub Workbook_BeforeClose(Cancel As Boolean)
'Application.DisplayAlerts = False
usfDate.Show
End Sub
J'ai essayé vainement l'instruction DisplayAlerts, mais cela bug !
J'ai une erreur 400, (feuille déjà affichée; affichage modal impossible)

La réponse à mon problème doit surement être devant mon nez, mais je ne la
vois pas !...
Merci de votre assistance.
Cordialement.
Eliot.


Salut à toi

Ton bug est tout à fait normal

A la fermeture tu commande l'affichage de ton Userform par le code du
Thisworkbook
Lorsque tu cliques sur l'un des boutons de ce Userform tu commande une
2° fermeture par le code VBA de tes boutons par la ligne de commande :

ActiveWorkbook.Close

ce qui active un 2° fois la macro du Thisworkbook et donc l'affichage
de ton Userform déjà affiché et donc ton plantage

2 solutions :

la première consiste de modifier ainsi les codes de tes boutons :

Bouton Non :

Private Sub cmdNon_Click()
'fermeture sans rien enregistrer
Application.DisplayAlerts = False
usfDate.Hide
End Sub

Bouton Oui :

Private Sub cmdOui_Click()
'écriture de la date système
Sheets("Infos").Range("B7").Value = Date
'fermeture du classeur actif, avec enregistrement des
changements
ActiveWorkbook.Save
usfDate.Hide
End Sub


cette solution est la plus propre

La deuxième solution consiste à s'affranchir de ton message d'erreur
en incluant la ligne de commande suivant en tête de code de ton
Thisworkbook :

On Error Resume Next

ce qui donne pour le This Workbook :

Private Sub Workbook_BeforeClose(Cancel As Boolean)
On Error Resume Next
usfDate.Show
End Sub

A toi de voir mais tu devrais trouver ainsi ton bonheur

Dis moi !!!!