ComboBox VBA sur feuille Excel

BAROTOLI

XLDnaute Nouveau
Bonjour à tous,

J'ai appris énormément de choses en parcourant ce forum et je remercie toutes les personnes qui le font vivre.

J'aurai aujourd'hui besoin de votre aide pour m'aider à finaliser/optimiser un petit outil très simple.

J'ai crée sur une feuille excel (et non pas dans un userform) 3 ComboBox qui permettent de faire une sélection sur une table via la méthode du filtre automatique et qui renvoit le résultat dans une listbox.

J'ai besoin de donner plus de détail. Voici comment ca marche.

2 feuilles :
1/ "SELECTION" avec les comboBox et la listbox
2/ "BASE" avec la base de données

Pour le moment, la feuille "SELECTION" avec les ComboBox1, 2 et 3 et la listbox s'initialisent avec "Private Sub Worksheet_Activate()" et donc, il faut d'abord sélectionner la feuille "BASE" puis reselectionner la feuille "SELECTION". Mais en fait dans l'idée, je souhaiterai passer par un "Workbook Open".

Ensuite je mets à jour les valeurs des ComboBox 2 et 3 en fonction de la sélection dans le ComboBox1 via "Private Sub ComboBox1_Click()"

Cette méthode ne me semble pas la bonne. En effet, en incluant un "MsgBox" dans "Private Sub "ComboBox1_Click()", je me rend compte que le système considère qu'à chaque ajout d'item dans le ComboBox1 lors de l'initialisation avec "Private Sub Worksheet_Activate()" il y a un click. Lors de l'initialisation, le code figurant dans "ComboBox1_Click()" est donc lancé plus de 10 fois !!!

Voilà, je ne sais pas si mon explication est claire.
En tous cas, j'attends vos remarques et vos conseils à moi le modeste débutant.
Je joint le fichier.

Un grand merci d'avance pour votre aide,
Olivier
 

Pièces jointes

  • BLUE7.zip
    35.8 KB · Affichages: 495

BAROTOLI

XLDnaute Nouveau
Re : ComboBox VBA sur feuille Excel

Bonsoir Barotoli,

Je ne constate pas ce genre de problème chez moi :confused:

A+

Bonjour Bruno, et merci pour votre réponse.

Si on met un MsgBox au commencement de Private Sub ComboBox1_Click()on s'apercoit que le message apparaît une dizaine de fois lors de l'initialisation des ComboBox alors même qu'il n'y a pas eu de click sur la ComboBox.

N'y a t'il pas le même problème si vous rajouter un MsgBox ?

Dans mon outlil final, la base de donnée et bien plus importante, et le fait que le code plusieurs fois (alors que je ne lui ai rien demandé !!!??) ralenti de manière significative l'initiliasition des combobox.

Un grand merci d'avance pour votre aide, ou pour l'aide de quelqu'un d'autre qui passerai par là...
Bonne journée,
Olivier
 

JNP

XLDnaute Barbatruc
Re : ComboBox VBA sur feuille Excel

Bonjour le fil :),
A quoi te sert d'alimenter les combobox avec toutes les valeurs, vu que tu les écrasent au fur et à mesure :confused:???
En les mettant en commentaire, le fichier semble fonctionner correctement sans que la MsgBox apparaisse
Code:
    For L = 2 To 34
[COLOR=red]'        .ComboBox1 = Sheets("BASE").Cells(L, 3)[/COLOR]
        If .ComboBox1.ListIndex = -1 Then .ComboBox1.AddItem Sheets("BASE").Cells(L, 3)
    Next L
 
    For L = 2 To 34
[COLOR=red]'        .ComboBox2 = Sheets("BASE").Cells(L, 4)[/COLOR]
        If .ComboBox2.ListIndex = -1 Then .ComboBox2.AddItem Sheets("BASE").Cells(L, 4)
    Next L
 
    For L = 2 To 34
[COLOR=red]'        .ComboBox3 = Sheets("BASE").Cells(L, 5)[/COLOR]
        If .ComboBox3.ListIndex = -1 Then .ComboBox3.AddItem Sheets("BASE").Cells(L, 5)
    Next L
Bon WE :cool:
 

BAROTOLI

XLDnaute Nouveau
Re : ComboBox VBA sur feuille Excel

Bonjour le fil :),
A quoi te sert d'alimenter les combobox avec toutes les valeurs, vu que tu les écrasent au fur et à mesure :confused:???
En les mettant en commentaire, le fichier semble fonctionner correctement sans que la MsgBox apparaisse
Code:
    For L = 2 To 34
[COLOR=red]'        .ComboBox1 = Sheets("BASE").Cells(L, 3)[/COLOR]
        If .ComboBox1.ListIndex = -1 Then .ComboBox1.AddItem Sheets("BASE").Cells(L, 3)
    Next L
 
    For L = 2 To 34
[COLOR=red]'        .ComboBox2 = Sheets("BASE").Cells(L, 4)[/COLOR]
        If .ComboBox2.ListIndex = -1 Then .ComboBox2.AddItem Sheets("BASE").Cells(L, 4)
    Next L
 
    For L = 2 To 34
[COLOR=red]'        .ComboBox3 = Sheets("BASE").Cells(L, 5)[/COLOR]
        If .ComboBox3.ListIndex = -1 Then .ComboBox3.AddItem Sheets("BASE").Cells(L, 5)
    Next L
Bon WE :cool:


Merci JNP pour ton intervention dans ce fil.

En fait, pour être honnête je ne comprend pas bien cette partie du code. Cette technique (que j'ai trouvé quelque part sur le forum) permet d'alimenter la ComboBox sans doublon.

C'est très bizarre, mais effectivement, si je mets en commentaire ces lignes de code, il n'y a plus le problème d'apparation du MsgBox, mails malheureusment, j'ai plein de doublon.

Connaitrais tu une autre méthode pour alimenter mes combobox sans doublon ?

Big merci d'avance,
Olivier
 

JNP

XLDnaute Barbatruc
Re : ComboBox VBA sur feuille Excel

Re :),
En utilisant les dicos de JB
Code:
Private Sub Worksheet_Activate()
'Application.ScreenUpdating = False
With ListBox1
    .ColumnHeads = True
    .ColumnCount = 5 ' defini nb colonne tableau
    .ColumnWidths = "60;50;85;60;40" ' largeur des colonnes
    '.MultiSelect = fmMultiSelectMulti ' si multiselect
    .Clear
    
    R = 0
    For L = 2 To 34
        If Sheets("BASE").Cells(L, 1).Rows.Hidden = False Then
            .AddItem
            .List(R, 0) = Sheets("BASE").Cells(L, 1)
            .List(R, 1) = Sheets("BASE").Cells(L, 2)
            .List(R, 2) = Sheets("BASE").Cells(L, 3)
            .List(R, 3) = Sheets("BASE").Cells(L, 4)
            .List(R, 4) = Sheets("BASE").Cells(L, 5)
            
            R = R + 1
        End If
    Next L
End With

With Sheets("SELECTION")
    .ComboBox1.Clear
    .ComboBox2.Clear
    .ComboBox3.Clear
  Set MonDico = CreateObject("Scripting.Dictionary")
  For Each c In Sheets("BASE").Range("C2:C34")
    MonDico.Item(c.Value) = c.Value
  Next c
  temp = MonDico.items
  '--
  Call tri(temp, LBound(temp), UBound(temp))
  .ComboBox1.List = temp
  MonDico.RemoveAll
  For Each c In Sheets("BASE").Range("D2:D34")
    MonDico.Item(c.Value) = c.Value
  Next c
  temp = MonDico.items
  '--
  Call tri(temp, LBound(temp), UBound(temp))
  .ComboBox2.List = temp
  MonDico.RemoveAll
  For Each c In Sheets("BASE").Range("E2:E34")
    MonDico.Item(c.Value) = c.Value
  Next c
  temp = MonDico.items
  '--
  Call tri(temp, LBound(temp), UBound(temp))
  .ComboBox3.List = temp
   
    .ComboBox1.AddItem "*"
    .ComboBox2.AddItem "*"
    .ComboBox3.AddItem "*"
    
    .ComboBox1 = "*"
    .ComboBox2 = "*"
    .ComboBox3 = "*"
End With
'Application.ScreenUpdating = True
End Sub
sans oublier de rajouter la macro de tri
Code:
Sub tri(a, gauc, droi) ' Quick sort
  ref = a((gauc + droi) \ 2)
  g = gauc: d = droi
  Do
    Do While a(g) < ref: g = g + 1: Loop
    Do While ref < a(d): d = d - 1: Loop
    If g <= d Then
      temp = a(g): a(g) = a(d): a(d) = temp
      g = g + 1: d = d - 1
    End If
  Loop While g <= d
  If g < droi Then Call tri(a, g, droi)
  If gauc < d Then Call tri(a, gauc, d)
End Sub
Après, il faudrait refaire propre les macros des combobox, car la technique des filtres ne parrait pas très performante.
Bon courage :cool:
 

BAROTOLI

XLDnaute Nouveau
Re : ComboBox VBA sur feuille Excel

Je pense avoir maintenant tout ce qu'il faut pour faire un "truc sympa" !
Me reste plus qu'à me mettre au travail ! (je ne peux imaginer intégrer la macro de tri, sans la comprendre...)

Un grand merci pour ton aide efficace JNP !
 

JNP

XLDnaute Barbatruc
Re : ComboBox VBA sur feuille Excel

Re :),
Me reste plus qu'à me mettre au travail ! (je ne peux imaginer intégrer la macro de tri, sans la comprendre...)
Si ça peut te déculpabiliser, il s'agit d'une macro récursive où j'ai déjà modifié les variables dans des utilisations personnelles pour essayer de la comprendre, mais si, intuitivement, je comprends ce qu'elle fait, scientifiquement, je l'ai pas encore assimilée :eek:... Donc si tu ne la comprends pas, c'est que tu fait, comme moi, partie du commun des mortels :p.
Bon courage :cool:
 

BAROTOLI

XLDnaute Nouveau
Re : ComboBox VBA sur feuille Excel

Re :),Si ça peut te déculpabiliser, il s'agit d'une macro récursive où j'ai déjà modifié les variables dans des utilisations personnelles pour essayer de la comprendre, mais si, intuitivement, je comprends ce qu'elle fait, scientifiquement, je l'ai pas encore assimilée :eek:... Donc si tu ne la comprends pas, c'est que tu fait, comme moi, partie du commun des mortels :p.
Bon courage :cool:

Merci pour ce message et tes encouragements.

Bonne soirée,
@+
Olivier
 

Discussions similaires

Statistiques des forums

Discussions
312 153
Messages
2 085 800
Membres
102 980
dernier inscrit
brossadan