Bonjour à tous et merci de votre temps.

Attention, je débute en VBA Excel.

J'ai un classeur Excel (env 10 feuilles) enrichi avec du VBA pour créer une interface utilisateur plus sympa.

Dans l'une de mes feuilles j'offre à l'utilisateur la possibilité de choisir un niveau de groupe et dans la colonne d'aprés une liste de groupes en fonction du niveau.

J'ai utilisée la fonction de validation de contenu d'une cellule pour offrir une liste déroulante de choix. Cette liste est modifier par VBA. La source de validation est une zone nommée, parmis 4, qui est définie dans une autre feuille.

Ici le code qui fait cela, la partie en gras indique la fonction qui plante.

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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
Private Sub AssignerListeGroupe(prmCell As Range)
    Application.Volatile: 'Force Excel à recaclcuer les célulles qui utilise cette procédure
    Dim nomListe As String
    
    Select Case prmCell
        Case "I"
            nomListe = "ListeGroupeInitiation"
            
        Case "R"
            nomListe = "ListeGroupeRecreation"
            
        Case "C"
            nomListe = "ListeGroupeCompetition"
            
        Case "P"
            nomListe = "ListeGroupePerfectionnement"
            
        Case ""
            Call DesassignerUneListeDeValidation(Cells(prmCell.Row, DONNEES_COLONNE_GROUPE))
            Cells(prmCell.Row, DONNEES_COLONNE_GROUPE).ClearContents
            
        Case Else
            MsgBox "Le niveau ne peut être que I, R, C ou P", vbCritical
    End Select
    
    If nomListe <> "" Then
        Call AssignerUneListeDeValidation(Cells(prmCell.Row, DONNEES_COLONNE_GROUPE), nomListe)
    End If
    
End Sub

Public Sub DeprotegerFeuille()
    Me.Unprotect
End Sub

Public Sub ProtegerFeuille()
    Call Me.Protect(contents:=True, _
                    AllowInsertingRows:=True, _
                    AllowDeletingRows:=True, _
                    AllowSorting:=True, _
                    AllowFiltering:=True)
End Sub

Private Sub AssignerUneListeDeValidation(prmCell As Range, prmNomListeValidation As String)
    Call DeprotegerFeuille
    
    With prmCell.Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
             Operator:=xlBetween, Formula1:="=" & prmNomListeValidation
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = "Erreur"
        .InputMessage = ""
        .ErrorMessage = "Seules les valeurs affichées dans la liste sont acceptées."
        .ShowInput = True
        .ShowError = True
    End With

    Call ProtegerFeuille
End Sub

Private Sub DesassignerUneListeDeValidation(prmCell As Range)

    With prmCell.Validation
        .Delete
    End With

End Sub
Ce code fonctionne trés bien une ou deux fois puis plante avec une erreur système grave provoquant l'offre de récupération du classeur.

Je suis en Excel 2002 SP3.

Si quelqu'un a une idée de la cause du problème ou connait une méthode pour obtenir le même résultat sans VBA, je suis interessé.