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 :

Alimenter Combobox dans Userform avec noms définis variables [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Technico commercial
    Inscrit en
    Juin 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Technico commercial

    Informations forums :
    Inscription : Juin 2014
    Messages : 20
    Par défaut Alimenter Combobox dans Userform avec noms définis variables
    Bonjour,

    Nouvel inscrit sur ce forum, je requiers aujourd'hui votre aide pour un classeur Excel 2010.

    J'ai une feuille1 sur laquelle sont enregistrés en colonne A (à partir de A2) des N° de série (chiffres uniquement) ayant tous une structure identique, à savoir : "XXXXXXXX". Les deux premiers chiffres correspondent à l'année de fabrication d'un article, les deux suivants désignent la famille de l'article et enfin les quatre derniers indiquent le numéro de la série (0000 pour les prototypes, 0001 à 9999 pour les articles vendus).

    Un N° de série "14010123" indique donc que l'article a été fabriqué en 2014, qu'il s'agit d'un aspirateur et que c'est le 123ème de la série.

    Dans une feuille BDDarticles, j'ai répertorié la liste de tous mes articles en 3 colonnes. A=Famille B=code article C=Nom de l'article.

    Dans la famille des aspirateurs ("01") il peut y avoir x articles différents ayant chacun un code article unique (j'ai 54 familles d'articles avec le même fonctionnement soit plus de 160 articles au total répartis entre elles)

    Ainsi, ma feuille BDDarticles ressemble à

    01 5151624 Aspirateur1
    01 1201589 Aspirateur2
    01 0901658 Aspirateur3
    02 1201358 Téléphone1
    02 1201359 Téléphone2
    03 1301569 Téléviseur1
    04 1301274 Téléscope1
    04 1301275 Téléscope2
    04 1301276 Téléscope3
    04 1301277 Téléscope4
    04 1301311 Téléscope5
    04 1301312 Téléscope6

    J'ai défini une plage de nom pour chaque famille d'article "code01", "code02", "code03"... jusqu'à "code54"

    Mon problème est le suivant :

    Via des userforms, je peux créer, modifier ou supprimer des fiches N° de série. Dans le Userfom qui me sert à créer une nouvelle fiche, j'entre dans une textbox le nouveau N° de série d'un article vendu. Dans une combobox, je liste automatiquement les articles qui appartiennent à la famille du N° de série entré (par le nom défini qui correspond) afin de réduire le choix et d'éviter toute erreur de saisie. En soit, tout fonctionne bien.

    J'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Private Sub TextBox1_Change() 'OK
    Dim cdepdt As String
    cdepdt = Mid(TextBox1.Value, 3, 2)
    With Sheets("BDDarticles")
    If cdepdt = "01" Then Me.ComboBox4.RowSource = ("code01")
    'If cdepdt = "02" Then Me.ComboBox4.RowSource = ("code02")
    'If cdepdt = "03" Then Me.ComboBox4.RowSource = ("code03")
    If cdepdt = "04" Then Me.ComboBox4.RowSource = ("code04")
    ...
    If cdepdt = "54" Then Me.ComboBox4.RowSource = ("code54)
    End With
    End Sub
    Vu que le nombre d'article augmente régulièrement, même si le nombre de familles lui reste le même, je suis donc amené à allongé ma liste d'articles et par conséquent à redéfinir le range de cellules du nom défini pour chaque famille.

    Je souhaiterais pouvoir créer un nouvel article automatiquement ajouté au nom défini qui lui correspond, sans avoir à trier la colonne famille, ou l'insérer à la suite du dernier de sa famille. Comment puis-je faire cela de façon dynamique, en spécifiant que si le nouvel article entré a pour famille "01", il fera automatiquement partie du nom défini "code01" et remontera ainsi automatiquement dans la liste de la combobox4 de mon Userform ?

    Enfin, dans un autre Userform qui permet de faire une recherche par N° de série via un combobox, je souhaite lister dans mon combobox uniquement les numéros de série avec pour code famille "01".

    N'hésitez pas à me demander des explications si je n'ai pas été suffisamment clair et d'avance merci pour vos réponses et pour votre aide.

    Aëthan.

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Bonjour,

    Plutôt que de nommer des plages, si tu utilisais des filtres ?

    Voici un exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        Dim nbLignes As Long
     
        'nombre de lignes en colonne A
        nbLignes = Sheets("Feuil1").Cells(Rows.Count, "A").End(xlUp).Row
     
        'enlève les filtres
        Sheets("Feuil1").AutoFilterMode = False
        'filtre la colonne 1 sur le critère 04
        Sheets("Feuil1").Rows(1).AutoFilter Field:=1, Criteria1:="04"
        'Charge le combobox ou le listbox
        Me.ListBox1.List = Sheets("Feuil1").Range("A2:A" & nbLignes).SpecialCells(xlCellTypeVisible).Value
    Change les noms de feuille et de colonne au besoin

  3. #3
    Membre averti
    Homme Profil pro
    Technico commercial
    Inscrit en
    Juin 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Technico commercial

    Informations forums :
    Inscription : Juin 2014
    Messages : 20
    Par défaut
    Parmi,

    Avant toute chose, merci pour ta réponse.

    J'ai appliqué ta méthode, mais j'ai sans doute fait une erreur dans la mesure où quand je lance mon userform et que j'ouvre la combobox, la liste reste complète, sans tri et lorsque je clique sur une ligne, j'obtiens un message d'erreur "Erreur d'exécution '1004' : La méthode AutoFilter de la classe Range a échoué"

    Peut-être l'ai-je inséré au mauvais endroit ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub ComboBox1_Change()
    '[AZ1] = CRecherche.ComboBox1
     Dim nbLignes As Long
        'nombre de lignes en colonne A
        nbLignes = Sheets("BDDarticles").Cells(Rows.Count, "A").End(xlUp).Row
     
        'enlève les filtres
        Sheets("BDDarticles").AutoFilterMode = False
        'filtre la colonne 1 sur le critère 46
        Sheets("BDDarticles").Rows(1).AutoFilter Field:=1, Criteria1:="46"
        'Charge le combobox ou le listbox
        Me.ComboBox1.List = Sheets("BDDarticles").Range("A2:A" & nbLignes).SpecialCells(xlCellTypeVisible).Value
    End Sub
    Merci pour ton aide.

    Aëthan

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Effectivement.
    Si le combobox doit être rempli à l'ouverture du Userform, met le code dans Userform_Initialize
    S'il doit être rempli lors d'une action quelconque, insère-le lors de cette action.

  5. #5
    Membre averti
    Homme Profil pro
    Technico commercial
    Inscrit en
    Juin 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Technico commercial

    Informations forums :
    Inscription : Juin 2014
    Messages : 20
    Par défaut
    Parmi,

    Merci à nouveau.

    J'ai donc suivi ta consigne, mais la combobox1 reste vide. Faut-il remplir le champ rowsource dans ses propriétés ?

    Voici le code complet du userform :

    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
    Private Sub ok_Click()
        Dim Cel As Range, Lig&, i&
        If ComboBox1 <> "" Then
            Set Cel = Feuil1.Range("A2:A" & Feuil1.Range("A" & Rows.Count).End(xlUp).Row).Find(ComboBox1, , , xlWhole)
            If Not Cel Is Nothing Then Lig = Cel.Row Else MsgBox "Aucune correspondance trouvée", , "Pas de Corespondance": Exit Sub
            CSaisir.TextBox11 = Feuil1.Cells(Lig, 1)
            CSaisir.TextBox12 = Feuil1.Cells(Lig, 4)
            CSaisir.TextBox13 = Feuil1.Cells(Lig, 5)
            CSaisir.TextBox14 = Feuil1.Cells(Lig, 6)
            CSaisir.TextBox15 = Feuil1.Cells(Lig, 7)
            CSaisir.TextBox16 = Feuil1.Cells(Lig, 8)
            CSaisir.TextBox17 = Feuil1.Cells(Lig, 10)
            CSaisir.TextBox18 = Feuil1.Cells(Lig, 8)
            CSaisir.TextBox19 = Feuil1.Cells(Lig, 2)
            CSaisir.TextBox20 = Feuil1.Cells(Lig, 3)
            CSaisir.TextBox21 = Feuil1.Cells(Lig, 3) + 729
            CSaisir.TextBox22 = Feuil1.Cells(Lig, 24)
            CSaisir.TextBox23 = Feuil1.Cells(Lig, 25)
            CSaisir.TextBox24 = Feuil1.Cells(Lig, 10)
            CSaisir.TextBox25 = Feuil1.Cells(Lig, 11)
            CSaisir.TextBox26 = Feuil1.Cells(Lig, 12)
            CSaisir.TextBox27 = Feuil1.Cells(Lig, 13)
            CSaisir.TextBox28 = Feuil1.Cells(Lig, 14)
            CSaisir.TextBox29 = Feuil1.Cells(Lig, 15)
            CSaisir.TextBox30 = Feuil1.Cells(Lig, 16)
            CSaisir.Show
        End If
    End Sub
     
    Private Sub RetourAccueil_Click()
        Accueil.Show
    End Sub
     
    Private Sub CRecherche_Initialize()
     Dim nbLignes As Long
        'nombre de lignes en colonne A
        nbLignes = Sheets("Recap").Cells(Rows.Count, "A").End(xlUp).Row
         'enlève les filtres
        Sheets("Recap").AutoFilterMode = False
        'filtre la colonne 1 sur le critère 46
        Sheets("Recap").Rows(1).AutoFilter Field:=1, Criteria1:="46"
        'Charge le combobox ou le listbox
        Me.ComboBox1.List = Sheets("Recap").Range("A2:A" & nbLignes).SpecialCells(xlCellTypeVisible).Value
    End Sub
    et un screenshot de celui ci avec la combobox1 sélectionnée.

    Nom : Crecherche_userform.jpg
Affichages : 3274
Taille : 382,8 Ko

    Enfin, un screenshot de la feuille Recap avec un fragment de la liste des N° de série en colonne A

    Nom : Feuille_Recap.jpg
Affichages : 3252
Taille : 307,0 Ko

    Peux-tu me dire si j'ai loupé quelque chose ? d'avance merci pour ton temps et tes réponses.

    Aëthan.

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Dans Initialize, tu recherches 46 comme valeur de filtre, mais ta colonne contient des nombres (en texte...) de 8 caractères.
    Dans ton premier message, tu disais que tu avais séparé ces nombres en parties. Ce serait sur ces parties qu'il faudrait exercer le filtre.
    46 ne sera pas trouvé dans 14460232. En fait il pourrait être trouvé en bouclant mais pas en filtrant... Si tu filtres en utilisant "contient 46", il te trouvera tous les nombres qui contiennent ce nombre, que ce soit au milieu ou à la fin.

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

Discussions similaires

  1. [XL-2010] liste déroulante dans userform avec les noms des feuilles
    Par sk8hunter dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 03/07/2015, 00h28
  2. [XL-2010] Nom change mais pas la photo dans userform avec scrollbar
    Par gilt83 dans le forum Macros et VBA Excel
    Réponses: 28
    Dernier message: 19/05/2014, 19h45
  3. [XL-2003] Pb avec les valeurs sortantes COmbobox dans Userform
    Par FrankCF dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 06/08/2011, 17h45
  4. Get avec nom de variable
    Par sam01 dans le forum Administration système
    Réponses: 1
    Dernier message: 29/01/2008, 18h38
  5. (VBA-E) Problème combobox dans userform
    Par gringo69 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 27/06/2006, 18h28

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