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 :
Y a t'il une meilleure façon de procédé ? L'utilisation de module de classe (Je maitrise peu) ?
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
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.
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.
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
3ème interrogation :
J'ai gardé le pire pour la fin. Voici donc un exemple de ligne que j'exploite :
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.BO_ 274 BSI_States_112: 8 BSI
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...
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
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.
Partager