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