Workbook_BeforeClose problème

  • Initiateur de la discussion Initiateur de la discussion nadia11565
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

N

nadia11565

Guest
Bonjour

Ma macro valide la saisie des champs obligatoires sur l'action sauvegarder. Par contre si je clique sur 'X' pour fermer le fichier, alors j'appel ma validation qui regarde si des cellules obligatoires ne sont pas remplis si oui alors j'affiche un message, sauf que lorsque je clique sur OK sur ce message d'avertissement tout de suite il y a un le message d'Excel qui me demande si je veux sauvegarder mes dernière modifications et si je clique OUI alors il m'affiche le message d'avertissement et ça tourne en rond.. Je ne sais pas comment gérer cela pour que le message de sauvegarde ne s'affiche pas.
Voici code qui est appelé dans ThisWorkbook :

Private Sub Workbook_BeforeClose(Cancel As Boolean)

Dim WorksheetAsError As Boolean
'Reset
WorksheetAsError = False

'Invoke validation
WorksheetAsError = ValidationChampObligatoire()

If WorksheetAsError = True Then
Cancel = True
'Application.DisplayAlerts = False ' Ne fonctionne pas
Else
Cancel = False
End If
End Sub


Merci de votre aide
Nadia
 
Re : Workbook_BeforeClose problème

Bonjour Nadia, Le forum,

A mon avis tu devrais mettre le teste dans l'évènement BeforeSave, qui sauf erreur de ma part, intervient avant le BeforeClose.

cdt

smotty


Bonjour J'ai le même test dans le Before save et ça tourne en ron de la même façon voilà mon code
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

Dim WorksheetAsError As Boolean
'Reset
WorksheetAsError = False

'Invoke validation
WorksheetAsError = ValidationChampObligatoire()

If WorksheetAsError = True Then
Cancel = True
Else
Cancel = False
End If
End Sub
 
Re : Workbook_BeforeClose problème

As-tu testé la valeur retournée par la fonction?

On est bien d'accord que quand tu mets cancel à True, c'est que tu veux stopper la sauvegarde?

J'ai testé, ça fonctionne, donc peut-être peux-tu joindre le code de la fonction?

cdt

smotty
 
Re : Workbook_BeforeClose problème

Bonsoir Nadia, Smoty,

Code:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Dim WorksheetAsError As Boolean
    'Reset
    WorksheetAsError = False
    Invoke Validation
    WorksheetAsError = ValidationChampObligatoire()
    If WorksheetAsError = True Then
        Cancel = True
       [COLOR=red][B] ThisWorkbook.Saved = True[/B][/COLOR]    [COLOR=yellowgreen]'tricher en indiquant à excel que le classeur à été sauvegardé.[/COLOR]
    Else
        Cancel = False
    End If
End Sub

A+
A+
 
Re : Workbook_BeforeClose problème

As-tu testé la valeur retournée par la fonction?

On est bien d'accord que quand tu mets cancel à True, c'est que tu veux stopper la sauvegarde?

J'ai testé, ça fonctionne, donc peut-être peux-tu joindre le code de la fonction?

cdt

smotty

Bonsoir, Merci de votre aide, mais lorsque j'ajoute
ThisWorkbook.Saved = True

Le message qui demande de sauvegarder ne s'affiche plus, mais le fichier
se ferme et je ne voudrais pas qu'il se ferme, car le champ
obligatoire n'a pas été saisie.
Je vous joins mon document qui contient tout le code.
 
Re : Workbook_BeforeClose problème

Bonjour Nadia, Hasco, le forum

Juste au passage ce simple code fait la meme chose:

Code:
Private Sub Workbook_BeforeClose(Cancel As Boolean)

     if ValidationChampObligatoire then cancel =true

End Sub

tricher en indiquant à excel que le classeur à été sauvegardé.

Selon moi, pas besoin de tricher, le code fonctionne très bien comme ça.

le problème vient certainement de la fonction:ValidationChampObligatoire

D'ailleurs, cette fonction retourne-t-elle bien une valeur booleene?

Function ValidationChampObligatoire() as boolean

si oui, essaie une autre fonction qui retourne juste la valeur à true ou false, et tu verras que ça fonctionne😉

cdt

smotty
 
Re : Workbook_BeforeClose problème

Bonjour Nadia, Hasco, le forum

Juste au passage ce simple code fait la meme chose:

Code:
Private Sub Workbook_BeforeClose(Cancel As Boolean)

     if ValidationChampObligatoire then cancel =true

End Sub



Selon moi, pas besoin de tricher, le code fonctionne très bien comme ça.

le problème vient certainement de la fonction:ValidationChampObligatoire

D'ailleurs, cette fonction retourne-t-elle bien une valeur booleene?

Function ValidationChampObligatoire() as boolean

si oui, essaie une autre fonction qui retourne juste la valeur à true ou false, et tu verras que ça fonctionne😉

cdt

smotty


Oui ma fonction retourne une valeur booleene
C'est quoi la différence avec une fonction qui retourne une valeur à true ou
false vs m'a fonction qui est déclaré As Boolean

De plus lorsque le WorksheetAsError est true est-ce qu'il a moyen de dire de ne pas fermer le fichier

If WorksheetAsError = True Then
Cancel = True
ThisWorkbook.Saved = True
Else
Cancel = False
End If


Voilà une partie de ma fonction

Public Function ValidationChampObligatoire () As Boolean


'Reset error flag
WorksheetAsError = False

Dim lastRow As Integer
Dim lastColumn As Integer
Dim i As Integer
Dim j As Integer
Dim b As Integer
Dim typeAttribut As String
Dim nomAttribut As String
Dim attributObligatoire As Boolean
Dim celluleNonVide As Boolean
Dim DATEMISEENSERVICE As Date
'DATEMISEENSERVICE = Selection.NumberFormat = "yyyy-mm-dd"
'Dim ErreurValidation As Boolean

On Error GoTo ControlError


typeAttribut = ""
nomAttribut = ""
attributObligatoire = False
celluleNonVide = False
lastRow = ActiveWorkbook.Worksheets(2).UsedRange.Rows.Count
lastColumn = ActiveWorkbook.Worksheets(2).UsedRange.Columns.Count


'Pour toute les lignes de chaque colonne appliquer les validations
For j = FIRSTCOLUMN To lastColumn
For i = FIRSTROW To lastRow
'Parcourir toutes les cellules de la ligne pour voir si une cellule est rempli
'si oui appliquer les validations sur les cellules de la lignes
'Ne pas faire cette validation sur la colonne équipement
For b = 3 To lastColumn
If Not IsEmpty(Cells(i, b)) Then
celluleNonVide = True
Exit For
End If
Next b

If celluleNonVide Then
Select Case j
Case COLONNEEQUIPEMENT
If validerEquipement(Cells(i, j)) Then
If validateLength(Cells(i, j), MAXLENGTHEQUIPEMENT, validerEquipement(Cells(i, j)), CHAMPEQUIPEMENT) Then GoTo ControlError
End If
Case COLONNEDESCRIPTION
If validateLength(Cells(i, j), MAXLENGTHDESCRIPTION, False, CHAMPDESCRIPTION) Then GoTo ControlError
Case COLONNEEMPLACEMENT
If validateLength(Cells(i, j), MAXLENGTHEMPLACEMENT, True, CHAMPEMPLACEMENT) Then GoTo ControlError
Case COLONNEPARENT
If validateLength(Cells(i, j), MAXLENGTHPARENT, False, CHAMPPARENT) Then GoTo ControlError
Case COLONNERESPONSABLE
If validateLength(Cells(i, j), MAXLENGTHRESPONSABLE, True, CHAMPRESPONSABLE) Then GoTo ControlError
Case COLONNEDATEMISEENSERVICE
If validateDate(Cells(i, j), DATEMISEENSERVICE, True, CHAMPDATEDEMISEENSERVICE) Then GoTo ControlError
Case COLONNECODEDEPANNE
If validateLength(Cells(i, j), MAXLENGTHCODEPANNE, False, CHAMPCODEDEPANNE) Then GoTo ControlError
'Validation des attributs du modèle de spécifications
Case Else
typeAttribut = validerChampAlphaOuNum(Cells(LIGNETYPEATTRIBUT, j))
nomAttribut = rechercherNomAttribut(Cells(LIGNENOMATTRIBUT, j))
attributObligatoire = validerAttributObligatoire(Cells(LIGNEATTRIBUTOBLIG, j))
If typeAttribut = "Alpha" Then
If validateLength(Cells(i, j), MAXLENGTHATTRIBUTALPHA, attributObligatoire, nomAttribut) Then GoTo ControlError
Else
If validateNumeric(Cells(i, j), MAXLENGTHVATTRIBUTNUM, attributObligatoire, nomAttribut) Then GoTo ControlError
End If
End Select
End If
celluleNonVide = False
Next i
Next j


Exit Function

ControlError:
ValidationChampObligatoire = True
Exit Function

End Function

Merci de votre aide
Nadia
 

Pièces jointes

Re : Workbook_BeforeClose problème

Oui ma fonction retourne une valeur booleene
C'est quoi la différence avec une fonction qui retourne une valeur à true ou
false vs m'a fonction qui est déclaré As Boolean

De plus lorsque le WorksheetAsError est true est-ce qu'il a moyen de dire de ne pas fermer le fichier

If WorksheetAsError = True Then
Cancel = True
ThisWorkbook.Saved = True
Else
Cancel = False
End If


Voilà une partie de ma fonction

Public Function ValidationChampObligatoire () As Boolean


'Reset error flag
WorksheetAsError = False

Dim lastRow As Integer
Dim lastColumn As Integer
Dim i As Integer
Dim j As Integer
Dim b As Integer
Dim typeAttribut As String
Dim nomAttribut As String
Dim attributObligatoire As Boolean
Dim celluleNonVide As Boolean
Dim DATEMISEENSERVICE As Date
'DATEMISEENSERVICE = Selection.NumberFormat = "yyyy-mm-dd"
'Dim ErreurValidation As Boolean

On Error GoTo ControlError


typeAttribut = ""
nomAttribut = ""
attributObligatoire = False
celluleNonVide = False
lastRow = ActiveWorkbook.Worksheets(2).UsedRange.Rows.Count
lastColumn = ActiveWorkbook.Worksheets(2).UsedRange.Columns.Count


'Pour toute les lignes de chaque colonne appliquer les validations
For j = FIRSTCOLUMN To lastColumn
For i = FIRSTROW To lastRow
'Parcourir toutes les cellules de la ligne pour voir si une cellule est rempli
'si oui appliquer les validations sur les cellules de la lignes
'Ne pas faire cette validation sur la colonne équipement
For b = 3 To lastColumn
If Not IsEmpty(Cells(i, b)) Then
celluleNonVide = True
Exit For
End If
Next b

If celluleNonVide Then
Select Case j
Case COLONNEEQUIPEMENT
If validerEquipement(Cells(i, j)) Then
If validateLength(Cells(i, j), MAXLENGTHEQUIPEMENT, validerEquipement(Cells(i, j)), CHAMPEQUIPEMENT) Then GoTo ControlError
End If
Case COLONNEDESCRIPTION
If validateLength(Cells(i, j), MAXLENGTHDESCRIPTION, False, CHAMPDESCRIPTION) Then GoTo ControlError
Case COLONNEEMPLACEMENT
If validateLength(Cells(i, j), MAXLENGTHEMPLACEMENT, True, CHAMPEMPLACEMENT) Then GoTo ControlError
Case COLONNEPARENT
If validateLength(Cells(i, j), MAXLENGTHPARENT, False, CHAMPPARENT) Then GoTo ControlError
Case COLONNERESPONSABLE
If validateLength(Cells(i, j), MAXLENGTHRESPONSABLE, True, CHAMPRESPONSABLE) Then GoTo ControlError
Case COLONNEDATEMISEENSERVICE
If validateDate(Cells(i, j), DATEMISEENSERVICE, True, CHAMPDATEDEMISEENSERVICE) Then GoTo ControlError
Case COLONNECODEDEPANNE
If validateLength(Cells(i, j), MAXLENGTHCODEPANNE, False, CHAMPCODEDEPANNE) Then GoTo ControlError
'Validation des attributs du modèle de spécifications
Case Else
typeAttribut = validerChampAlphaOuNum(Cells(LIGNETYPEATTRIBUT, j))
nomAttribut = rechercherNomAttribut(Cells(LIGNENOMATTRIBUT, j))
attributObligatoire = validerAttributObligatoire(Cells(LIGNEATTRIBUTOBLIG, j))
If typeAttribut = "Alpha" Then
If validateLength(Cells(i, j), MAXLENGTHATTRIBUTALPHA, attributObligatoire, nomAttribut) Then GoTo ControlError
Else
If validateNumeric(Cells(i, j), MAXLENGTHVATTRIBUTNUM, attributObligatoire, nomAttribut) Then GoTo ControlError
End If
End Select
End If
celluleNonVide = False
Next i
Next j


Exit Function

ControlError:
ValidationChampObligatoire = True
Exit Function

End Function

Merci de votre aide
Nadia

Je voulais vous dire que dans mon fichier joint la fonction s'appel
ValidationAvantSauvegarder() et non ValidationChampObligatoire

Merci
 
Re : Workbook_BeforeClose problème

Re, Nadia,

Ton fichier exemple fonctionne comme tu le souhaites chez moi avec la macro ci-desssous.
Code:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
       Dim WorksheetAsError As Boolean
       'Reset
       WorksheetAsError = False
       'Invoke validation
       WorksheetAsError = ValidationAvantSauvegarder()
        If WorksheetAsError = True Then
            Cancel = True
            ThisWorkbook.Saved = True    'tricher en indiquant à excel que le classeur à été sauvegardé.
        Else
            Cancel = False
        End If
End Sub

1 - L'utilisateur veut fermer le fichier
2 - WorksheetAsError = True (Vrai)
Pas de proposition d'enregistrement
Le fichier n'est pas fermé

3 - WorksheetAsError = False (Faux)
Proposition d'enregistrement
Le fichier est fermé.

N'est-ce pas ce que tu souhaites?

Et comme cela fonctionne
ThisWorkbook.Saved = True devient inutile

Réduite à sa plus simple expression ta macro Before_Close devient efficace également comme ci-dessous. Test 100% ok chez moi.
Code:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
       Cancel = ValidationAvantSauvegarder()
End Sub

A+
 
Re : Workbook_BeforeClose problème

Autant pour moi,

utiliser before close uniquement

Private Sub Workbook_BeforeClose(Cancel As Boolean)
If ValidationAvantSauvegarder Then Cancel = True
End Sub

voir fichier joint

Edit:Oups!! désolé Hasco
 

Pièces jointes

Re : Workbook_BeforeClose problème

Re, Nadia,

Ton fichier exemple fonctionne comme tu le souhaites chez moi avec la macro ci-desssous.
Code:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
       Dim WorksheetAsError As Boolean
       'Reset
       WorksheetAsError = False
       'Invoke validation
       WorksheetAsError = ValidationAvantSauvegarder()
        If WorksheetAsError = True Then
            Cancel = True
            ThisWorkbook.Saved = True    'tricher en indiquant à excel que le classeur à été sauvegardé.
        Else
            Cancel = False
        End If
End Sub

1 - L'utilisateur veut fermer le fichier
2 - WorksheetAsError = True (Vrai)
Pas de proposition d'enregistrement
Le fichier n'est pas fermé

3 - WorksheetAsError = False (Faux)
Proposition d'enregistrement
Le fichier est fermé.

N'est-ce pas ce que tu souhaites?

Et comme cela fonctionne
ThisWorkbook.Saved = True devient inutile

Réduite à sa plus simple expression ta macro Before_Close devient efficace également comme ci-dessous. Test 100% ok chez moi.
Code:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
       Cancel = ValidationAvantSauvegarder()
End Sub

A+


Est-ce qu'il se peu que la version d'Excel que j'utilise soit le problème voici ma version Microsoft Excel 2002 SP3
Quel version tu utilise
 
Re : Workbook_BeforeClose problème

Autant pour moi,

utiliser before close uniquement

Private Sub Workbook_BeforeClose(Cancel As Boolean)
If ValidationAvantSauvegarder Then Cancel = True
End Sub

voir fichier joint

Edit:Oups!! désolé Hasco

Ce qui arrive c'est que je dois appliquer aussi cette validation lorsqu'on sauvegarde donc j'ai besoin du ThisWorkbook_BeforeSave..
Ce qui arrive avec votre BeforeClose c'est que si le champ est obligatoire la sauvegarde sera réalisé or il ne faut pas il faut absolument que ce champs soit saisie pour pouvoir fermer le fichier comme lorsqu'on clique sur le save et qu'il appel ma fonction ThisWorkbook_BeforeSave

Merci beaucoup de votre aide
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Assurez vous de marquer un message comme solution pour une meilleure transparence.

Discussions similaires

Retour