Optimisation de récupération de données
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:
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:
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 :
Citation:
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:
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.