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

Problème avec beforeclose / beforesave

10 réponses
Avatar
ThierryP
Bonjour tout le monde !
Avec la macro ci-dessous, enregistr=E9e dans un mod=E8le, je pouvais lors
de la fermeture du fichier, donner un nom au fichier et l'enregistrer
o=F9 je le voulais, tout en supprimant le code devenu inutile. J'ai
voulu peaufiner la chose en rajoutant un controle de saisie (entre les
lignes pointill=E9es)....Depuis, quand le code ex=E9cute le Exit Sub
(rep=E9r=E9 par !!!!!!!!!!!!), Excel me demande si je veux sauvegarder le
fichier "mod=E8le1.xls" (sans passer par beforesave), ce que je ne veux
pas bien s=FBr !!!!
Apr=E8s avoir essay=E9 plein de trucs, je fais appel aux gurus du mpfe !!!

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.ScreenUpdating =3D False
Application.DisplayAlerts =3D False
---------------------------------------------------------------------------=
-----------------------------
Range("A22").End(xlUp).Select
For j =3D ActiveCell.Row To 2 Step -1
For i =3D 1 To 4
If IsEmpty(ActiveCell.Offset(0, i)) Then
MsgBox "Vous n'avez pas compl=E9t=E9 la ligne " &
ActiveCell.Row
controle =3D False
Exit Sub !!!!!!!!!!!!!!!!!!!!!!!!
End If
Next
Next
controle =3D True
Application.ScreenUpdating =3D True
If Not (controle) Then Cancel =3D True: Exit Sub
---------------------------------------------------------------------------=
-----------------------------------------
ActiveSheet.Protect DrawingObjects:=3DTrue, Contents:=3DTrue,
Scenarios:=3DTrue
ActiveSheet.EnableSelection =3D xlUnlockedCells
If Day(Date) < 10 Then
Jour =3D "0" & Trim(Day(Date))
Else
Jour =3D Trim(Day(Date))
End If
Nom_Fichier =3D Year(Date) & Month(Date) & Jour & "_" & Range("Nom")
ActiveWorkbook.SaveAs "C:\Reports\" & Nom_Fichier
Application.DisplayAlerts =3D True
End Sub


Merci d'avance !

ThierryP
PS : ne soyez pas vex=E9s, mais je vais crossposter sur answers....parce
que je ne sais plus qui fr=E9quente quoi !!!!!

10 réponses

Avatar
h2so4
bonjour,

je n'ai pas cherché à comprendre ce que fait cette macro, mais j'y ai
trouvé quelques instructions qui me semblent mal placées.



Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.ScreenUpdating = False
Application.DisplayAlerts = False
--------------------------------------------------------------------------------------------------------
Range("A22").End(xlUp).Select
controle = True ' par defaut les controles sont corrects
For j = ActiveCell.Row To 2 Step -1
For i = 1 To 4
If IsEmpty(ActiveCell.Offset(0, i)) Then
MsgBox "Vous n'avez pas complété la ligne " &
ActiveCell.Row
controle = False ' une erreur a ete trouvée
i=5:j=0: 'pour sortir de la boucle j et i si on ne doit
' pas vérifier les autres lignes et colonnes
End If
Next
Next
Application.ScreenUpdating = True
If Not (controle) Then Cancel = True: Exit Sub
--------------------------------------------------------------------------------------------------------------------
ActiveSheet.Protect DrawingObjects:=True, Contents:=True,
Scenarios:=True
ActiveSheet.EnableSelection = xlUnlockedCells
If Day(Date) < 10 Then
Jour = "0" & Trim(Day(Date))
Else
Jour = Trim(Day(Date))
End If
Nom_Fichier = Year(Date) & Month(Date) & Jour & "_" & Range("Nom")
ActiveWorkbook.SaveAs "C:Reports" & Nom_Fichier
Application.DisplayAlerts = True
End Sub




ThierryP laid this down on his screen :
Bonjour tout le monde !
Avec la macro ci-dessous, enregistrée dans un modèle, je pouvais lors
de la fermeture du fichier, donner un nom au fichier et l'enregistrer
où je le voulais, tout en supprimant le code devenu inutile. J'ai
voulu peaufiner la chose en rajoutant un controle de saisie (entre les
lignes pointillées)....Depuis, quand le code exécute le Exit Sub
(repéré par !!!!!!!!!!!!), Excel me demande si je veux sauvegarder le
fichier "modèle1.xls" (sans passer par beforesave), ce que je ne veux
pas bien sûr !!!!
Après avoir essayé plein de trucs, je fais appel aux gurus du mpfe !!!

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.ScreenUpdating = False
Application.DisplayAlerts = False
--------------------------------------------------------------------------------------------------------
Range("A22").End(xlUp).Select
For j = ActiveCell.Row To 2 Step -1
For i = 1 To 4
If IsEmpty(ActiveCell.Offset(0, i)) Then
MsgBox "Vous n'avez pas complété la ligne " &
ActiveCell.Row
controle = False
Exit Sub !!!!!!!!!!!!!!!!!!!!!!!!
End If
Next
Next
controle = True
Application.ScreenUpdating = True
If Not (controle) Then Cancel = True: Exit Sub
--------------------------------------------------------------------------------------------------------------------
ActiveSheet.Protect DrawingObjects:=True, Contents:=True,
Scenarios:=True
ActiveSheet.EnableSelection = xlUnlockedCells
If Day(Date) < 10 Then
Jour = "0" & Trim(Day(Date))
Else
Jour = Trim(Day(Date))
End If
Nom_Fichier = Year(Date) & Month(Date) & Jour & "_" & Range("Nom")
ActiveWorkbook.SaveAs "C:Reports" & Nom_Fichier
Application.DisplayAlerts = True
End Sub


Merci d'avance !

ThierryP
PS : ne soyez pas vexés, mais je vais crossposter sur answers....parce
que je ne sais plus qui fréquente quoi !!!!!



--
h2so4
ca PAN
pique DORA
.
Avatar
h2so4
h2so4 presented the following explanation :
rebonjour,

je pense que ceci est encore plus simple et devrait le faire.
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.ScreenUpdating = False
Application.DisplayAlerts = False
--------------------------------------------------------------------------------------------------------
Range("A22").End(xlUp).Select

For j = ActiveCell.Row To 2 Step -1
For i = 1 To 4
If IsEmpty(ActiveCell.Offset(0, i)) Then
MsgBox "Vous n'avez pas complété la ligne " &
ActiveCell.Row




Cancel=true
exit sub

End If
Next
Next
Application.ScreenUpdating = True

--------------------------------------------------------------------------------------------------------------------
ActiveSheet.Protect DrawingObjects:=True, Contents:=True,
Scenarios:=True
ActiveSheet.EnableSelection = xlUnlockedCells
If Day(Date) < 10 Then
Jour = "0" & Trim(Day(Date))
Else
Jour = Trim(Day(Date))
End If
Nom_Fichier = Year(Date) & Month(Date) & Jour & "_" & Range("Nom")
ActiveWorkbook.SaveAs "C:Reports" & Nom_Fichier
Application.DisplayAlerts = True
End Sub




ThierryP laid this down on his screen :
Bonjour tout le monde !
Avec la macro ci-dessous, enregistrée dans un modèle, je pouvais lors
de la fermeture du fichier, donner un nom au fichier et l'enregistrer
où je le voulais, tout en supprimant le code devenu inutile. J'ai
voulu peaufiner la chose en rajoutant un controle de saisie (entre les
lignes pointillées)....Depuis, quand le code exécute le Exit Sub
(repéré par !!!!!!!!!!!!), Excel me demande si je veux sauvegarder le
fichier "modèle1.xls" (sans passer par beforesave), ce que je ne veux
pas bien sûr !!!!
Après avoir essayé plein de trucs, je fais appel aux gurus du mpfe !!!

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.ScreenUpdating = False
Application.DisplayAlerts = False
--------------------------------------------------------------------------------------------------------
Range("A22").End(xlUp).Select
For j = ActiveCell.Row To 2 Step -1
For i = 1 To 4
If IsEmpty(ActiveCell.Offset(0, i)) Then
MsgBox "Vous n'avez pas complété la ligne " &
ActiveCell.Row
controle = False
Exit Sub !!!!!!!!!!!!!!!!!!!!!!!!
End If
Next
Next
controle = True
Application.ScreenUpdating = True
If Not (controle) Then Cancel = True: Exit Sub
--------------------------------------------------------------------------------------------------------------------
ActiveSheet.Protect DrawingObjects:=True, Contents:=True,
Scenarios:=True
ActiveSheet.EnableSelection = xlUnlockedCells
If Day(Date) < 10 Then
Jour = "0" & Trim(Day(Date))
Else
Jour = Trim(Day(Date))
End If
Nom_Fichier = Year(Date) & Month(Date) & Jour & "_" & Range("Nom")
ActiveWorkbook.SaveAs "C:Reports" & Nom_Fichier
Application.DisplayAlerts = True
End Sub


Merci d'avance !

ThierryP
PS : ne soyez pas vexés, mais je vais crossposter sur answers....parce
que je ne sais plus qui fréquente quoi !!!!!





--
h2so4
ca PAN
pique DORA
.
Avatar
LSteph
Bonjour Thierry,

(sans passer par beforesave), ce que je ne veux



Il y a quoi d'autre part dans ton before save.

Sinon sur le principe de fermer sans avoir enregistré tu peux mettre
saved=true
ou si tu veux que cela repasse par la question lors du before save
savedúlse

Nota:/ ton PS ..qui se vexerait, tu as plus de chances sur les deux (que
nombre d'entre nous frequentent même si répondent plutôt sur l'un que
l'autre)

Cordialement.

--
LSteph


"ThierryP" a écrit dans le message de
news:
Bonjour tout le monde !
Avec la macro ci-dessous, enregistrée dans un modèle, je pouvais lors
de la fermeture du fichier, donner un nom au fichier et l'enregistrer
où je le voulais, tout en supprimant le code devenu inutile. J'ai
voulu peaufiner la chose en rajoutant un controle de saisie (entre les
lignes pointillées)....Depuis, quand le code exécute le Exit Sub
(repéré par !!!!!!!!!!!!), Excel me demande si je veux sauvegarder le
fichier "modèle1.xls" (sans passer par beforesave), ce que je ne veux
pas bien sûr !!!!
Après avoir essayé plein de trucs, je fais appel aux gurus du mpfe !!!

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.ScreenUpdating = False
Application.DisplayAlerts = False
--------------------------------------------------------------------------------------------------------
Range("A22").End(xlUp).Select
For j = ActiveCell.Row To 2 Step -1
For i = 1 To 4
If IsEmpty(ActiveCell.Offset(0, i)) Then
MsgBox "Vous n'avez pas complété la ligne " &
ActiveCell.Row
controle = False
Exit Sub !!!!!!!!!!!!!!!!!!!!!!!!
End If
Next
Next
controle = True
Application.ScreenUpdating = True
If Not (controle) Then Cancel = True: Exit Sub
--------------------------------------------------------------------------------------------------------------------
ActiveSheet.Protect DrawingObjects:=True, Contents:=True,
Scenarios:=True
ActiveSheet.EnableSelection = xlUnlockedCells
If Day(Date) < 10 Then
Jour = "0" & Trim(Day(Date))
Else
Jour = Trim(Day(Date))
End If
Nom_Fichier = Year(Date) & Month(Date) & Jour & "_" & Range("Nom")
ActiveWorkbook.SaveAs "C:Reports" & Nom_Fichier
Application.DisplayAlerts = True
End Sub


Merci d'avance !

ThierryP
PS : ne soyez pas vexés, mais je vais crossposter sur answers....parce
que je ne sais plus qui fréquente quoi !!!!!
Avatar
Gloops
ThierryP a écrit, le 14/11/2010 07:58 :
Bonjour tout le monde !
Avec la macro ci-dessous, enregistrée dans un modèle, je pouvais lo rs
de la fermeture du fichier, donner un nom au fichier et l'enregistrer
où je le voulais, tout en supprimant le code devenu inutile. J'ai
voulu peaufiner la chose en rajoutant un controle de saisie (entre les
lignes pointillées)....Depuis, quand le code exécute le Exit Sub
(repéré par !!!!!!!!!!!!), Excel me demande si je veux sauvegarder le
fichier "modèle1.xls" (sans passer par beforesave), ce que je ne veux
pas bien sûr !!!!
Après avoir essayé plein de trucs, je fais appel aux gurus du mpfe !!!

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.ScreenUpdating = False
Application.DisplayAlerts = False
----------------------------------------------------------------------- ---------------------------------
Range("A22").End(xlUp).Select
For j = ActiveCell.Row To 2 Step -1
For i = 1 To 4
If IsEmpty(ActiveCell.Offset(0, i)) Then
MsgBox "Vous n'avez pas complété la ligne "&
ActiveCell.Row
controle = False
Exit Sub !!!!!!!!!!!!!!!!!!!!!!!!
End If
Next
Next
controle = True
Application.ScreenUpdating = True
If Not (controle) Then Cancel = True: Exit Sub
----------------------------------------------------------------------- ---------------------------------------------
ActiveSheet.Protect DrawingObjects:=True, Contents:=True,
Scenarios:=True
ActiveSheet.EnableSelection = xlUnlockedCells
If Day(Date)< 10 Then
Jour = "0"& Trim(Day(Date))
Else
Jour = Trim(Day(Date))
End If
Nom_Fichier = Year(Date)& Month(Date)& Jour& "_"& Range("Nom")
ActiveWorkbook.SaveAs "C:Reports"& Nom_Fichier
Application.DisplayAlerts = True
End Sub


Merci d'avance !

ThierryP
PS : ne soyez pas vexés, mais je vais crossposter sur answers....parc e
que je ne sais plus qui fréquente quoi !!!!!



Bonjour,

De même que h2so4 j'ai lu très vite.
Ce qui a retenu mon attention, c'est l'absence du "Cancel = true" juste
avant les points d'exclamation.
Mais il se peut que j'aie mal compris la question. Cancel = true, c'est
pour abandonner la fermeture.
Avatar
Gloops
Gloops a écrit, le 14/11/2010 12:47 :
ThierryP a écrit, le 14/11/2010 07:58 :
Bonjour tout le monde !
Avec la macro ci-dessous, enregistrée dans un modèle, je pouvais l ors
de la fermeture du fichier, donner un nom au fichier et l'enregistrer
où je le voulais, tout en supprimant le code devenu inutile. J'ai
voulu peaufiner la chose en rajoutant un controle de saisie (entre les
lignes pointillées)....Depuis, quand le code exécute le Exit Sub
(repéré par !!!!!!!!!!!!), Excel me demande si je veux sauvegarder le
fichier "modèle1.xls" (sans passer par beforesave), ce que je ne veu x
pas bien sûr !!!!
Après avoir essayé plein de trucs, je fais appel aux gurus du mpfe !!!

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.ScreenUpdating = False
Application.DisplayAlerts = False
---------------------------------------------------------------------- ----------------------------------

Range("A22").End(xlUp).Select
For j = ActiveCell.Row To 2 Step -1
For i = 1 To 4
If IsEmpty(ActiveCell.Offset(0, i)) Then
MsgBox "Vous n'avez pas complété la ligne "&
ActiveCell.Row
controle = False
Exit Sub !!!!!!!!!!!!!!!!!!!!!!!!
End If
Next
Next
controle = True
Application.ScreenUpdating = True
If Not (controle) Then Cancel = True: Exit Sub
---------------------------------------------------------------------- ----------------------------------------------

ActiveSheet.Protect DrawingObjects:=True, Contents:=True,
Scenarios:=True
ActiveSheet.EnableSelection = xlUnlockedCells
If Day(Date)< 10 Then
Jour = "0"& Trim(Day(Date))
Else
Jour = Trim(Day(Date))
End If
Nom_Fichier = Year(Date)& Month(Date)& Jour& "_"& Range("Nom")
ActiveWorkbook.SaveAs "C:Reports"& Nom_Fichier
Application.DisplayAlerts = True
End Sub


Merci d'avance !

ThierryP
PS : ne soyez pas vexés, mais je vais crossposter sur answers....par ce
que je ne sais plus qui fréquente quoi !!!!!



Bonjour,

De même que h2so4 j'ai lu très vite.
Ce qui a retenu mon attention, c'est l'absence du "Cancel = true" jus te
avant les points d'exclamation.
Mais il se peut que j'aie mal compris la question. Cancel = true, c'e st
pour abandonner la fermeture.





Ah oui h2so4 l'a mis dans son message suivant.
Je m'étais calmé pourtant avec mon habitude de répondre plus vite q ue
mon ombre :)
Avatar
Gloops
LSteph a écrit, le 14/11/2010 11:59 :
Sinon sur le principe de fermer sans avoir enregistré tu peux mettre
saved=true



Ah j'ai failli dire voilà ce que je cherchais Vendredi dernier.
Non en fait ce que je voulais c'était remplacer si le fichier existait
déjà, il me semblait que SaveAs avait un argument pour ça, mais ç a ne
paraissait pas probant. J'ai fini par sortir l'artillerie lourde, avec
FileSystemObject. Les puristes tiquent.
Avatar
ThierryP
On 14 nov, 15:52, Gloops wrote:
LSteph a écrit, le 14/11/2010 11:59 :

> Sinon sur le principe de fermer sans avoir enregistré tu peux mettre
> saved=true

Ah j'ai failli dire voilà ce que je cherchais Vendredi dernier.
Non en fait ce que je voulais c'était remplacer si le fichier existait
déjà, il me semblait que SaveAs avait un argument pour ça, mais ç a ne
paraissait pas probant. J'ai fini par sortir l'artillerie lourde, avec
FileSystemObject. Les puristes tiquent.



Bonsoir à tous,

à la lumière des différents posts, je crois qu'effectivement j'ai é té
un peu vite et que ma logique ne soit pas bonne !!
Je testerai ça demain, là il est un peu tard. Je vous donnerai le
retour.

Merci à tous ceux qui se sont penchés sur mon souci
Avatar
Gloops
ThierryP a écrit, le 14/11/2010 22:05 :
On 14 nov, 15:52, Gloops wrote:
LSteph a écrit, le 14/11/2010 11:59 :

Sinon sur le principe de fermer sans avoir enregistré tu peux mettr e
saved=true



Ah j'ai failli dire voilà ce que je cherchais Vendredi dernier.
Non en fait ce que je voulais c'était remplacer si le fichier exista it
déjà, il me semblait que SaveAs avait un argument pour ça, mais ça ne
paraissait pas probant. J'ai fini par sortir l'artillerie lourde, avec
FileSystemObject. Les puristes tiquent.



Bonsoir à tous,

à la lumière des différents posts, je crois qu'effectivement j'ai été
un peu vite et que ma logique ne soit pas bonne !!
Je testerai ça demain, là il est un peu tard. Je vous donnerai le
retour.

Merci à tous ceux qui se sont penchés sur mon souci



OK on va faire comme ça.

Pendant qu'on y est, si quelqu'un a une réponse pour confirmer qu'on
veut remplacer un fichier si il existe déjà ...
Avatar
isabelle
salut Gloops,

Le 2010-11-14 16:44, Gloops a écrit :

Pendant qu'on y est, si quelqu'un a une réponse pour confirmer qu'on
veut remplacer un fichier si il existe déjà ...



Application.DisplayAlerts = False
'ActiveWorkbook.SaveAs ......
Application.DisplayAlerts = True

isabelle
Avatar
ThierryP
On 14 nov, 13:09, h2so4 wrote:
bonjour,

je n'ai pas cherché à comprendre ce que fait cette macro, mais j'y ai
trouvé quelques instructions qui me semblent mal placées.

Private Sub Workbook_BeforeClose(Cancel As Boolean)



> Application.ScreenUpdating = False
> Application.DisplayAlerts = False
> ----------------------------------------------------------------------- ---------------------------------
> Range("A22").End(xlUp).Select
> controle = True ' par defaut les controles sont corrects
> For j = ActiveCell.Row To 2 Step -1
>     For i = 1 To 4
>         If IsEmpty(ActiveCell.Offset(0, i)) Then
>             MsgBox "Vous n'avez pas complété la ligne " &
> ActiveCell.Row
>             controle = False ' une erreur a ete trouvée
>             i=5:j=0: 'pour sortir de la boucle j et i s i on ne doit
>             ' pas vérifier les autres lignes et colonnes
>         End If
>     Next
> Next
> Application.ScreenUpdating = True
> If Not (controle) Then Cancel = True: Exit Sub
> ----------------------------------------------------------------------- ---------------------------------------------
> ActiveSheet.Protect DrawingObjects:=True, Contents:=True,
> Scenarios:=True
> ActiveSheet.EnableSelection = xlUnlockedCells
> If Day(Date) < 10 Then
>     Jour = "0" & Trim(Day(Date))
> Else
>     Jour = Trim(Day(Date))
> End If
> Nom_Fichier = Year(Date) & Month(Date) & Jour & "_" & Range("Nom")
> ActiveWorkbook.SaveAs "C:Reports" & Nom_Fichier
> Application.DisplayAlerts = True
> End Sub

ThierryP laid this down on his screen :



> Bonjour tout le monde !
> Avec la macro ci-dessous, enregistrée dans un modèle, je pouvais lo rs
> de la fermeture du fichier, donner un nom au fichier et l'enregistrer
> où je le voulais, tout en supprimant le code devenu inutile. J'ai
> voulu peaufiner la chose en rajoutant un controle de saisie (entre les
> lignes pointillées)....Depuis, quand le code exécute le Exit Sub
> (repéré par !!!!!!!!!!!!), Excel me demande si je veux sauvegarder le
> fichier "modèle1.xls" (sans passer par beforesave), ce que je ne veux
> pas bien sûr !!!!
> Après avoir essayé plein de trucs, je fais appel aux gurus du mpfe !!!

> Private Sub Workbook_BeforeClose(Cancel As Boolean)
> Application.ScreenUpdating = False
> Application.DisplayAlerts = False
> ----------------------------------------------------------------------- ---------------------------------
> Range("A22").End(xlUp).Select
> For j = ActiveCell.Row To 2 Step -1
>     For i = 1 To 4
>         If IsEmpty(ActiveCell.Offset(0, i)) Then
>             MsgBox "Vous n'avez pas complété la ligne " &
> ActiveCell.Row
>             controle = False
>             Exit Sub !!!!!!!!!!!!!!!!!!!!!!!!
>         End If
>     Next
> Next
> controle = True
> Application.ScreenUpdating = True
> If Not (controle) Then Cancel = True: Exit Sub
> ----------------------------------------------------------------------- ---------------------------------------------
> ActiveSheet.Protect DrawingObjects:=True, Contents:=True,
> Scenarios:=True
> ActiveSheet.EnableSelection = xlUnlockedCells
> If Day(Date) < 10 Then
>     Jour = "0" & Trim(Day(Date))
> Else
>     Jour = Trim(Day(Date))
> End If
> Nom_Fichier = Year(Date) & Month(Date) & Jour & "_" & Range("Nom")
> ActiveWorkbook.SaveAs "C:Reports" & Nom_Fichier
> Application.DisplayAlerts = True
> End Sub

> Merci d'avance !

> ThierryP
> PS : ne soyez pas vexés, mais je vais crossposter sur answers....parc e
> que je ne sais plus qui fréquente quoi !!!!!

--
h2so4
ca PAN
pique DORA
.



Bonsoir à tous,

H2SO4 avait raison......Le "Cancel=True" était bien dans la proc, mais
pas au bon endroit ! Et en reprenant tout à l'heure, je me suis dit
que j'avais vraiment écrit n'importe quoi !!
Pour LStpeh, en fait dans le beforesave, je supprime tout le code, qui
ne sert plus à rien une fois le fichier rempli. Donc je ne dois passer
dans le beforesave que quand tout est vraiment OK

Merci à tout le monde :-))))