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 :

Insertion conditionnée de listes déroulantes par validation [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Février 2017
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : Finance

    Informations forums :
    Inscription : Février 2017
    Messages : 59
    Points : 58
    Points
    58
    Par défaut Insertion conditionnée de listes déroulantes par validation
    Bonjour,
    Je suis toujours sur mon formulaire sur feuille Excel. Je m'échine à essayer d'y insérer ou non des listes déroulantes différentes selon la valeur d'une autre liste déroulante.Cela doit s'effectuer à 6 reprises dans la feuille. J'ai opté (à tort ???) pour la boucle For .. Each après avoir nommé les arguments de la 1ère liste (SitFam). Le code fonctionne pour le 1er nom trouvé puis ... plus rien, car à priori la variable Sit (=range("SitFam")) conserve la première valeur choisie. De plus, il semble que mon code ne teste pas toutes les cellules nommées "SitFam".
    Ou est l'erreur ? En vous remerciant par avvance.


    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
    Option Explicit
     
     
    Private Sub Worksheet_Change(ByVal Target As Range)
     
    Dim SitFam As String
    Dim ligne As Integer
    Dim Sit As Variant
     
     
    Application.EnableEvents = False
     
    ligne = Range("SitFam").Row
    'Sit = Range("SitFam").Value
     
    MsgBox Sit
     
    For Each Sit In Sheets("Formulaire").Range("SitFam")
     
    Set Sit = Range("SitFam")
    MsgBox Sit 'pour vérifier la valeur de Sit
     
    If Sit Is Nothing Then Exit For
     
        If Sit = "Marié(e)*" Then
           Call Module2.InsérerListeMariage
        Else
            If Sit = "Pacs*" Then
               Call Module2.InsérerListePACS
            Else
              Call Module2.SupprimerListeDéroulante
            End If
        End If
     
    Sit = ""
     
    Next
     
    Application.EnableEvents = True
     
    End Sub

  2. #2
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 240
    Points : 5 655
    Points
    5 655
    Par défaut
    Bonjour,

    Au premier coup d’œil, quelque chose m'interpelle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        For Each Sit In Sheets("Formulaire").Range("SitFam")
    Range("SitFam"), ici , on attend une plage à tester exemple: range("B2:B1000").

    CDlt

  3. #3
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Citation Envoyé par ncl98 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim SitFam As String
    Dim Sit As Variant
     
    For Each Sit In Sheets("Formulaire").Range("SitFam")
     
    Set Sit = Range("SitFam")
    Ces éléments sont incohérents.

    C'est le For Each qui donne sa valeur à Sit, il est inutile de faire un Set juste après.

    Le For Each tel qu'il est écrit pourrait fonctionner si "SitFam" est le nom d'une plage de cellules nommées dans ta feuille.
    Mais dans ce cas, que vient faire là cette déclaration d'une variable du même nom de type String ?
    Si "SitFam" n'est pas un nom de plage mais une variable string dans laquelle tu veux mettre les références de la plage à scruter, alors il faut la renseigner avant le For Each (par exemple SitFam = "A1:A9") et ne pas mettre de guillemets pour la désigner dans le Range.

    De plus, pourquoi déclarer Sit comme Variant alors qu'il serait plus propre de la déclarer comme Range ?
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  4. #4
    Membre du Club
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Février 2017
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : Finance

    Informations forums :
    Inscription : Février 2017
    Messages : 59
    Points : 58
    Points
    58
    Par défaut
    Désolé mais la déclaration de la variable SitFam est un "reste" d'une précédente version du code. "SitFam" est le nom de 6 cellules non contigües dans la feuille "Formulaire".
    Le code est ainsi écrit aujourd'hui car de multiples versions ont été testées sans résultat satisfaisant, et ce, malgré de très nombreuses recherches sur divers forum. J'ai tenté d'intégrer vos suggestions mais cela reste infructueux. J'avoue être à court d'idée.
    Encore merci.

  5. #5
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 240
    Points : 5 655
    Points
    5 655
    Par défaut
    Essayez ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       Set SitFam = Range("B2:B1000") 'mettez votre plage
        For Each Sit In SitFam

  6. #6
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Citation Envoyé par ncl98 Voir le message
    J'ai tenté d'intégrer vos suggestions mais cela reste infructueux. J'avoue être à court d'idée.
    Il faudrait que tu montres le code résultant de ces modifications pour pouvoir te dire ce qui ne va pas.

    De plus "cela reste infructueux", ça n'est pas très parlant comme description de dysfonctionnement.
    Résultat erroné ? Quelle est la différence avec ce qui est souhaité ?
    Bug ? Quel est le message d'erreur ?
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  7. #7
    Membre du Club
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Février 2017
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : Finance

    Informations forums :
    Inscription : Février 2017
    Messages : 59
    Points : 58
    Points
    58
    Par défaut
    Avec la proposition d'ARTURO83 (post 5) apparait le message d'erreur
    La méthode Range de l'objet worksheet a échoué
    sur la ligne de code Set SitFam = Range("B7;B11").

    Quant à tes aménagements, après quelques tâtonnements, cela semble fonctionner. Je m'en assurerai demain au bureau, en grandeur nature, et vous tiendrai au courant.

  8. #8
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 240
    Points : 5 655
    Points
    5 655
    Par défaut
    ATTENTION à l'écriture Range("B7:B11") entre les 2 adresses, c'est 2 points ":" et non point virgule ";"

  9. #9
    Membre du Club
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Février 2017
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : Finance

    Informations forums :
    Inscription : Février 2017
    Messages : 59
    Points : 58
    Points
    58
    Par défaut
    Bonjour Menhir, bonjour ARTURO83
    Çà y est, le code fonctionne grâce à vous. Le dysfonctionnement provenait :
    1/ de la déclaration erronée des variables "Sit" et "SitFam"
    2/ des cellules nommées "SitFam" qui ne font pas partie d'une plage mais sont non contigüe dans la feuille "Formulaire".
    Sans parler des incohérences que j'ai écrites !
    Un GRAND MERCI à vous.

    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
    Option Explicit
     
    Private Sub Worksheet_Change(ByVal Target As Range)
     
    Dim SitFam As Range
    Dim Sit As Range
     
     
    Application.EnableEvents = False
     
     
    For Each Sit In Sheets("Formulaire").Range("SitFam")
     
    MsgBox Sit 'pour vérifier la valeur de Sit
     
    If Sit Is Nothing Then Exit For
     
        If Sit = "Marié(e)*" Then
           Call Module2.InsérerListeMariage
        Else
            If Sit = "Pacs*" Then
               Call Module2.InsérerListePACS
            Else
              Call Module2.SupprimerListeDéroulante
            End If
        End If
     
    Next
     
    Application.EnableEvents = True
     
    End Sub

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 26/02/2007, 00h04
  2. Liste déroulante par défaut (table Mysql)
    Par Nyutom dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 24/10/2006, 16h25
  3. liste déroulante par defaut
    Par splouf dans le forum Langage
    Réponses: 4
    Dernier message: 01/02/2006, 14h35
  4. Réponses: 8
    Dernier message: 28/11/2005, 14h41
  5. Réponses: 1
    Dernier message: 28/09/2005, 18h10

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