XL 2010 Menu déroulant conditionnel

Sebcri

XLDnaute Nouveau
Bonjour
J'ai récupéré une bdd de l'insee avec les 36000 communes
Je souhaiterai, en saisissant un département dans une cellule, avoir dans la cellule à côté, un menu déroulant avec les villes uniquement de ce département (cf PJ)
Possible ?
Merci de votre aide
 

Pièces jointes

  • INSEE.xlsx
    25 KB · Affichages: 9

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Voici une solution par vba sav SAV (le code est largement commenté ). A vous d'apprendre et adapter.
La macro se déclenche sur changement de valeur des cellule C10 à C100
Le fichier doit être enregistré au moins une fois.

Si la fonction CommunesParNumDepartement ne trouve pas de commune, elle renverra en liste de validation : "Communes non trouvées"


Dans le code de la feuille Feuil2 vous trouverez
VB:
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

Et dans le module 'module1' :
Code:
Function CommunesParNumDepartement(NumDep As Integer) As Variant
    '
    ' Fonction permettant de retourner la liste des communes
    ' filtrées par Numéro du département
    '
    Dim cnx As Object, rst As Object
    Set cnx = CreateObject("adodb.connection")
    '
    ' Connexion au classeur lui-même (doit être enregistré sur disque dur)
    '
    cnx.connectionstring = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
                & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0 Xml;HDR=YES"";"
    cnx.cursorlocation = 3
    cnx.Open
    '
    ' interrogation de la table de données
    '
    Set rst = cnx.Execute("SELECT Nom_commune FROM [BDD$] WHERE Departement = " & NumDep & " ORDER BY Nom_commune;")
    '
    ' si quelque chose a été trouvé
    ' retourner le résultat sous formue de tableau
    '
    If Not rst.Bof And Not rst.EOF Then CommunesParNumDepartement = Split(rst.getstring(), vbCr)
    '
    ' fermer et nettoyer proprement les objets
    '
    rst.Close: Set rst = Nothing
    cnx.Close: Set cnx = Nothing
End Function

Cordialement
 

Pièces jointes

  • INSEE Validation liste.xlsm
    38.2 KB · Affichages: 9

hallfabi

XLDnaute Nouveau
Bonjour et bravo,

J'ai trouvé votre solution sur le forum. Je pense que c'est la base dont j'ai besoin pour faire mon tableau.

Je ne sais pas si il vaut mieux ouvrir un nouveau topic ou si le lien avec la discussion en cours fait sens.

Ce que je cherche à faire c'est la même chose: liste déroulante issu d'un tableau, avec en plus:

* je vais devoir remplacer les numéros de départements par un nom de client.
* comme je voudrais faire un tableau pour une analyse via tableau croisé, je voudrais que le champ (c10:C100) dans votre exemple soit remplacé par la colonne clien du tableau "Ventes". Ainsi le champ s'allongera avec le tableau.
* dernière amélioration, j'aurais voulu que la colonne client du tableau BDD servent également de base à l a liste déroulante de mon tableau, mais sans l'apparition des doublons. Avec si possible une liste évolutive qui se réduise au fur et à mesure que l'on tape le début du nom.

J'ai préparé un fichier pour alimenter ma demande. Je vous le mets en pièce jointe.
Merci d'avance pour votre réponse

Fabien
 

Pièces jointes

  • liste déroulante condi-tableau.xlsx
    17.3 KB · Affichages: 6

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

. Chaque situation étant unique, il serait préférable d'ouvrir votre propre fil de discussion.
c'est la même chose ... avec en plus:
Ce n'est donc pas la même chose. :)

De plus dans cette discussion j'ai employé une technique (ADODB) parce que le demandeur a excel 2010, avec un excel >= 2016 j'aurais employé sans doute Power Query.

Suivant la version excel du demandeur (que vous voudrez bien préciser ) : Ce n'est donc pas la même chose. :)

De plus il existe une multitude de gens qui peuvent vous répondre et qui ne viendront pas voir ici parce qu'ils n'ont pas participé, vous pourriez perdre en qualité.... Et vous ne verriez pas que : Ce n'est pas la même chose.


Cordialement
 

hallfabi

XLDnaute Nouveau
Merci @Roblochon ,

J'apprécie cette remarque, car dans les forums on est souvent invité à contrôler que la question n'aie pas déjà été posée, pour éviter de le surcharger avec des questions déjà résolues. De ce fait, j'étais un peu frileux à démarrer une nouvelle discussion.

Mais tes arguments sont convaincants, j'ai donc posté une nouvelle discussion.

Salutations
Fabien
 

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,
on est souvent invité à contrôler que la question n'aie pas déjà été posée
C'est ici aussi, le cas. Mais la raison en est que le demandeur, doit d'abord explorer les solutions proposées (ce que vous avez fait en tombant sur cette discussion), essayer de les adapter à sa situation et revenir avec les problèmes qu'il rencontre dans l'application des solutions à son problème.

Cordialement
 

Discussions similaires

Statistiques des forums

Discussions
315 106
Messages
2 116 271
Membres
112 706
dernier inscrit
Pierre_98