Bonjour,
Mon responsable a eu un soucis de boucle infini sur un de mes fichiers. Le message de confirmation de sauvegarde ce fesait en boucle (si on choisissait la réponse Yes).
La macro en cause:
Cependant je n'ai pas réussi a reproduire le problème, et je ne comprends pas comment une boucle infini peut être possible avec ce code.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) 'se lance automatiquement avant la sauvegarde 'vérifie que tous les controles sont bon 'on change la valeur du controle maitre suivant le résultat 'si il y a un pb, on demande la confirmation de la sauvegarde Dim sh As Worksheet, msg As String msg = "" For Each sh In ThisWorkbook.Sheets If verif2(sh) Then msg = msg & "Attention les contrôles de la feuille " & sh.Name & " ne sont pas bons" & Chr(10) Next sh If Len(msg) > 1 Then Range("ctrlM") = "pb" MsgBox msg Select Case MsgBox("Voulez vous vraiment sauvegarder?", vbYesNo, "Problème(s) détécté(s)") Case vbYes 'procédure si click sur Oui Case vbNo 'procédure si click sur Non Cancel = True End Select Else Range("ctrlM") = "ok" End If End Sub
Si quelqu'un voit une possible boucle infinie dans ce code, je veux bien qu'on m'explique.
Merci d'avance.
ps: si besoin le code de verif2
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 Function verif2(sh As Worksheet) As Boolean 'Utilisée dans le BeforeSave, et par la sub test_par_feuille2 'Vérifie sur la feuille passée en paramètre que les controles sont ok. 'Renvoie vrai si non. Dim test As Boolean Dim pln As Name Dim cell As Range, ct As Long test = False For Each pln In ThisWorkbook.Names If pln.Name = "ctrl_" & sh.Index Then 'recherche la plage correspondante a la feuille ct = 0 For Each cell In Range("ctrl_" & sh.Index) 'on compte le nombre de cellules "ok" If cell.Text = "ok" Then ct = ct + 1 Next cell 'on le compare avec le nombre de cellules de la plage If Not (ct = Range("ctrl_" & sh.Index).Count) Then test = True End If Next pln verif2 = test End Function
Partager