Bonjour à tous !
J'ai un problème assez spécial. J'ai créé une macro qui me permet d'archiver certains fichiers. Grâce à ces archives, je peux retrouver un ancien fichier en effectuant une recherche : je recherche une lettre et un numéro associé et ma macro trouve le fichier associé. J'ai donc, sur un UserForm, créé deux listbox et je suis arrivé à les configurer de manière à ce que lorsque je sélectionne une lettre dans la première ListBox, la seconde n'affiche que les chiffres associés. Cette macro marche très bien.
Cependant, par soucis de facilité, je souhaite réduire l'UserForm et placer le bouton qui lance la recherche sur une feuille Excel.
Je vais tenter de vous expliquer en détail mon problème. A défaut, je transfèrerai le fichier simplifié sans données confidentielles.
Mon classeur se compose de trois feuilles : une où est placée le bouton lançant la recherche (nommée "Accoglienza" (oui, je travaille pour des italiens :D ), la seconde, "Archivio", comme son nom l'indique elle contient les archives (une ligne correspond à un fichier) et la troisième feuille "Variables" est la feuille qui me permet d'avoir mes lettres de base qui caractéristiques mes fichiers à Archiver.
Par exemple : la lettre V en feuille 3 correspond à tous mes fichiers qui ont pour caractéristique : V+ un nombre. Ce nombre s'incrémente à chaque nouvelle entrée dans les archives de manière à ce qu'il n'est aucun doublon.
Etant débutant sous VBA, j'ai simplement retranscrit mon code qui fonctionne dans l'UserForm associé au bouton recherche, dans un nouveau bouton que j'ai placé en feuille 1. En débuggant, je me suis retrouvé bloqué par une erreur et j'ai petit à petit simplifié mon programme pour n'arriver qu'à avoir l'essentiel.
Mes deux boutons ont un code identique.
Cependant, on en vient enfin au problème, c'est que l'un des boutons (celui de l'UserForm) marche parfaitement, mais celui du classeur Excel ne marche pas. J'arrive à recréer la liste mais lorsque je clique sur une lettre, j'ai le message d'Erreur : "Incompatibilité de type". C'est très bizarre car le même programme fonctionne avec l'autre bouton !
Enfin, j'ai oublié de vous dire : lorsque j'appuie sur le bouton, je crée une nouvelle feuille où je viens copier les données qui m'intéressent des archives. J'ai donc dans cette nouvelle feuille ("Adresses") uniquement les données qui m'intéressent.
Lorsque la recherche est effectuée, je supprime avec ma macro cette feuille.
Ci-joint mon programme associé au bouton :
Je sais que mon programme n'est vraiment pas idéal et que je pourrai grandement le simplifier, pour l'instant je me concentre sur la partie fonctionnelle (par manque de temps, c'est pour ça que je viens vers vous !)
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133 'Declaration of variables for sheets Public WS2 As Worksheet Public WS3 As Worksheet Public WS4 As Worksheet 'Déclaration des variables pour la création des listes Public tab_famille As Variant Public tab_sous_famille As Variant Function Feuille_Existe(ByVal Nom_Feuille As String) As Boolean Dim Feuille As Excel.Worksheet On Error GoTo Feuille_Absente_Error Set Feuille = ActiveWorkbook.Worksheets(Nom_Feuille) On Error GoTo 0 Feuille_Existe = True Exit Function Feuille_Absente_Error: Feuille_Existe = False End Function 'Programme qui associe à une lettre les numéros associés Public Sub Letter_change() For i = 0 To Letter.ListCount If Me.Letter.Selected(i) = True Then ma_selection = i famille_selectionnee = Me.Letter.List(ma_selection) Exit For End If Next i 'research of index For i = 1 To UBound(tab_famille, 1) If famille_selectionnee = tab_famille(i, 1) Then famille_selectionnee_index = tab_famille(i, 2) Exit For End If Next i 'fill in lists Accueil.Number.Clear For i = 1 To UBound(tab_sous_famille, 1) If tab_sous_famille(i, 2) = famille_selectionnee_index Then Accueil.Number.AddItem tab_sous_famille(i, 1) End If Next i End Sub 'Programme de mon bouton "Nuovo_esistente" Private Sub Nuovo_esistente_Click() Set WS2 = Worksheets("Archivio") Set WS3 = Worksheets("Variables") WS2.Unprotect WS3.Unprotect 'begin of the research Accueil.Label1.Visible = True Accueil.Letter.Visible = True Accueil.Number.Visible = True 'Add page 4 for creation of table Sheets.Add.Move After:=Sheets(Sheets.Count) Sheets(Sheets.Count).Name = "Adresses" Set WS4 = Worksheets("Adresses") WS4.Unprotect 'Copy of titles WS4.Range("A1").Value = "Familles" WS4.Range("B1").Value = "N°" 'Copy of types WS3.Activate WS3.Range("E2:E10").Select selection.Copy WS4.Activate WS4.Range("A2:A10").Select selection.PasteSpecial WS4.Activate WS4.Range("B2:B10").Select selection.PasteSpecial 'Copy of values WS2.Activate Columns("C").Select selection.Copy WS4.Activate Columns("D").Select selection.PasteSpecial WS2.Activate Columns("D").Select selection.Copy WS4.Activate Columns("C").Select selection.PasteSpecial With Sheets("Adresses") 'creation of table for letters tab_famille = .Range("A2:B" & .Range("B65000").End(xlUp).Row).Value 'creation of table for numbers tab_sous_famille = .Range("C2:D" & .Range("D65000").End(xlUp).Row).Value End With 'fill in the lists Accueil.Letter.Clear For i = 1 To UBound(tab_famille, 1) Accueil.Letter.AddItem tab_famille(i, 1) Next i 'fill in the lists Accueil.Number.Clear For i = 1 To UBound(tab_sous_famille, 1) Accueil.Number.AddItem tab_sous_famille(i, 1) Next i WS2.Activate 'Delete the sheet WS4 Application.DisplayAlerts = False Worksheets("Adresses").Delete Application.DisplayAlerts = True End Sub
En espérant avoir été compréhensible et dans l'attente de vos réponses et questions.
Merci
Partager