Boucle sur comboBox_Change

pmfontaine

XLDnaute Occasionnel
Bonjour,
Je souhaiterais savoir s'il est possible de faire une boucle sur plusieurs "Private Sub comboBox_Change()"
En resumé, est-ce que l'on peut
remplacer :
Private Sub comboBox1_Change()"
action1
End Sub
Private Sub comboBox2_Change()"
action2
End Sub
Private Sub comboBox3_Change()"
action3
End Sub
Private Sub comboBox4_Change()"
action4
End Sub
Private Sub comboBox5_Change()"
action5
End Sub

Par un truc du style :
For i = 1 to 5
Private Sub comboBox & i_Change()"
action & i
End Sub
Next i

J'ai bien trouvé https://www.excel-downloads.com/threads/boucle-ave-combobox_change.160876/ sur le forum, mais je ne l'ai pas compris.
Merci
Patrick
 
Dernière édition:

pmfontaine

XLDnaute Occasionnel
la curiosité n'a pas pue attendre les jours qui viennent.
Dranred, votre solution me semble super intéressante, mais mon niveau de VBA ne me permet pas de tous comprendre, pour faire le même nombre de ligne que vous avez faites dans ce fichier, il me faudrait 2 ou 3 semaines :(:(:(
Pour dire, j'ai voulue essayez de récupérer a chaque validation la valeur du CBxOrdre (Classe - Ordre) afin de la remettre par défaut à CBxOrdre (95 % des observations sont des oiseaux, donc je voudrait évité de le saisir a chaque fois) Mais je n'y suis pas arrivé.:(:(

Ensuite je vais essayer d'agrandir ce formulaire avec, le lieu (obligatoire), la date (obligatoire) et les observateurs (sur 10 cases prévue la première est obligatoire, les autres peuvent rester vides. Ces dernières données (lieu, date observateur) ne change pas sur toutes la durée de la saisie jusqu’à l'enregistrement dans une feuille de base de données en cliquant sur "Enregistrer tout ça quelque part ?" Mais là c'est la même chose, ont les récupères où toutes ces valeurs ?? :eek::eek:
Merci beaucoup pour votre aide
Bonne fin de soirée
Patrick
 

Dranreb

XLDnaute Barbatruc
Dans la Sub CBnAjouter_Click je propose, pour remettre la classe du dernier animal ajouté, juste après CL.Nettoyer : CBxOrdre.Text = T(1, 1)
On retrouve les infos dans CL.PlgTablo. Le mieux c'est de le charger intégralement dans un tableau.
T = CL.PlgTablo.Resize(, 3).Value
Les numéros de lignes à y prendre sont dans TLgn

Remarque: Par principe je n'aime pas repartir des contrôles, mais ça pourrait être plus simple de repartir de LBx.List, surtout s'il n'y aura toujours que des textes.

Aussi bien dans TLgn que dans LBx.List, la première ligne a pour index 0. Pareil pour la 1ère colonne dans LBx.List.
 
Dernière édition:

pmfontaine

XLDnaute Occasionnel
Bonjour a tous, Bonjour Dranreb,
Quand j'était jeune, Plastic Bertrand chantait, ça plane pour moi. aujourd'hui c'est moi qui plane dans le brouillard épais du VBA, alors que Dranreb vole très haut dans les stratosphères très lumineuse du VBA.
Bon, mais maintenant il faut que je me plonge dans tous ce code et que je comprenne, au moins dans les grande lignes pour dissiper tous ou partie de ce brouillard qui m'entour, comment ça fonctionne pour que je puisse rajouter les champs manquants.
Je pense que j'en n'ai pour quelques jours. Bien sur je reviendrais vous dire si j'y suis arrivé ou si j'ai encore besoins de votre aide pour finaliser mon fichier.
Bonne semaine a tous.
Patrick
 

Dranreb

XLDnaute Barbatruc
Bonjour,
N'hésitez pas à me demander des explications sur un bout de code si une incompréhension récurrente vous bloque.
De toute façon joignez ce que vous aurez fait, car j'ai apporté de petites modifications de sécurité dans le code, qu'il faudra que je reporte.
 

pmfontaine

XLDnaute Occasionnel
Bonsoir le Forum, Bonsoir Dranreb,
Je n’arrive pas a mettre les valeurs de la LBx dans les Cellule.
J'ai écrie :
Private Sub CBnEnreg_Click()
Dim T(), C As Long, L As Long
T = CL.PlgTablo.Resize(, 3).Value
'recherche de la premiere ligne vide dans la colonne A
'Ligne = Range("a65536").End(xlUp).Row + 1
Range("A1").Resize(UBound(T, 1), UBound(T, 2)) = T
End Sub

Avec ça j'écris toutes la liste des espèces.
Je comprends que je doit filtrer en ne prenant que les lignes contenues dans TLgn ?

Vous me dite que les ligne sont dans TLgn
Je comprends que Tlgn est le numero des lignes contenue dans LBx
Si dans LBx il y a

Oiseau Aigle botté Hieraaetus pennatus
Oiseau Aigle des steppes Aquila nipalensis

Dans ce cas TLgn a pour valeur 4 et 7 ? est-ce bien cela ?
Si ma compréhension est correcte, je ne sais pas comment filtrer avec TLgn


Avec le debut du tableau espèces :
1 - Oiseau Accenteur alpin Prunella collaris
2 - Oiseau Accenteur mouchet Prunella modularis
3 - Oiseau Agrobate roux Cercotrichas galactotes
4 - Oiseau Aigle botté Hieraaetus pennatus
5 - Oiseau Aigle criard Clanga clanga
6 - Oiseau Aigle de Bonelli Aquila fasciata
7 - Oiseau Aigle des steppes Aquila nipalensis
8 - Oiseau Aigle ibérique Aquila adalberti

Merci
Patrick
 

Dranreb

XLDnaute Barbatruc
Avec 2 tableaux, donc :
VB:
Private Sub CBnEnreg_Click()
Dim Te(), Le As Long, Ts(), Ls As Long, C As Long ' e comme entrée, s comme sortie
Te = CL.PlgTablo.Resize(, 3).Value
ReDim Preserve Ts(1 To UBound(TLgn) + 1, 1 To 3)
For Ls = 1 To UBound(Ts, 1)
   Le = TLgn(Ls - 1): For C = 1 To 3: Ts(Ls, C) = Te(Le, C): Next C, Ls
'recherche de la premiere ligne vide dans la colonne A
'Ligne = Range("a65536").End(xlUp).Row + 1
Range("A1").Resize(UBound(Ts, 1), UBound(Ts, 2)) = Ts
End Sub
 

Dranreb

XLDnaute Barbatruc
Cela dit, si le fait que la ListBox ne contient que des textes ne changera jamais, ça vaudrait peut être le coup d'essayer simplement :
VB:
Private Sub CBnEnreg_Click()
'recherche de la premiere ligne vide dans la colonne A
'Ligne = Range("a65536").End(xlUp).Row + 1
Range("A1").Resize(LBx.ListCount, 3).Value = LBx.List
End Sub

LBx.List est basé 0 mais en général Excel s'en fout, il prend ce qu'il y a…
 

pmfontaine

XLDnaute Occasionnel
Bonsoir le Forum, Bonsoir Dranreb,

Voila mon fichier qui avance petit à petit, au fur et à mesure que je comprends (un peu) le code de Dranreb.
J'y ai apporter quelque adaptation qui correspondent à mon souhait (fonctionnement à la saisie de doublon, désactivation du bouton CBnEnreg quand pas de ligne dans LBx) affichage du nombre de valeur enregistrées).

Maintenant je cherche à permettre a l'utilisateur d'affiche la liste des espèces soit par ordre alphabétique (comme actuellement, soit par occurrence que j'ai mise dans la colonne D Feuille1. (Cette Occurrence sera une formule qui dépendra du site choisi)(Si j'ai bien compris le fonctionnement des tableaux en VBA, je suppose qu'il y a possibilité de créer cette colonne directement en VBA dans le tableau T().
j'ai bien chercher sur le Forum et sur le Net, mais je découvre pour la première fois les tableau VBA et en plus avec les comboBoxLiées je suis incapable de savoir où ce fait le tri dans le code et encore moins comment le modifier.
Je pensais permettre ce choix avec deux OptionButton, (Voir fichier)
Merci
Patrick
 

Pièces jointes

  • CBxLiéesPmfontaineV2.xlsm
    250.4 KB · Affichages: 55

Dranreb

XLDnaute Barbatruc
Bonjour
On ne peut pas classer les listes des ComboBox sur autre chose que leur propres valeurs, et il n'est pas question de modifier quoi que ce soit dans les modules de service. En revanche vous pourriez ajouter une ComboBox pour restreindre le choix dans les autres aux animaux qui sont dans le top 3 ou quelque chose comme ça.
N'effacez pas les ComboBox une à une: ça déclenche des exécutions dans l'objet CL et celui ci peut refusez l'effacement du nom vernaculaire si c'est le seul choix possible compte tenu du nom latin qui avait été choisi et qui est toujours encore le choix courant. En fait remettez le code de la CL_BingoUn comme il était. Je ne comprend pas pourquoi vous avez changé ça: s'il choisit un animal qui est déjà dans la liste c'est comme s'il l'avait sélectionné dans la liste et il peut l'en retirer.
Je voudrais aussi revenir sur l'instruction : CBxOrdre.Text = T(1, 1), je pense qu'il vaudrait mieux la supprimer. Il n'est de toute façon pas indispensable d'y faire un choix.
 

pmfontaine

XLDnaute Occasionnel
Bonjour,
Merci Dranred pour votre réponse.
Ok je ne savais pas que l'on ne pouvez pas trier la liste d'une comboBox par rapport a une autre liste.

Oui la solution de limiter la liste avec une comboBox ou l'utilisateur rentrerait un valeur pour que la liste des noms vern ou lat n'affiche que les valeurs ou l’occurrence est > à la valeur choisie. Mais je ne sais pas comment faire pour programmer la limitation des listes (Vern et Lat)

Désolé d'avoir fait une bêtise en modifiant la CL_Bingo. Mais le fonctionnement que vous aviez mis me pose un problème, car je souhaiterais que l'utilisateur sache qu'il a saisie une donnée déjà dans LBx (Donc MsgBox), et dans votre programme, si l'utilisateur clique sur supprimé, ça enlève la ligne dans LBx et ça la laisse dans CL, il me semble que l'inverse correspondrait mieux au fonctionnement souhaité.

En tous cas votre aide est précieuse et m'a fait découvrir plein de possibilité en VBa dont je ne soupçonnais même pas l’existence. Mais avant de pouvoir l'appliqué seul, il me faudra du temps.
Bonnes Fêtes a tous.
Patrick
 

Dranreb

XLDnaute Barbatruc
Il y a deux voies différentes pour limiter la population des choix proposés.
La plus simple c'est de pouvoir l'identifier par quelque chose de facilement calculable par tranche dans une colonne supplémentaire. Il suffit d'une ComboBox supplémentaire pour cette colonne dans l'UserForm_Initialize, et strictement aucune programmation supplémentaire nulle part ailleurs. (Sauf le calcul du fameux critère d'identification de tranche dans le top 5 ou quoi bien sûr…)
Pour arriver à faire presque n'importe quoi on peut utiliser la méthode FiltrerLignes de l'objet ComboBoxLiées.
 

Discussions similaires

Réponses
11
Affichages
836

Statistiques des forums

Discussions
311 724
Messages
2 081 938
Membres
101 844
dernier inscrit
pktla