IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Créer une liste déroulante par VBA [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 84
    Points : 35
    Points
    35
    Par défaut Créer une liste déroulante par VBA
    Bonjour à tous

    Connaissant un peu le VBA pour avoir travaillé sur Access, je débute en Excel, et ai encore quelques difficultés.

    J'aimerai par exemple savoir s'il était possible d'insérer une liste déroulante dans une cellule à l'aide du VBA. J'ai cherché sur les différentes rubriques de la FAQ, mais j'ai l'impression que personne ne parle de les créer par du code. J'ai fini par trouver comment les créer avec "Données/Validation", mais le problème est que je ne sais pas à l'avance combien de listes seront nécessaires. Je voudrai donc les créer dynamiquement, pour qu'il y en ait autant qu'il y a d'éléments dans ces listes. Comment faire ? Est-ce seulement possible ?

    Merci d'avance

    .

  2. #2
    Membre chevronné Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Points : 2 168
    Points
    2 168
    Par défaut
    Oui c'est possible.

    Pour créer une validation
    Bon vu que tu n'as pas précisé (ou du moin je n'ai pas compris si ce sont les zones ou tu veux mettre la liste qui varie ou le nombre d'élément)
    Mais regarde le code de l'enregistreur de macro

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        With Range("A1").Validation
            .Delete
            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
            xlBetween, Formula1:="=$C$30:C$35"
            .IgnoreBlank = True
            .InCellDropdown = True
            .InputTitle = ""
            .ErrorTitle = ""
            .InputMessage = ""
            .ErrorMessage = ""
            .ShowInput = True
            .ShowError = True
        End With
    Tu peut sans problème utiliser la concaténation de chaine de caractère pour modifier les adresse
    par exemple
    Ou pour la formule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     Formula1:="=C" &  ldeb & ":C" & lfin

    Voila j'espère que ca t'aidera sinon il faudrait peut être préciser ta demande (en tout cas pour que je puisse répondre il le faudrait )

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 84
    Points : 35
    Points
    35
    Par défaut
    Ca m'aide déjà beaucoup

    Pour répondre à ta question, ce que je veux faire exactement, c'est avoir une feuille qui me sert de base de données, avec une liste d'enregistrements, et, dans une autre feuille, insérer autant de liste que de nombre d'enregistrements, contenant chacune tous ces enregistrements. (fiou...)


    Dis, tu pourrais m'expliquer un peu le code que tu m'as mis ? (et qui fonctionne, je t'en remercie )
    à quoi servent "alertstyle" ? "operator" ?


    Et comment vérifier le type d'une cellule ? J'ai mis ma fonction de remplissage sur la méthode "selection_change", ce qui fait que ça ne marche qu'une fois, après ça plante parce que, je crois, je demande d'ajouter une liste là où elle existe déjà.
    Je sais tester le contenu d'une cellule, mais pas son type


    Edit : Aaaaah, c'est donc à ça que servait le delete...
    Désolée ^^'


    .

  4. #4
    Membre chevronné Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Points : 2 168
    Points
    2 168
    Par défaut
    Utilise l'aide F1 ca sera bien mieux que ce que je pourrais te donner
    Place ton curseur sur un mot clef et appuie sur F1

    Par exemple place ton curseur sur Add appui sur F1 et sélectionne Méthode tel quelle s'applique à l'objet Validation


    Et comment vérifier le type d'une cellule ? J'ai mis ma fonction de remplissage sur la méthode "selection_change", ce qui fait que ça ne marche qu'une fois, après ça plante parce que, je crois, je demande d'ajouter une liste là où elle existe déjà.
    Je sais tester le contenu d'une cellule, mais pas son type
    J'ai du mal a te comprendre la je ne peux pas savoir a ta place comment déclencher ce code, chez moi c'est un bouton qui le déclenche au moment ou j'initialise la feuille mais ca change d'un fois a l'autre.

    Tu peux sans problème affecter deu foix de suite ce code le .delete est la pour ca (enfin je crois, chez moi ca na jamais posé de problème)

    Par contre il faut que la liste soit sur le même onglet et ca je ne sais pas comment le contourner (comme j'ai bcp de cellule coloré et que le classeur est protégé j'écris la liste de la même couleur que le fond dans des cellule inutilisé mais ca fait un peu brouillon, on doit pouvoir faire mieu)


    Pour vérifier le type de cellule si j'ai bien compris tu parle du contenue je en connais que
    utilise l'aide F1 pour voir comment t'en servir et regarde si tu peux en trouver d'autre dans la partie "voir aussi"

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 84
    Points : 35
    Points
    35
    Par défaut
    J'ai du mal a te comprendre la je ne peux pas savoir a ta place comment déclencher ce code, chez moi c'est un bouton qui le déclenche au moment ou j'initialise la feuille mais ca change d'un fois a l'autre.

    Tu peux sans problème affecter deu foix de suite ce code le .delete est la pour ca (enfin je crois, chez moi ca na jamais posé de problème)

    En effet, c'est pour ça que j'ai édité mon message. Le delete résoud effectivement mon problème .




    Par contre il faut que la liste soit sur le même onglet et ca je ne sais pas comment le contourner (comme j'ai bcp de cellule coloré et que le classeur est protégé j'écris la liste de la même couleur que le fond dans des cellule inutilisé mais ca fait un peu brouillon, on doit pouvoir faire mieu)
    Ah, personnellement j'ai trouvé comment faire , je peux t'expliquer, si tu veux. Il suffit de nommer la plage qui sert de source à ta liste. Ensuite, sur ton deuxième onglet (celui qui contient la liste, donc), au lieu de mettre un ensemble de cellules comme source, il suffit de mettre = puis le nom que tu as donné à ta plage.



    Pour vérifier le type de cellule si j'ai bien compris tu parle du contenue je en connais que
    Justement non, je ne parlais pas du contenu, mais de savoir, par exemple, si c'est une cellule normale, ou une liste déroulante.


    .

  6. #6
    Membre chevronné Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Points : 2 168
    Points
    2 168
    Par défaut
    Merci pour le coup de la plage nommé, je connaissais le truc pour d'autre fonction mais je n'ai jamais fait le lien
    Je vais essayer de regarder si il est possible de tester si une cellule a une validation. Je te tiens au courant

  7. #7
    Expert éminent
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Points : 6 699
    Points
    6 699
    Par défaut
    Bonjour,

    pour le test, une possibilité (on teste la cellule active ici):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub Test()
    If Intersect(ActiveCell, ActiveSheet.Cells.SpecialCells(xlCellTypeAllValidation)) Is Nothing Then MsgBox "NON" Else MsgBox "OUI"
    End Sub
    cordialement,

    Didier

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 84
    Points : 35
    Points
    35
    Par défaut
    Merci pour cet exemple =)

    Juste par curiosité, quelles autres valeurs peut-on mettre à la place de Nothing ?

    Ou, plus exactement, comment fonctionne ce code ?
    Ici on teste une intersection entre la cellule active, et ... toutes les cellules spéciales, c'est ça ? qu'est-ce que xlCellTypeAllValidation ?

  9. #9
    Expert éminent
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Points : 6 699
    Points
    6 699
    Par défaut
    Bonjour,

    comment fonctionne ce code ?
    Ici on teste une intersection entre la cellule active, et ... toutes les cellules spéciales, c'est ça ? qu'est-ce que xlCellTypeAllValidation ?
    Oui et xlCellTypeAllValidation permet d'indiquer le type choisi cf plus bas...

    De façon explicite, on écrirait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub Test()
    If Intersect(ActiveCell, ActiveSheet.Cells.SpecialCells(xlCellTypeAllValidation)) Is Nothing = True Then MsgBox "NON" Else MsgBox "OUI"
    End Sub
    (ou False en inversant les msgbox)

    En gros :

    Nothing n’est pas une « valeur », c’est un mot clef qui concerne un objet non défini


    Dans la fenêtre exécution de vba avec en cellule active une validation de données, exécute ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ? Intersect(ActiveCell, ActiveSheet.Cells.SpecialCells(xlCellTypeAllValidation)).Address
    Active une cellule vierge et exécute la même ligne en regardant le message d’erreur..

    Le meilleur support en dehors de developpez.com est l’aide vba

    Cf aide vba :
    Intersect te retourne un objet range qui peut être une plage continue ou non.
    Nothing concerne une variable objet non définie (cf message d’erreur ci-dessus…)
    Is compare 2 variables objets justement.
    SpecialCells clique sur XlCellType dans le texte pour comprendre xlCellTypeAllValidation and C°

    Pour finir dans la fenêtre exécution fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Intersect(ActiveSheet.Cells, ActiveSheet.Cells.SpecialCells(xlCellTypeAllValidation)).select
    ça ressemble furieusement à Editon/atteindre …..

    bon WE,

    Didier

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2007] Créer une liste déroulante dans une cellule avec vba
    Par destroyed dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 10/07/2014, 09h19
  2. Réponses: 5
    Dernier message: 21/06/2012, 14h22
  3. Réponses: 3
    Dernier message: 06/05/2011, 11h30
  4. Réponses: 4
    Dernier message: 01/11/2008, 09h41
  5. Réponses: 4
    Dernier message: 16/06/2005, 15h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo