Bonjour à tous,
je dispose d'un document Excel comportant une trentaine de colonnes et un bon milliers de lignes. On me demande de créer une interface simplifiée qui permette de filtrer mes données. En gros le principe doit être le même que celui d'excel, mais avec une interface.

J'ai donc créé une form vierge sur laquelle je veux placer des menus déroulants de manière dynamique et les remplir avec les données unitaires de chaque colonne. L'initialisation marche trés bien, mais je bute sur la gestion des évènements. Je veux gérer l'évènement onchange auquel j'associerais le filtre de chaque colonne. J'ai identifié deux options:
- je créé le code de mes évènements sur mon formulaire
- je créé le code de mes évènements sur un module séparé
Dans le 1er cas le projet plante à la fin de la création des n procédures correspondant à chaque colonne avec le message "automation error: the object invoked has disconnected frolm its clients"
Dans le deuxième cas, le code se créé correctement (sauf si on sauvegarde le projet et qu'on le relance auquel cas il crashe car il copie deux fois le même code).

Dans les deux cas, je n'arrive pas à associer mon menu déroulant et l'évènement onchange.

Est-ce que quelqu'un à une idée?

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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
Private Sub UserForm_Initialize()
    Dim wTab As Worksheet
    Dim rPlage As Range
    Dim rCell As Range
    Dim rValeur As Range
    Dim cMenusDeroulants As Collection
    Dim Menu As CMenus
    Dim iVal As Integer
    Dim iTop As Integer
    Dim iId As Integer
    Dim cbMenu As Object
    Dim lbLabel As Object
    Dim sCode As String
 
    'On Error Resume Next
 
    Set wTab = ThisWorkbook.Sheets("AVAILABLE")
    Set cMenusDeroulants = New Collection
 
    iTop = 10
    iId = 1
 
    For iVal = 1 To wTab.Range("IV2").End(xlToLeft).Column
        Set Menu = New CMenus
        With Menu
            .Name = wTab.Cells(2, iVal).Value
            .Left = 80
            .Top = iTop
            .ID = "cb" & iId
        End With
 
        iTop = iTop + 25
        iId = iId + 1
 
        cMenusDeroulants.Add Menu
    Next iVal
 
    Set Menu = New CMenus
 
    ' Création des combobox
    For Each Menu In cMenusDeroulants
        ' Création du combobox
        Set cbMenu = Me.Controls.Add("Forms.ComboBox.1", Menu.ID)
        With cbMenu
            .Top = Menu.Top
            .Left = Menu.Left
 
            sCode = ""
            sCode = sCode & "Private Sub " & Menu.ID & "_Change()" & vbCrLf & vbCrLf
            sCode = sCode & "    Msgbox" & """" & "Réussi" & vbCrLf & vbCrLf
            sCode = sCode & "End Sub" & Chr(13)
        End With
 
        With ThisWorkbook.VBProject.VBComponents("uStocks").CodeModule
            .InsertLines .CountOfLines + 1, sCode
        End With
 
        'Création du label associé
        Set lbLabel = Me.Controls.Add("Forms.Label.1", "lb" & Right(Menu.ID, Len(Menu.ID) - 2))
        With lbLabel
            .Caption = Menu.Name
            .Top = Menu.Top
            .Left = 5
        End With
 
        ' Création des données dans le combobox
        Set rPlage = wTab.Range(wTab.Cells(3, CInt(Right(Menu.ID, Len(Menu.ID) - 2))), wTab.Cells(wTab.UsedRange.Rows.Count, CInt(Right(Menu.ID, Len(Menu.ID) - 2))))
        Call FillCombobox(wTab, cbMenu, rPlage)
 
    Next Menu
End Sub
Rq: dans le code ci-dessus, j'utilise la classe CMenus qui gère les propriétés de chacun de mes menus déroulants: le libellé, l'id du menu, et l'emplacement sur le formulaire