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

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 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
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
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
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
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
Option Explicit
 
Public Function field(ByVal value As Integer) As clsField
 
    Set field = New clsField
 
    field.initialize value:=value
 
End Function
Merci par avance !