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 !
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
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
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
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.
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.
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
'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
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
'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
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
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
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
- 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.