Bonjour à tous,

Dans un soucis d'évolution de mon niveau de VBA, je fais appel à vous pour avoir une meilleur solution, notamment en terme d'organisation et de propreté du code.

1ère interrogation :
Tout d'abord je récupère des données d'un fichier texte, que je stock dans des types que j'ai crée, j'ai 3 types :

Trame
Signal
Valeur

Mon type Trame est composé de plusieurs type Signal qui sont composé de plusieurs type Valeur.

Je les déclare de cette façon dans ma macro :

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
'Déclaration d'un type comportant les données des valeurs d'un signal
Public Type tValue
    Value As String       'Valeur affecté
    Description As String 'Description de la valeur (Marche, Arrêt, ...)
End Type
 
'Déclaration d'un type comportant les données des signaux
Public Type tSignal
    Name As String          'Nom
    StartBit As String      'Position du dernier bit
    Length As String        'Taille
    ByteOrder As String     'Motorola ou Intel
    Type As String          'Unsigned, Signed, IEEE Float ou IEEE Double
    Factor As String        'Résolution ?
    Offset As String        'Compensation imposée
    Min As String           'Valeur minimum
    Max As String           'Valeur maximum
    Unit As String          'Unité (km/h, km, kg, Hz, ...)
    Receivers As String     'Calculateurs consommant le signal
    Default As String       'Valeur par defaut
    Init As String          'Valeur initiale
    Description As String   'Description du signal (Allumage des antis-brouillards, état du frein à main, ...)
    ValueListe() As tValue  'Structure stockant les informations des valeurs
End Type
 
'Déclaration d'une trame
Public Type tTrame
    Name As String             'Nom
    Period As String           'Période
    Event As String            'Conditions sur l'envoi
    ID As String               'Numéro ID en héxadécimal
    ID_dec As String           'Numéro ID converti en décimal
    Length As String           'Taille
    calculators() As String    'Calculateurs envoyant cette trame
    Network As String          'Type de réseau (CAN, LIN, ...)
    Description As String      'Description de la trame (Message comportant tous les acquitements des signaux du kit main libre, ...)
    SignalListe() As tSignal   'Structure stockant les informations sur les signaux
End Type
Y a t'il une meilleure façon de procédé ? L'utilisation de module de classe (Je maitrise peu) ?

2nd interrogation :

Je réalise la récupération de mon fichier via des TAG particulier, puis j'active une fonction de récupération.

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
'Si on détecte le TAG lié à la déclaration d'une trame
        '======================================================
        If InStr(1, Data, tagmess, vbTextCompare) = 1 Then
            'Initialisation des variables temporaire
            tag_temp = tagmess
            ID_dec_temp = ""
            Name_Trame_temp = ""
            Length_Trame_temp = ""
            Calculator_temp = ""
 
            'Appel à la fonction pour sauvegarder les données (ID, Name, Length, Calculator) de la trame
            Call Import_Trame_Corp(Data, ID_dec_temp, Name_Trame_temp, Length_Trame_temp, Calculator_temp, tag_temp)
 
            'Ecriture des données
            ListeTrames(UBound(ListeTrames)).ID_dec = ID_dec_temp
            ListeTrames(UBound(ListeTrames)).Name = Name_Trame_temp
            ListeTrames(UBound(ListeTrames)).Length = Length_Trame_temp
            ListeTrames(UBound(ListeTrames)).calculators(UBound(ListeTrames(UBound(ListeTrames)).calculators)) = Calculator_temp
        End If
La question est peut on envoyer ListeTrames(UBound(ListeTrames)) à ma fonction, car là comme vous pouvez le voir la syntaxe est relativement lourde je trouve.

3ème interrogation :

J'ai gardé le pire pour la fin. Voici donc un exemple de ligne que j'exploite :
BO_ 274 BSI_States_112: 8 BSI
Une fois le TAG détecté, j'éclate la ligne en caractères et je traite un par un à l'aide de IF et de FLAG, je pense que c'est la pire façon de procéder mais je n'ai pas trouvé d'autres façon 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
63
64
65
'Fonction permettant la récupération des caractéristiques d'une Trame
'=====================================================================
'=====================================================================
'ID en héxadécimal, ID en décimal, Nom, Taille, Calculateur produisant la Trame
Public Function Import_Trame_Corp(Data, ID_dec, Name, Length, calculators, TAG)
 
    'Déclarations des variables & flags
    Dim TabSplit() As String
 
    Dim FlagMessID As Boolean
    Dim FlagMessName As Boolean
    Dim FlagMessLength As Boolean
    Dim FlagMessCalculator As Boolean
 
    Dim I As Integer
 
    'Eclate la ligne en un tableau de caractères
    TabSplit = Split(StrConv(Data, vbUnicode), Chr(0))
 
    'Initialisation des variables
    FlagMessID = True
    FlagMessName = False
    FlagMessLength = False
    FlagMessCalculator = False
 
    'Boucle récupérant l'ID, le nom, sa taille et le noeud produisant le message
    For I = Len(TAG) To UBound(TabSplit)
        If TabSplit(I) <> " " Then
            If FlagMessID = True Then
                ID_dec = ID_dec & TabSplit(I)
            Else
                If FlagMessName = True Then
                    If TabSplit(I) <> ":" Then
                        Name = Name & TabSplit(I)
                    End If
                Else
                    If FlagMessLength = True Then
                        Length = Length & TabSplit(I)
                    Else
                        If FlagMessCalculator = True Then
                            calculators = calculators & TabSplit(I)
                        End If
                    End If
                End If
            End If
        Else
            If FlagMessID = True Then
                FlagMessID = False
                FlagMessName = True
            Else
                If FlagMessName = True Then
                    FlagMessName = False
                    FlagMessLength = True
                Else
                    If FlagMessLength = True Then
                        FlagMessLength = False
                        FlagMessCalculator = True
                    End If
                End If
            End If
        End If
    Next I
 
 
End Function
Il faut savoir que ce genre de fonction j'en ai une dizaine pour traiter mon fichier, et certaines ont une dizaine de FLAG donc énormément de boucle IF...

Je sais pas si ma demande est intelligente mais je me suis dis que c'était important pour moi d'avoir un retour d’expérience de personnes pratiquant le VBA depuis plusieurs années.

Je vous remercie de vos retours.

Faern.