IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Optimisation de récupération de données


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 32
    Par défaut 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 : 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.

  2. #2
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Bonjour

    Difficile de donner un avis pertinent sur une partie du produit final, néanmoins, pour l'interrogation 2.
    C'est possible avec cette construction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Function Import_Trame_Corp(ByVal Data As String, ByVal TAG As String) As tTrame
    L'affectation se ferait normalement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    XData = "BO_ 274 BSI_States_112: 8 BSI "
    XTag = "BO_ "
    ListeTrames(UBound(ListeTrames)) = Import_Trame_Corp(XData, XTag)
    Pour l'interrogation 3. A priori les expressions régulières (RegExp) sont assez puissantes dans de telles traitements.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 32
    Par défaut
    Bonjour,

    Super je ne connaissais pas les expressions régulières et ça a l'air vraiment puissant.

    Par contre est il possible en RegExp d'incrémenter des groupes à l'infini ?
    Par exemple j'ai la chaine de caractères :
    "AAA","BBB","CCC","DDD","..."
    Et j'aimerai obtenir ce résultat :
    Groupe 1 : AAA
    Groupe 2 : BBB
    Groupe 3 : CCC
    Groupe 4 : DDD
    Mais je ne peux pas prédire le nombre de groupes que j'aurai.

    Parce que ce code par exemple ne scinde pas les groupes en plusieurs groupes :
    (Je sais je sors un peu du cadre du topic et je m'en excuse.)

    Pour le point 1 ça te semble correct de procéder de cette manière ?

  4. #4
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Bonjour

    Pour ce cas, le Split de vba fera l'affaire.

    Sinon, pour les regexp, regarde du coté de Execute

    Un lien utile pour avoir une idée, la difficulté est dans le choix du pattern adéquat
    http://cafeine.developpez.com/access/tutoriel/regexp/

Discussions similaires

  1. Réponses: 4
    Dernier message: 05/04/2004, 10h09
  2. Réponses: 2
    Dernier message: 20/02/2004, 08h47
  3. [ DB2] => [ORACLE] Récupération de données
    Par LeDid dans le forum DB2
    Réponses: 3
    Dernier message: 25/06/2003, 17h10
  4. Réponses: 13
    Dernier message: 20/03/2003, 08h11
  5. [XMLRAD] récupération de donnée
    Par Mitch79 dans le forum XMLRAD
    Réponses: 7
    Dernier message: 30/01/2003, 15h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo