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?
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
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
Partager