Bonjour à tous,
Je me remets au vba après un an de pause à faire du js/php, j'avais donc pris la bonne habitude de faire de la POO. Ceci devient pourtant très fastidieux en vba...
Du coup je créé une grosse classe abstraite avec plein de types à l'intérieur et j'ai notamment un array de chaque type que je dois souvent manipuler (ajout, update, suppression, tri, filtre etc...)
J'ai donc créé des fonctions pour manipuler les array facilement malheureusement je n'ai pas trouver comment surcharger une fonction car les types utilisateurs ne peuvent pas être convertis en variant...
Exemple :
Je me retrouve avec le message d'erreur
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 Type tField attr1 As String attr2 As Date End Type Type tTable attr1 As String attr2 As Date End Type Sub main() Dim arrFields() As tField Dim field As tField Dim arrTables() As tTable Dim table As tTable field.attr1 = "test" field.attr2 = Date table.attr1 = "test" table.attr2 = Date arrPush arrFields, field arrPush arrTables, table End Sub Private Sub arrPush(arr, el) If isErasedArray(arr) Then ReDim arr(1) Else ReDim Preserve arr(UBound(arr) + 1) End If arr(UBound(arr)) = el End Sub Private Function isErasedArray(arr) As Boolean Dim a& On Error GoTo ieaError a = UBound(arr) isErasedArray = False Exit Function ieaError: isErasedArray = True End Function
Pour l'instant la solution est de faire :"Erreur de compilation: Seuls les types définis par l'utilisateur et qui sont définis dans les modules d'objets publics peuvent être convertis depuis ou vers un variant, ou passés à des fonctions à liaison tardive"
Mais ça va vite devenir très lourd... Là je n'ai que deux fonctions mais je risque d'en avoir un paquet...
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 Option Explicit Option Base 1 Type tField attr1 As String attr2 As Date End Type Type tTable attr1 As String attr2 As Date End Type Sub main() Dim arrFields() As tField Dim field As tField Dim arrTables() As tTable Dim table As tTable field.attr1 = "test" field.attr2 = Date table.attr1 = "test" table.attr2 = Date arrPushField arrFields, field arrPushTable arrTables, table End Sub Private Sub arrPushField(arr() As tField, el As tField) If isErasedArrayField(arr) Then ReDim arr(1) Else ReDim Preserve arr(UBound(arr) + 1) End If arr(UBound(arr)) = el End Sub Private Sub arrPushTable(arr() As tTable, el As tTable) If isErasedArrayTable(arr) Then ReDim arr(1) Else ReDim Preserve arr(UBound(arr) + 1) End If arr(UBound(arr)) = el End Sub Private Function isErasedArrayField(arr() As tField) As Boolean Dim a& On Error GoTo ieaError a = UBound(arr) isErasedArrayField = False Exit Function ieaError: isErasedArrayField = True End Function Private Function isErasedArrayTable(arr() As tTable) As Boolean Dim a& On Error GoTo ieaError a = UBound(arr) isErasedArrayTable = False Exit Function ieaError: isErasedArrayTable = True End Function
Quelqu'un a-t-il une astuce pour surcharger les fonctions en vba ?
PS : sachant que je ne créé pas un module de classe par type parce que ça devient vite très lourd également (voir pire) et je ne suis pas sûr de résoudre le problème.
Partager