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 :


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
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 !)

En espérant avoir été compréhensible et dans l'attente de vos réponses et questions.
Merci