VBA : l'instruction Workbook_BeforeClose me crée des soucis

Bonjour,

Dans le fichier ci-joint, il faut compléter des données dans certaines colonnes. Si aucune de ces colonnes n'est complétée, je voudrais en rendre attentif l'utilisateur - lors de la fermeture du fichier - et lui laisser le choix de compléter les données manquantes ou de fermer malgré tout le fichier.

Je m'en sors assez bien avec la partie ''Ne pas fermer le fichier, je vais corriger le problème de suite !'' mais pas du tout pour la partie ''Non, non, il n'y a qu'à fermer ce fichier, je finirai demain !''.

Pouvez-vous m'aider ?

Option Explicit
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Dim i As Integer, Réponse As String

    With Sheets("Feuil2")
        For i = 5 To .Range("A" & Rows.Count).End(xlUp).Row
            If WorksheetFunction.CountIf(.Range("K" & i & ":O" & i), "X") = 0 Then
                Réponse = MsgBox("Au moins pour " & .Range("A" & i) & " " & .Range("B" & i) & " - à la ligne " & i & " - il n'y a aucune indication de présence." & vbNewLine & vbNewLine & "Faut-il vraiment fermer ce fichier ?", vbYesNo)
                Select Case Réponse
                    Case vbYes
                        Cancel = False
                        ActiveWorkbook.Close
                    Case vbNo
                        .Activate
                        Cancel = True
                        Exit Sub
                End Select
            End If
        Next i
    End With

End Sub

Bien à vous.

9demo-30-01.xlsm (25.79 Ko)

Bonjour,

tu n'as pas besoin de faire un Close puisque tu es dedans, tu le laisses se finir :

                    Case vbYes
'                        Cancel = False
'                        ActiveWorkbook.Close
                    Case vbNo

ce qui me gêne plus c'est que tu es dans ta boucle For i = 5 To .Range("A" & Rows.Count).End(xlUp).Row pour ton MsgBox
Tu vas donc le demander autant de fois que de manques.
Comptabilise tes anos dans la boucle, et après le next demande ce qu'il faut faire.
eric

Bonsoir Yvouille,

Essayez le code ci-dessous.

Dans le cas où on referme le classeur, si le classeur a été modifié depuis sa dernière sauvegarde alors on demande à l’utilisateur s'il désire enregistrer les modif. On peut modifier ce comportement pour un enregistrement automatique.

(le parcours de la boucle s'arrête à la première réponse)

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim i As Integer, Réponse As String
With Sheets("Feuil2")
   For i = 5 To .Range("A" & Rows.Count).End(xlUp).Row
      If WorksheetFunction.CountIf(.Range("K" & i & ":O" & i), "X") = 0 Then
         Réponse = MsgBox("Au moins pour " & .Range("A" & i) & " " & .Range("B" & i) _
            & " - à la ligne " & i & " - il n'y a aucune indication de présence." & _
            vbNewLine & vbNewLine & "Faut-il vraiment fermer ce fichier ?", vbYesNo)
         If Réponse = vbNo Then Cancel = True: Exit Sub Else Exit For
      End If
   Next i
End With
End Sub

Salut Eriiic, salut mafraise,

Merci à tous deux pour vos solutions.

@ mafraise

Avec ta solution, ça mouline sur autant de lignes qu'il y a de groupes de colonnes vides ; ça ne m'avance malheureusement pas beaucoup.

@ eriiic

Merci pout ton idée, ça résoud mon problème

Option Explicit
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Dim i As Integer, Réponse As String, Compteur As Integer

    With Sheets("Feuil2")
        For i = 5 To .Range("A" & Rows.Count).End(xlUp).Row
            If WorksheetFunction.CountIf(.Range("K" & i & ":O" & i), "X") = 0 Then Compteur = Compteur + 1
        Next i
        If Compteur > 0 Then
            Réponse = MsgBox("Pour certaines personnes, il n'y a aucune indication de présence." & vbNewLine & vbNewLine & "Faut-il vraiment fermer ce fichier ?", vbYesNo)
                Select Case Réponse
                    Case vbYes
                        ' On laisse aller
                    Case vbNo
                        .Activate
                        Cancel = True
                        Exit Sub
                End Select
        End If
    End With

End Sub

Bonne soirée à vous tous.

2demo-30-01-v2.xlsm (25.61 Ko)

Je suis confus,

J'avais pris un fichier intermédiaire. Celui ci doit le faire.

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim i As Integer, Réponse As String
With Sheets("Feuil2")
   For i = 5 To .Range("A" & Rows.Count).End(xlUp).Row
      If WorksheetFunction.CountIf(.Range("K" & i & ":O" & i), "X") = 0 Then
         Réponse = MsgBox("Au moins pour " & .Range("A" & i) & " " & .Range("B" & i) _
            & " - à la ligne " & i & " - il n'y a aucune indication de présence." & _
            vbNewLine & vbNewLine & "Faut-il vraiment fermer ce fichier ?", vbYesNo)
         If Réponse = vbNo Then Cancel = True: Exit Sub Else Exit For
      End If
   Next i
End With
End Sub

Salut mafraise,

Merci pour ta dernière réponse.

Bonne fin de soirée.

Si un seul manque te suffit, tu pouvais aussi t'abstenir de mettre un compteur faire un Exit For pour VbYes.
eric

Edit : oui, après lecture, ça revient à ce que fait mafraise

Salut Eriiic,

Merci à toi pour ce complément !

Bonne soirée

Rechercher des sujets similaires à "vba instruction workbook beforeclose cree soucis"