Appel d'une procédure événementiel Combobox

YaGo

XLDnaute Junior
Bonjour à tous!

Je suis nouveau dans tout ce qui est programmation en VBA dans excel, je m'excuse d'avance si mes propos ne sont pas assez clair ou ma question trop "simpliste" au vu de mes connaissances assez limitées dans ce domaine...

Pouvez-vous m'indiquer la procédure à suivre ou me rediriger vers un poste traitant cette thématique. Je souhaite pouvoir intégrer les valeurs de la table Array (présente dans le code précédent) dans mon combobox pour seulement les Activity lors de l'initialisation de celui-ci.

Ci-dessous le code réalisé pour la table Array et la procédure d'initialisation:

Code:
Type DataBase
  Activity As String
  Section As String
  DesEn As String
End Type

    Dim TabDB() As DataBase
    Dim LastRow As Integer, LastColumn As Integer, Row As Integer, Column As Integer

Sub TableDataBase()
    Dim TabAffiche As Variant

    LastRow = Sheets("Tableau").Range("A6").End(xlDown).Row 'Dernière ligne de la base de données
    LastRow = LastRow - 6
    
    ReDim TabDB(LastRow) 'Redimensionnement du tableau en cas de nouvelles valeurs clèes
 
    'Enregistrement des valeurs dans le tableau
    For Row = 0 To LastRow
            TabDB(Row).Activity = Sheets("Tableau").Cells(Row + 6, Column + 1)
            TabDB(Row).Section = Sheets("Tableau").Cells(Row + 6, Column + 2)
            TabDB(Row).DesEn = Sheets("Tableau").Cells(Row + 6, Column + 5)
    Next
    
    CallByName CollectData, UserForm_Initialize, VbMethod, TabDB
End Sub

Code:
Private Sub UserForm_Initialize(TabDB() As DataBase)

    ListSection.AddItem (TabDB(1).Activity)

End Sub

N'hésitez pas à me contacter pour tout renseignement complémentaire.
Je vous en remercie par avance,
Cordialement,

Ya-Go
 
Dernière édition:

vgendron

XLDnaute Barbatruc
Re : Appel d'une procédure événementiel Combobox

Bonjour Ya go.. et bienvenu

tout d'abord, il est d'usage de poster un fichier en guise d'exemple avec quelques data (non confidentielles) pour avoir une vision claire de la structure de ton projet,

ensuite, dans ton code, je vois que tu déclares des variables Row et Column en tant qu'integer. c'est bien. sauf que ces noms de variables sont AUSSI des mots réservés de VBA.. moins bien: à revoir donc

ensuite.. ces deux lignes
Code:
LastRow = Sheets("Tableau").Range("A6").End(xlDown).Row 'Dernière ligne de la base de données
    LastRow = LastRow - 6

peuvent n'en faire qu'une..
Code:
LastRow = Sheets("Tableau").Range("A6").End(xlDown).Row-6 'Dernière ligne de la base de données

dans l'attente de ton fichier
 

Paf

XLDnaute Barbatruc
Re : Appel d'une procédure événementiel Combobox

Bonjour YaGo et Bonjour vgendron

Une solution :

Dans l'USF:

Code:
Private Sub UserForm_Initialize()
 Dim i As Long
 For i = LBound(TabDB) To UBound(TabDB)
    ComboBox1.AddItem TabDB(i).Activity
 Next

End Sub

Nécessite la déclaration de Public TabDB() As DataBase

Dans Sub TableDataBase(), CallByName CollectData, UserForm_Initialize, VbMethod, TabDB à remplacer par un simple : UserForm1.Show

A+
 

YaGo

XLDnaute Junior
Re : Appel d'une procédure événementiel Combobox

Bonjour Paf!
Merci pour ta réponse! cela marche parfaitement!

J'aurais sans doute à vous faire part d'autre problème au cours de la réalisation de mon projet.

Bonne journée :)

Ya-Go
 

Paf

XLDnaute Barbatruc
Re : Appel d'une procédure événementiel Combobox

Re,

par rapport à mon précédent message:

Dans Sub TableDataBase(), remplacer UserForm1.Show par CollectData.Show

et dans Private Sub UserForm_Initialize() remplacer ComboBox1 par ListSection

A+
 

YaGo

XLDnaute Junior
Re : Appel d'une procédure événementiel Combobox

Rebonjour,

Je me permet de revenir vers vous car je n'arrive pas à sélectionner seulement les valeurs uniques (supprimer les doublons et des valeurs sans caractère) présent dans mon tableau de base puis à les copier dans un autre tableau qui sera utilisé pour le ComboBox.

J'ai réalisé ce codage avec la fonction dictionnaire mais celui-ci ne marche pas...

Code:
Private Sub UserForm_Initialize()
    
    Dim i As Integer
    Dim TabNoDp() As DataBase 'tableau sans doublon
    Set MonDico = CreateObject("Scripting.Dictionary")
    For i = LBound(TabDB) To UBound(TabDB)
        If Not MonDico.Exists(TabDB(i).Activity) Then 'si la donnée n'existe pas encore dans le dictionnaire, on l'ajoute dans celui-ci
            MonDico.Add TabDB(i).Activity
            ReDim TabNoDp(1 To MonDico.Count)
            TabNoDp(MonDico.Count).Activity = TabDB(i).Activity
        End If
    Next
    
    For i = LBound(TabNoDp) To UBound(TabNoDp)  'Ajout des données dans les combobox
        ListActivity.AddItem TabNoDp(i).Activity
        ListSection.AddItem TabNoDp(i).Section
        ListDescription.AddItem TabNoDp(i).DesEn
    Next
End Sub

Le but final de ma manipulation est la suivante:
Je voudrais via les ComboBox réaliser des Listes déroulantes intuitives par saisi des premiers caractères (style recherche google), puis à partir de la valeur sélectionner dans la première liste du Combobox adapter les valeurs de la seconde liste ComboBox.

Pouvez-vous m'éclairer sur le moyen de réaliser ce type de programmation sur excel?
Merci pour votre aide!

Ya-Go

PS: J'ai rajouté le fichier excel si besoin ;)
 
Dernière édition:

Paf

XLDnaute Barbatruc
Re : Appel d'une procédure événementiel Combobox

Re,

un exemple pour initialiser les 3 combobox sans doublons, on n'utilise pas de variable de type Database.

Code:
Private Sub UserForm_Initialize()
 Dim TabTotal, LastRow As Long, MonDico1, MonDico2, MonDico3
 Dim i As Integer
 Set MonDico1 = CreateObject("Scripting.Dictionary")
 Set MonDico2 = CreateObject("Scripting.Dictionary")
 Set MonDico3 = CreateObject("Scripting.Dictionary")
 LastRow = Sheets("Tableau").Range("A6").End(xlDown).Row  'Dernière ligne de la base de données
 TabTotal = Sheets("Tableau").Range("A6:E" & LastRow)

 For i = LBound(TabTotal) To UBound(TabTotal)
    MonDico1(TabTotal(i, 1)) = ""
    MonDico2(TabTotal(i, 2)) = ""
    MonDico3(TabTotal(i, 5)) = ""
 Next
 ListActivity.List = MonDico1.keys
 ListSection.List = MonDico2.keys
 ListDescription.List = MonDico3.keys
End Sub

Mais les combobox ne sont pas liées.

Je vous invite à consulter le site de J.Boisgontier qui traite des combobox en cascade et de la saisie intuitive ( entre autres domaines !)

Menus en cascade

Bonne suite
 

YaGo

XLDnaute Junior
Re : Appel d'une procédure événementiel Combobox

Désoler de devoir encore vous embêter mais je n'arrive pas à supprimer une valeur donné dans ma liste de combobox.
Dans mon cas je souhaiterais supprimer toutes les valeurs numériques présentent dans les dictionnaires (chiffre unique,1,2,3,4,...sans être suivi de texte)

J'ai voulu tester si la valeur des clés dans le dico était numérique avec la fonction IsNumeric mais je ne sais pas si celle-ci reste valable dans le cadre des dictionnaires?

Code:
For i = LBound(TabTotal) To UBound(TabTotal) 

        Dico1(TabTotal(i, 1)) = ""  'Suppression des doublons et cases vides
        If IsNumeric(Dico1(TabTotal(i, 1))) Then Dico1.Remove (TabTotal(i, 1))  'Suppression des chiffres
        Dico2(TabTotal(i, 2)) = ""
        Dico3(TabTotal(i, 5)) = ""
 Next

De plus, j'ai du mal à comprendre sur quelles Item se base mon dictionnaire sachant que les Keys sont mes valeurs du tableau?
Concrétement je ne comprend pas comment marche cette instruction même si j'en comprend la finalité. :(
Code:
Dico1(TabTotal(i, 1)) = ""
 
Dernière édition:

Paf

XLDnaute Barbatruc
Re : Appel d'une procédure événementiel Combobox

Re,

avec le test MsgBox IsNumeric(MonDico1(TabTotal(i, 1))) on s'aperçoit que c'est toujours Faux

il reste la solution de tester avant d'insérer dans le Dico:
Code:
If Not IsNumeric(TabTotal(i, 1)) Then Dico1(TabTotal(i, 1)) = ""

A+
 

Paf

XLDnaute Barbatruc
Re : Appel d'une procédure événementiel Combobox

re

un Dico est un tableau à 2 colonnes, dans la première les Keys dans la deuxième les Items.
L'instruction Dico1(TabTotal(i, 1)) = "", "signifie" j'écris dans le dico la clé TabTotal(i, 1) et son item associé : "" (soit rien)
Au final on aura dans le dico une colonne avec les clés (keys) uniques et une colonne vide.

cette instruction est utilisée quand on a juste besoin d'une liste sans doublons.

si on voulait savoir le nombre d'apparitions des clés dans le tableau, on écrirait

Dico1(TabTotal(i, 1)) =Dico1(TabTotal(i, 1)) +1

pour chaque valeur du tableau TabTotal, on crée une clé (si elle n'existe pas) et l'item de cette clé est augmenté de 1

en espérant avoir été assez clair

A+
 

YaGo

XLDnaute Junior
Re : Appel d'une procédure événementiel Combobox

D'accord je comprend mieux le système d'attribution des valeurs.

J'ai réalisé un code pour le système de saisi semi-intuitif mais celui-ci selectionne la première valeur sans me proposer les autres qui suivent et qui commencent par les même caractère.

De plus, j'ai rajouté le système de combobox cascade. Or dans mon fichier excel, la valeur pour le 2ème ComboBox ne se situe pas en face de la valeur sélectionner dans le 1er ComboBox.

Comme dans l'exemple ci-dessous, je souhaiterai sélectionner 2-Documention dans le 1er ComboBox puis 1-Heures dans le 2ème ComboBox puis heures fabrication dans le 3ème ComboBox

Exemple: explication.jpg

Code:
Private Sub ListActivity_Change()
    ListSection.Clear
    Set Dico1 = CreateObject("Scripting.Dictionary")
    Set Dico2 = CreateObject("Scripting.Dictionary")
    tmp = UCase(ListActivity) & "*"
    For i = LBound(TabTotal) To UBound(TabTotal)
        If UCase(i) Like tmp Then If Not IsNumeric(TabTotal(i, 1)) Then Dico1(TabTotal(i, 1)) = ""
        If TabTotal(i, 1) = ListActivity Then Dico2(TabTotal(i, 2)) = ""
    Next
    ListActivity.List = Dico1.keys
    ListActivity.DropDown
    ListSection.List = Dico2.keys
End Sub

Pouvez-vous m'indiquez la démarche à suivre?
Merci bien
 

Pièces jointes

  • explication.jpg
    explication.jpg
    11.3 KB · Affichages: 61
  • explication.jpg
    explication.jpg
    11.3 KB · Affichages: 53

Paf

XLDnaute Barbatruc
Re : Appel d'une procédure événementiel Combobox

Re,

après recherche dans ce forum et/ou internet, si vous avez de nouveau des soucis, il vaudrait mieux ouvrir une nouvelle discussion, puisqu' on s'éloigne largement du sujet initial de cette discussion.

Bon courage
 

Discussions similaires

Réponses
6
Affichages
287

Statistiques des forums

Discussions
312 503
Messages
2 089 062
Membres
104 015
dernier inscrit
kkgk