Bonjour,
Je développe sous Excel et CATIA (logiciel de CAO), mais j'imagine que ça affecte également d'autres logiciels..
Il y a problème de typage des Boolean, sous Excel (et autre logiciels Office) les Boolean sont typés sous forme de Short, alors que sous CATIA ils le sont sous forme de Unsigned Char.
Du coup, sous Excel, True est équivalent à -1 (complément à 2), alors que ce n'est pas le cas sous CATIA.
Visiblement, il y a des astuces comme déclarer les Property (du moins de classe) comme Variant et non comme Boolean. Ça m'a l'air de bien fonctionner, mais j'ai quand même du mal à savoir si c'est une approche fiable.
Par contre, je ne comprends pas cet exemple minimaliste que j'ai construit. Pourquoi la structure If... Else... End If échoue alors que l'instruction IIf(...) est correcte (je teste exprès un cas renvoyant False...)
Classe clsfield
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 ' Public Sub main() With New clsFields .add field:=factory.field(value:=-1) .add field:=factory.field(value:=0) .add field:=factory.field(value:=1) If .partial.count = 2 Then Debug.Print "OK with If... Else... Then" '<- renvoie cette instruction, ce qui ne devrait pas être le cas !!! Mais ça passe si je stocke le résultat dans une variable booléenne comme Dim flag As Boolean: flag = (.partial.count = 2), ce que je préférerais éviter pour avoir des instruction en ligne Else Debug.Print "issue with If... Else... Then" End If Debug.Print VBA.IIf(.partial.count = 2, "ok with IIf", "issue with IIf") '<- renvoie bien "issue with IIF", ce qui est OK End With End Sub
Classe collection clsFields
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 Option Explicit Private pValue As Integer ' Public Property Get value() As Integer value = pValue End Property ' Public Sub initialize(ByVal value As Integer) pValue = value End Sub
Module factory pour instancier la classe clsField en simulant un constructeur avec argument.
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 Option Explicit Private pFields As Collection ' Public Property Get count() As Integer count = pFields.count End Property '----------------------------------------------------------------------------------------------------------------------------- ' Private Sub Class_Initialize() Set pFields = New Collection End Sub ' Private Sub Class_Terminate() Set pFields = Nothing End Sub '----------------------------------------------------------------------------------------------------------------------------- ' Public Sub add(ByRef field As clsField) pFields.add Item:=field End Sub '----------------------------------------------------------------------------------------------------------------------------- 'renvoi tous les fields dont leur valeur est positive Public Function partial() As clsFields Set partial = New clsFields Dim field As clsField: For Each field In pFields If field.value > 0 Then partial.add field:=field Next field End Function
Merci par avance !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Option Explicit Public Function field(ByVal value As Integer) As clsField Set field = New clsField field.initialize value:=value End Function
Partager