Private Sub Worksheet_Change(ByVal Target As Range)
    '
    ' Variable qui contiendra soit la liste des communes soit "Communes non trouvées"
    Dim liste As Variant
    '
    '  La cellule doit être dans la plage C10:C100 ( à adapter )
    If Target.Count = 1 And Not Intersect(Target, Range("C10:C100")) Is Nothing Then
        '
        ' Son type doit être un numérique (les valeurs numériques pour excel sont en type Double)
        If TypeName(Target.Value) = "Double" Then
            '
            ' Appel à la fonction pour obtenir la liste
            liste = CommunesParNumDepartement(CInt(Target.Value))
            '
            ' Travailler sur la celllule à droite de la cellule qui a changé
            With Target.Offset(, 1)
                '
                ' Si la fonction a retourné un tableau
                If IsArray(liste) Then
                    '
                    ' Ajouter l'item "Choisir une commune en fin de liste"
                    liste(UBound(liste)) = "Choisir une commune"
                    '
                    ' Transformer la liste en chaîne de caractères
                    ' dont chaque nom de commune sera séparé par une virgule
                    ' pour la liste de validation
                    liste = Join(liste, ",")
                Else
                    '
                    ' Si la liste n'est pas un tableau elle devient :
                    liste = "Communes non trouvées"
                End If
                '
                ' Sélection et valorisation de la cellule
                .Select
                .Value = Empty
                '
                ' suppression de validation existante, création de la nouvelle
                With .Validation
                    .Delete
                    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
                         Operator:=xlBetween, Formula1:=liste
                End With
            End With
        End If
    End If
End Sub