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 :

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
Je me retrouve avec le message d'erreur
"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"
Pour l'instant la solution est de faire :
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
Mais ça va vite devenir très lourd... Là je n'ai que deux fonctions mais je risque d'en avoir un paquet...

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.